我无论如何也想不出如何使用 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!')),
)
尝试访问 localhost:8080/myproject/hello 出现 404 错误。我尝试了以下所有组合,但均未成功:
- 评论/取消评论
fastcgi_param PATH_INFO $fastcgi_script_name;
- 评论/取消评论
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
FORCE_SCRIPT_NAME = '/myproject/'
在settings.py中设置。
答案1
我自己也遇到了同样的问题——事实证明,你提供的链接Django 变更文档是解决问题的关键。
正如文档所解释的那样, Django > 1.0 使用SCRIPT_NAME
和PATH_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 不会考虑SCRIPT_NAME
在 URL 前面添加 (想想settings.LOGIN_URL
, settings.MEDIA_URL
)。
这可能很明显,但也要确保您有另一个指向静态和管理媒体的位置。
答案2
我遇到了与 Nginx 和 Gunicorn 而不是 fastcgi 相关的问题。
我在这里写下了我的发现:
http://albertoconnor.ca/blog/2011/Sep/15/hosting-django-under-different-locations
结果是您可以使用 proxy_set_header 将 SCRIPT_NAME 标头直接设置到 HTTP 标头中。
答案3
我认为问题出在你的 django 设置上,而不是 nginx 和 fastcgi 设置上。你的 url 定义为http://主机名.域名.tld/hello并不是http://主机名.domain.tld/myproject/hello
因此,就 django 而言,请求与已映射的任何 url 都不匹配。
请在您的 urls.py 中尝试以下内容:urlpatterns = patterns('', (r'^myproject/hello$', lambda request: HttpResponse('Hello world!')),
高血压
马丁·P
答案4
对于 Django 1.6<,根据 ServerFault 上的其他线程,您不应该设置 SCRIPT_NAME 变量,这个应该是'',并且您应该只使用 $fastcgi_script_name 变量设置 PATH_INFO。
对于 Django 1.6> 根据变化...此设置不再需要,https://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#ChangedthewayURLpathsaredetermined.I已注释掉 fastcgi_params(在 Debian 类情况下)或 nginx.conf(RHEL 情况下)中的路径信息和脚本名称行