我有一个简单的 Django 应用程序,我正在使用它来测试使用 Nginx、FastCGI(在撰写本文时使用最新版本的 flup)和 daemontools 的新部署策略。
基本上,问题是,如果我访问 domain.com,主页会正确显示,但如果我访问 domain.com/example/,它仍然会显示主页。在我看来,这似乎是 FastCGI 的问题,但我完全被难住了。无论我访问哪个页面,它总是显示主页。没有错误,什么都没有。就像它总是默默地返回相同的页面,无论 URL 是什么。
nginx 错误日志中根本没有显示任何内容,因此没有任何帮助。该项目使用开发服务器 100% 完美运行,但在服务器上却失败了。
我的daemontools运行文件如下:
#!/usr/bin/env bash
source /envs/domain.com/bin/activate
PROJ_DIR=/project
exec envuidgid simon python $PROJ_DIR/manage.py \
runfcgi method=threaded minspare=1 maxspare=2 host=127.0.0.1 \
port=9001 pidfile=$PROJ_DIR/proj.pid daemonize=false
我的 nginx 配置:
server {
listen 80;
server_name domain.com;
rewrite ^/(.*) http://www.domain.com/$1 permanent;
}
server {
listen 80;
server_name www.domain.com;
access_log /domain.com/logs/access.log;
error_log /domain.com/logs/error.log;
root /domain.com/public_html;
index index.html;
location / {
try_files $uri @django;
}
location /static {
alias /project/static;
}
location /media {
alias /project/media;
}
location @django {
include /opt/nginx/conf/fastcgi_params;
fastcgi_pass 127.0.0.1:9001;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}
}
如能提供任何帮助我将非常感激:)。
答案1
你有什么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;
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_script_name;
还设置在settings.py
:
FORCE_SCRIPT_NAME = ''
这是其中一种方法。您也可以保留FORCE_SCRIPT_NAME
默认设置,并通过 nginx 配置所有内容。