【问题标题】:Django + Gunicorn + Nginx: Bad Request (400) in Debug=TrueDjango + Gunicorn + Nginx:Debug=True 中的错误请求(400)
【发布时间】:2015-07-29 20:42:22
【问题描述】:

我正在尝试使用 Django、nginx 和 gunicorn 运行我的服务器。在开发服务器上,一切正常。但是在生产服务器上,gunicorn 总是返回一个错误请求 (400)。

我知道我需要设置我的ALLOWED_HOSTS 变量,我做到了。我尝试了正确的域、星号,甚至将 DEBUG 设置为 True。但是,它始终是错误请求 (400)。

这是我的 nginx 配置:

server {
    listen 80;

    location /static {
        alias /home/username/sites/sub.domain.example.com/static;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:8000;
    }
}

我的wsgi-prod.py 文件:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings_prod")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

settings_prod.py 文件(缩短):

DEBUG = False
ALLOWED_HOSTS=["*"]

我通过以下方式启动 gunicorn(使用 virtualenv):

gunicorn --bind 127.0.0.1:8000 app.wsgi_prod:application

当我使用 manage.py runserver --settings=app.settings_prod 启动服务器时,该站点是可访问的。 gunicorn 的错误日志什么都没有显示,访问日志只显示 400。静态内容确实有效。

【问题讨论】:

    标签: python django nginx gunicorn


    【解决方案1】:

    这为我解决了问题:

    location / {
        proxy_pass http://127.0.0.1:8081;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
    

    【讨论】:

      【解决方案2】:

      你应该告诉 Nginx 像这样将主机传递给 Gunicorn:

      proxy_set_header        Host            $host;
      

      此外,我还会传递这些值(示例),以便您可以访问请求的 IP:

      proxy_set_header        X-Real-IP       $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      

      如果您还没有这样做,请同时检查您的 Nginx 日志。 我希望这会有所帮助。

      编辑: 也尝试设置设置服务器名称,如:

      server_name     your_domain.com www.your_domain.com
      

      最后但并非最不重要的一点是尝试像这样设置您的环境(本例中的解决方案):

      os.environ['DJANGO_SETTINGS_MODULE'] = "app.settings_prod" 
      

      【讨论】:

      • 谢谢,但它仍然无法正常工作。 nginx 日志只显示 400。我在这里真的一无所知,因为我在开发服务器(包括 gunicorn)上做了同样的事情并且一切正常。
      • 尝试在服务器名中设置域... ??
      • 您是否在此服务器上运行多个站点?然后你必须在你的wsgi文件中设置像 os.environ['DJANGO_SETTINGS_MODULE'] = "app.settings_prod" 这样的环境......
      • 做到了!我只在服务器上运行一个站点,但尝试设置环境,以防万一。它有效。不过,我不知道为什么。
      • 我也遇到了这个问题,三个proxy_set_header 设置为我解决了这个问题
      猜你喜欢
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 2014-10-11
      • 1970-01-01
      相关资源
      最近更新 更多