Django + Gunicorn + Nginx:Debug=True 中的错误请求 (400)
Django + Gunicorn + Nginx: Bad Request (400) in Debug=True
我正在尝试 运行 我的服务器与 Django、nginx 和 gunicorn。在开发服务器上,一切顺利。但是在生产服务器上,gunicorn 总是 returns 一个 Bad Request (400)。
我知道我需要设置 ALLOWED_HOSTS
变量,我做到了。我尝试了正确的域、星号,甚至将 DEBUG 设置为 True。但是,它总是 Bad Request (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。静态内容确实有效。
你应该像这样告诉 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"
这为我修复了它:
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"';
}
我正在尝试 运行 我的服务器与 Django、nginx 和 gunicorn。在开发服务器上,一切顺利。但是在生产服务器上,gunicorn 总是 returns 一个 Bad Request (400)。
我知道我需要设置 ALLOWED_HOSTS
变量,我做到了。我尝试了正确的域、星号,甚至将 DEBUG 设置为 True。但是,它总是 Bad Request (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。静态内容确实有效。
你应该像这样告诉 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"
这为我修复了它:
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"';
}