2010-08-03 84 views
9

我不能为我的生活弄清楚如何在Nginx/fastcgi的非根位置下部署一个django站点,例如, http://localhost:8080/myproject/而不是http://localhost:8080/;我见过的所有例子都假定Apache或安装在网站的根目录。这里是我的nginx.conf的相关部分:使用Nginx/Fastcgi在一个sub-URL下部署django

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/'

回答

0

因为我有自己的子网址问题,您的问题出现了。我的服务器使用Apache作为其主服务器,所以我的配置不同,但它的工作原理。也许这将帮助别人:

  • 的Apache在端口80(主Web服务器)
  • nginx的在localhost:3033(随机端口)
  • 在localhost manage.py的FastCGI:3034

然后Apache的配置看起来像这样(代理nginx的):

<Location /blogsite/> 
    Order deny,allow 
    Allow from all 

    ProxyPass http://127.0.0.1:3033/ 
    ProxyPassReverse http://127.0.0.1:3033/ 
</Location> 

而且nginx的站点配置为:

server { 
    listen 127.0.0.1:3033; 
    server_name localhost; 

    location/{ 
     fastcgi_pass 127.0.0.1:3034; 
     fastcgi_param PATH_INFO $fastcgi_script_name; 
     fastcgi_param REQUEST_METHOD $request_method; 
     fastcgi_param QUERY_STRING $query_string; 
     fastcgi_param CONTENT_TYPE $content_type; 
     fastcgi_param CONTENT_LENGTH $content_length; 
     fastcgi_pass_header Authorization; 
     fastcgi_intercept_errors off; 
    } 

    access_log /var/log/nginx/blogsite.access_log; 
    error_log /var/log/nginx/blogsite.error_log; 
} 

我觉得你的问题是由于nginx配置不知何故,而不是真正的Django部署问题。您可能想尝试一下我发布的解决方案是否适合您。

7

刚刚通过相同的问题我自己 - 事实证明,你提供的ServerFault链接到Django change doc是解决问题的关键。

如doc解释的,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认为不要在URL上加上SCRIPT_NAME(认为是settings.LOGIN_URL,settings.MEDIA_URL)。

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

+0

@gsakkis,这样做是帮你呢? – 2011-02-21 21:20:39

+0

它帮助了我...我使用这种方法在nginx.conf中的同一台服务器上托管了两个webapps。但我的问题是需要不同的静态和媒体网址...在这里做什么? – codeVerine 2014-02-18 13:17:14

3

试试这个的conf

location /myproject { 
    fastcgi_split_path_info ^(/myproject)(.*)$; 
    fastcgi_pass 127.0.0.1:8080; 
    include fastcgi_params; 
} 

其中,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_path_info; 

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

它为我工作。

看文档中关于fastcgi_split_path_info