У меня есть простое приложение 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;
}
}
Любая помощь будет очень высоко ценится :).
Что у тебя в 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.