使用Nginx/Fastcgi在子URL下部署django
我一辈子都不知道如何使用Nginx/fastcgi在非根位置下部署django站点,例如代替;我看到的所有示例都假设Apache或安装在站点的根目录下。下面是我的使用Nginx/Fastcgi在子URL下部署django,django,nginx,fastcgi,Django,Nginx,Fastcgi,我一辈子都不知道如何使用Nginx/fastcgi在非根位置下部署django站点,例如代替;我看到的所有示例都假设Apache或安装在站点的根目录下。下面是我的nginx.conf的相关部分: server { listen 8080; server_name localhost; location /myproject/ { # host and port to fastcgi server fastcgi_pass 127.0.0.
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;
}
}
和一个最小的url.py
:
from django.http import HttpResponse
from django.conf.urls.defaults import patterns
urlpatterns = patterns('',
(r'^hello$', lambda request: HttpResponse('Hello world!')),
)
尝试访问会导致404错误。我尝试了以下所有组合,但均未成功:
- 注释/取消注释
fastcgi\u参数路径\u信息$fastcgi\u脚本\u名称代码>
- 注释/取消注释
fastcgi_参数SCRIPT_NAME$fastcgi_SCRIPT_NAME代码>
- 在settings.py中设置
FORCE\u SCRIPT\u NAME='/myproject/'
- 端口80上的Apache(主web服务器)
- 本地主机上的nginx:3033(随机端口)
- 本地主机上的manage.py fastcgi:3034
- 我自己也遇到了子URL问题,因此被你的问题绊倒了。我的服务器使用Apache作为其主服务器,因此我的配置不同,但它可以工作。也许这会对某人有所帮助:
我认为您遇到的问题是由于nginx配置造成的,而不是Django部署的问题。您可能想尝试一下我发布的解决方案是否适合您。我自己也解决了同样的问题-事实证明,您在ServerFault上提供的指向的链接是解决问题的关键 Django>1.0使用
SCRIPT\u NAME
和PATH\u 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;
}
}
使用相同的url.py。到目前为止,我遇到的唯一问题是保持干燥的小问题,例如settings.py需要绝对URL,Django不想在URL上预先添加SCRIPT\u NAME
(想想settings.LOGIN\u URL
,settings.MEDIA\u URL
)
这可能是显而易见的,但也要确保您有另一个指向静态和管理介质的位置。试试这个配置
location /myproject {
fastcgi_split_path_info ^(/myproject)(.*)$;
fastcgi_pass 127.0.0.1:8080;
include fastcgi_params;
}
其中,fastcgi_参数文件包含
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;
这对我有用
请参阅有关@gsakkis的文档,这对您有帮助吗?它对我有帮助。。。我使用此方法在nginx.conf中的同一服务器{}上托管了两个WebApp。但我的问题是两者都需要不同的静态和媒体url。。。在这里做什么??
location /myproject {
fastcgi_split_path_info ^(/myproject)(.*)$;
fastcgi_pass 127.0.0.1:8080;
include 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;