我不知道如何在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!')),
)
试图访问本地主机:8080 / myproject / hello给出了404。我试过所有组合的失败:
fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; FORCE_SCRIPT_NAME = '/myproject/' 。 刚刚通过自己的同一个问题 – 事实certificate,您提供给Django更改文档的链接是解决问题的关键。
Django> 1.0使用SCRIPT_NAME和PATH_INFO路由URL,如文档解释。 所以我拿了它,并与它一起跑。 对于一个名为“myproject”的项目,您可以在mydomain.com/myproject/上find它,试试这个。
location ~ /myproject/(.*)$ { fastcgi_pass 127.0.0.1:8080; fastcgi_param PATH_INFO /$1; SCRIPT_NAME /myproject; }
我在另一个站点范围的configuration文件中的其余的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 (think settings.LOGIN_URL , settings.MEDIA_URL )。
这可能是显而易见的,但也要确保你有另一个位置指向你的静态和pipe理媒体。
我遇到了与Nginx和Gunicorn相关的问题,而不是fastcgi。
我在这里写下了我的发现:
http://albertoconnor.ca/blog/2011/Sep/15/hosting-django-under-different-locations
结果是您可以使用proxy_set_header将SCRIPT_NAME标头直接设置到HTTP标头中。
我相信问题在于你的django设置,而不是nginx和fastcgi设置。 您将url定义为http://hostname.domain.tld/hello,而不是http://hostname.domain.tld/myproject/hello
所以就django而言,请求不匹配任何url已映射。
请在您的urls.py中尝试以下内容:urlpatterns = patterns('',(r'^ myproject / hello $',lambda request:HttpResponse('Hello world!')),
HTH
MartinP
对于Django 1.6 <根据ServerFault上的其他线程,您不应该设置SCRIPT_NAMEvariables,这个variables应该是'',您应该只设置PATH_INFOvariables$ fastcgi_script_name。
对于Django 1.6>根据更改…此设置不再是必要的, https://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#ChangedthewayURLpathsaredetermined.I已经注释掉了path信息和脚本名称行在fastcgi_params(在Debian般的情况)或者在nginx.conf(RHEL情况下)