2010-08-03 88 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