Nginx fastcgi 与 django 的问题(url 中有双斜杠?)

Nginx fastcgi 与 django 的问题(url 中有双斜杠?)

我正在部署我的第一个 django 应用程序。通过部署 php-fpm,我熟悉 nginx 和 fastcgi。我无法让 python 识别 URL。我也不知道如何进一步调试。我欢迎解决此问题的方法和调试 fastcgi 问题的技巧。

目前,无论 URL 如何,我都会得到一个 404 页面,并且由于某种原因,双斜线http://www.site.com/admin/

Page not found (404)
Request Method: GET
Request URL:    http://www.site.com/admin//

我的 urls.py 来自调试输出 - 在开发服务器中工作。

Using the URLconf defined in ahrlty.urls, Django tried these URL patterns, in this order:
^listings/
^admin/
^accounts/login/$
^accounts/logout/$

我的 nginx 配置

server {
       listen   80;
       server_name  beta.ahrlty.com;
       access_log  /home/ahrlty/ahrlty/logs/access.log;
       error_log  /home/ahrlty/ahrlty/logs/error.log;

       location /static/ {
               alias  /home/ahrlty/ahrlty/ahrlty/static/;
               break;
       }

       location /media/ {
               alias /usr/lib/python2.6/dist-packages/django/contrib/admin/media/;
               break;
       }

       location / {
               include /etc/nginx/fastcgi_params;
               fastcgi_pass 127.0.0.1:8001;
               break;
       }
}

和我的 fastcgi_params

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

fastcgi_param  PATH_INFO          $fastcgi_script_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

最后,我使用 django 的 manage.py 从命令行运行 fastcgi。

python manage.py runfcgi method=threaded host=127.0.0.1 port=8080 pidfile=mysite.pid minspare=4 maxspare=30 daemonize=false

我很难调试这个。有什么东西引起了别人的注意吗?

笔记

  • nginx 版本:nginx/0.7.62
  • Django svn trunk rev 13013

答案1

也许可以看看 django 文档http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#ChangedthewayURLpathsaredetermined. 对于我类似的问题(但使用 lighttpd)的解决方案是

FORCE_SCRIPT_NAME=""

在我的 settings.py 中也给出

FORCE_SCRIPT_NAME="/"

尝试一下!

答案2

我知道保留 SCRIPT_NAME 会给我带来各种各样的问题。

我生产和测试中的 fastcgi_params 是:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  PATH_INFO          $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

其余一切几乎完全相同。

答案3

我只是删除了字符串

fastcgi_param  SCRIPT_NAME  $fastcgi_script_name;

从我的 nginx 配置文件中,并始终开始工作。

(nginx 0.7.65,Django 1.4)

相关内容