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

标签 django nginx fastcgi

我一辈子都想不通如何使用Nginx/fastcgi在非根目录下部署django站点,例如http://localhost:8080/myproject/代替http://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!')),

)

尝试访问http://localhost:8080/myproject/hello会给出404。我尝试了以下所有组合的尝试均未成功:
  • 注释/取消注释fastcgi_param PATH_INFO $fastcgi_script_name;
  • 注释/取消注释fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  • 在settings.py中设置FORCE_SCRIPT_NAME = '/myproject/'
  • 最佳答案

    我自己刚刚解决了同一问题-事实证明,您在ServerFault上提供的指向Django change doc的链接是解决问题的关键。

    如文档所述,Django> 1.0使用SCRIPT_NAMEPATH_INFO路由URL。因此,我接受了它,然后就运行了。对于您想 Root 于mydomain.com/myproject/的名为“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则不认为URL上必须附加SCRIPT_NAME(请考虑settings.LOGIN_URLsettings.MEDIA_URL)。

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

    关于django - 使用Nginx/Fastcgi在子URL下部署django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3400782/

    相关文章:

    python - 如何使用 Django 将图像流式传输到浏览器

    django - 我可以在 Django Admin 索引中显示每个人的最后操作吗?

    django - 在 Django 的主页上显示模型的最新帖子

    NGINX 入口 Controller 返回 502,后端应用程序 pod 中没有日志

    ruby - nginx,乘客只显示根页面,所有其他路线都失败

    python - 不明白为什么我不能在 Django 中使用 use cx_Oracle

    nginx - http2模块nginx不工作

    php - FastCGI下运行时如何在多个PHP进程之间共享APC缓存?

    fastcgi - 如何确定 PHP-FPM 进程中正在执行哪个脚本

    magento - Nginx + PHP-FPM + Magento 的 FastCGI 缓存配置