Django和Linux,端口转发

时间:2012-10-24 23:15:29

标签: django linux facebook port

我正在开发我的第一个Django应用程序,我安装了allauth以允许openid登录。 我正在尝试使用no-ip dns来避免动态ip的问题,在facebook上注册我的应用程序并从我的机器进行测试。但我不知道如何让我的django测试服务器在端口80上从外部可见。 如果我使用sudo强制它,它给我带来了登录postgrel数据库的问题,但如果我不使用sudo,它说我不能使用该端口(如果apache关闭也是如此)。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

一种方法是在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()

答案 1 :(得分:1)

我会使用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提供给整个互联网)。如果你想对/ etc / hosts做任何事情,你可能还需要更改server_name,以使你的网站认为它在其他地方。

sudo service nginx start你将开展业务。注意,启动后可能需要手动启动nginx;我不认为默认是每次启动它都会启动。

答案 2 :(得分:0)

将端口80“重定向”到端口8000

如果不使用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(如果需要,编辑界面)

替代解决方案

但是,您可以查看此问题:Is there a way for non-root processes to bind to "privileged" ports on Linux?,表示您的问题的另一种解决方案。

请注意与解释语言有关的问题(例如python)。

一句警告

这显然仅用于开发目的。要运行您的应用程序,您应该使用nginx + gunicorn或apache + mod_wsgi。