Назад | Перейти на главную страницу

Приложение Django отображает одну и ту же страницу независимо от посещенного URL

У меня есть простое приложение 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.