我一辈子都想不通如何使用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;
FORCE_SCRIPT_NAME = '/myproject/'
。 最佳答案
我自己刚刚解决了同一问题-事实证明,您在ServerFault上提供的指向Django change doc的链接是解决问题的关键。
如文档所述,Django> 1.0使用SCRIPT_NAME
和PATH_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_URL
,settings.MEDIA_URL
)。这可能很明显,但还要确保您还有另一个指向静态和管理媒体的位置。
关于django - 使用Nginx/Fastcgi在子URL下部署django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3400782/