【问题标题】:Django and Linux, port forwardingDjango 和 Linux,端口转发
【发布时间】:2012-10-24 23:15:28
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

    标签: django linux facebook port


    【解决方案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()
    

    【讨论】:

    • 我认为这是更好的解决方案,但我收到此错误:OperationalError: FATAL: Peer authentication failed for user "xxx" [Wed Oct 24 19:28:44 2012] [error] [client 127.0 .0.1] 我不知道如何解决这个问题。我认为它来自我的 postgres 数据库。
    • 确实它看起来像 Postgres。根据您的情况,您可能需要基于密码的身份验证。
    • 我的配置中似乎发现了一个严重的问题。但是你的方法效果很好,所以被接受了!
    • 谢谢!祝你好运解决 PostgreSQL 身份验证。尝试在pg_hba.conf 中将peer 替换为md5。除非你真的想要对等身份验证。
    • 我真的希望他们没有从字面上复制所有那些 'xxx' 值并按原样使用它们。顺便说一句,将 Django 项目源代码粘贴在 DocumentRoot 下是个坏主意。 Apache 配置中的一项内容,人们可以下载您的代码,包括设置文件中的任何敏感信息。
    【解决方案2】:

    “重定向”端口 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。

    【讨论】:

    • 这应该是真正被接受的答案。有时,出于开发目的,您必须切入边缘,而不是使用臃肿的解决方案,例如运行额外的网络服务器
    【解决方案3】:

    我会使用 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可能需要开机后手动启动;我不认为默认是每次都在启动时启动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      相关资源
      最近更新 更多