Nginx

django 的 Nginx fastcgi 問題(url 中的雙斜杠?)

  • June 28, 2012

我正在部署我的第一個 django 應用程序。我從部署 php-fpm 熟悉 nginx 和 fastcgi。我無法讓 python 辨識網址。我也不知道如何進一步調試。我歡迎這個問題的解決方案和調試 fastcgi 問題的提示。

目前,無論網址如何,我都會得到一個 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 主幹修訂版 13013

也許看看http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#ChangedthewayURLpathsaredetermined的 django 文件。我的類似問題(但使用 lighttpd)的解決方案是

FORCE_SCRIPT_NAME=""

在我的 settings.py 中。也給

FORCE_SCRIPT_NAME="/"

試一試!

我知道離開 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;

其他一切都幾乎相同。

引用自:https://serverfault.com/questions/134863