使用 Nginx/Fastcgi 在子 URL 下部署 django

使用 Nginx/Fastcgi 在子 URL 下部署 django

我无论如何也想不出如何使用 Nginx/fastcgi 在非根位置部署 django 站点,例如 localhost:8080/myproject/ 而不是 localhost:8080/;我见过的所有示例要么假设使用 Apache,要么安装在站点的根目录。以下是我的相关部分nginx.conf

server {
    listen 8080;
    server_name localhost;

    location /myproject/ {
        # host and port to fastcgi server
        fastcgi_pass 127.0.0.1:3030;

        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  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;
    }
}

并且最小的是urls.py

from django.http import HttpResponse
from django.conf.urls.defaults import patterns

urlpatterns = patterns('',
    (r'^hello$', lambda request: HttpResponse('Hello world!')),

尝试访问 localhost:8080/myproject/hello 出现 404 错误。我尝试了以下所有组合,但均未成功:

  • 评论/取消评论fastcgi_param PATH_INFO $fastcgi_script_name;
  • 评论/取消评论fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  • FORCE_SCRIPT_NAME = '/myproject/'在settings.py中设置。

答案1

我自己也遇到了同样的问题——事实证明,你提供的链接Django 变更文档是解决问题的关键。

正如文档所解释的那样, Django > 1.0 使用SCRIPT_NAMEPATH_INFO来路由 URL。所以我采用了它并运行了它。对于名为“myproject”的项目,如果您希望将其根植于 mydomain.com/myproject/,请尝试此操作。

location ~ /myproject/(.*)$ {
    fastcgi_pass 127.0.0.1:8080;
    fastcgi_param  PATH_INFO /$1;
    SCRIPT_NAME /myproject;
}

其余的 fastcgi 参数我在另一个站点范围的配置文件中。因此您的示例看起来应该类似于

server {
    listen 8080;
    server_name localhost;

    location /myproject/ {
        # host and port to fastcgi server
        fastcgi_pass 127.0.0.1:3030;

        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        /myproject;
        fastcgi_param  PATH_INFO          /$1;
        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;
    }
}

使用相同的 urls.py。到目前为止,我遇到的唯一问题是保持 DRY 的小麻烦,例如,settings.py 需要绝对 URL,而 Django 不会考虑SCRIPT_NAME在 URL 前面添加 (想想settings.LOGIN_URL, settings.MEDIA_URL)。

这可能很明显,但也要确保您有另一个指向静态和管理媒体的位置。

答案2

我遇到了与 Nginx 和 Gunicorn 而不是 fastcgi 相关的问题。

我在这里写下了我的发现:

http://albertoconnor.ca/blog/2011/Sep/15/hosting-django-under-different-locations

结果是您可以使用 proxy_set_header 将 SCRIPT_NAME 标头直接设置到 HTTP 标头中。

答案3

我认为问题出在你的 django 设置上,而不是 nginx 和 fastcgi 设置上。你的 url 定义为http://主机名.域名.tld/hello并不是http://主机名.domain.tld/myproject/hello

因此,就 django 而言,请求与已映射的任何 url 都不匹配。

请在您的 urls.py 中尝试以下内容:urlpatterns = patterns('', (r'^myproject/hello$', lambda request: HttpResponse('Hello world!')),

高血压

马丁·P

答案4

对于 Django 1.6<,根据 ServerFault 上的其他线程,您不应该设置 SCRIPT_NAME 变量,这个应该是'',并且您应该只使用 $fastcgi_script_name 变量设置 PATH_INFO。

对于 Django 1.6> 根据变化...此设置不再需要,https://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#ChangedthewayURLpathsaredetermined.I已注释掉 fastcgi_params(在 Debian 类情况下)或 nginx.conf(RHEL 情况下)中的路径信息和脚本名称行

相关内容