我正在开发我的第一个 Django 应用程序,我已经安装了 allauth 以允许 openid 登录。我正在尝试使用 no-ip dns 来避免动态 ip 的问题,以便在 facebook 上注册我的应用程序并在我的机器上进行测试。但我不知道如何让我的 django 测试服务器在端口 80 上从外部可见。如果我使用 sudo 强制它,它会给我登录到 postgrel 数据库的问题,但如果我不使用 sudo,它说我不能使用该端口(如果 apache 已关闭)。
感谢您的帮助。
一种方法是在 apache 中创建虚拟主机,用于mod_wsgi
与 Django 应用程序对话。
例子:
<VirtualHost *:80>
ServerName xxx.xxx.com
ServerAdmin webmaster@localhost
WSGIScriptAlias / /var/www/xxx/apache/xxx.wsgi
Alias /static/ /var/www/xxx/static/
DocumentRoot /var/www/xxx
LogLevel info
ErrorLog ${APACHE_LOG_DIR}/xxx-error.log
CustomLog ${APACHE_LOG_DIR}/xxx-access.log combined
</VirtualHost>
xxx.wsgi的内容:
import os, sys
apache_configuration = os.path.dirname(__file__)
project = os.path.dirname(apache_configuration)
workspace = os.path.dirname(project)
sys.path.append(workspace)
sys.path.append('/var/www/xxx')
os.environ['DJANGO_SETTINGS_MODULE'] = 'xxx.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
如果不使用 sudo,您将无法绑定到端口 80,它是一个受保护的端口,只有 root 可以绑定到。(就像任何低于 1024 的端口一样)
这是一个简单的 iptables 规则,它将对端口 8000 的请求转发到端口 80,因此您可以“假装”在端口 80 访问您的服务器,同时在端口 8000 服务它。
它仅适用于环回接口(例如,您在自己的计算机上与自己交谈),但这应该是您开发所需要的。
iptables -t nat -I OUTPUT --source 127.0.0.1 --destination 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8000
如果您需要它,对于外部客户,规则是:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8000
(根据需要编辑界面)
但是,您可以看看这个问题:非 root 进程是否可以绑定到 Linux 上的“特权”端口?,这表明您的问题的另一种解决方案。
请注意有关解释语言(例如python)的要点。
这显然仅用于开发目的。要运行您的应用程序,您应该使用 nginx + gunicorn 或 apache + mod_wsgi。
我会使用 nginx 代理通行证。在 Ubuntu 上,您所要做的就是sudo apt-get install nginx
, 然后sudo nano /etc/nginx/sites-available/default
. location /
将块更改为:
location / {
proxy_pass http://localhost:8080; #or whatever port you are using
proxy_set_header Host $host;
}
并取消注释该listen 80;
行并将其更改为listen 127.0.0.1:80
(这将防止您的开发站点意外地在端口 80 上被提供给整个互联网)。server_name
如果您想对 /etc/hosts 做任何事情,您可能还必须更改以使您的站点认为它在其他地方。
sudo service nginx start
你会做生意的。注意nginx可能需要开机后手动启动;我不认为默认设置是每次都在启动时启动。