URL 使用 Gunicorn、Nginx 和 Django 解决错误

URL resolution error using Gunicorn, Nginx, and Django

我只有在使用 Gunicorn 时才会出现奇怪的错误:

我有一个设置 Nginx + 一个具有以下配置的 django 项目:

location / {
  proxy_pass       http://127.0.0.1:8080;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header SCRIPT_NAME /;
}

当我使用 django 开发服务器 (1.7.5) 时:

./manage.py runserver 127.0.0.1:8080

一切正常。

但是当我运行

gunicorn -b :8080 --forwarded-allow-ips="*" --proxy-allow-from="*" app.wsgi

我只收到 404 错误(django 正在接收请求,因为我有调试消息)。

这些错误很奇怪,因为变量 urlpatterns (https://github.com/django/django/blob/1.7.5/django/views/debug.py#L1102) is not set. I only obtain the reason variable (https://github.com/django/django/blob/1.7.5/django/views/debug.py#L1119) 设置为:

{u'path': u'x/'}

如我所愿http://domain.something.com/x/

最头疼的是django自带的基础服务器工作正常...:(

删除

   proxy_set_header SCRIPT_NAME /;

来自 nginx 配置将完成这项工作。这就是 django 对待 SCRIPT_NAME header 的方式:当存在时,django 会在解析它时从 URL 的前面删除该值,并将其添加回 [=20 的前面=] 反转时。这样你就可以告诉 django 所有 urls 应该相对于某个目录而不触及你项目中的任何东西。 SCRIPT_NAME 应设置为不带尾随 / 因此您域的根目录的正确值为空字符串(或完全没有 SCRIPT_NAME)。