Развертывание django под суб-URL с помощью Nginx / Fastcgi

Я не могу, хоть убей, понять, как развернуть сайт django в некорневом расположении с помощью Nginx / fastcgi, например http://localhost:8080/myproject/ вместо http://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!')),

)

Попытка получить доступ к http://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.

person gsakkis    schedule 03.08.2010    source источник


Ответы (3)


Я сам столкнулся с той же проблемой - оказалось, что ссылка, которую вы предоставили на ServerFault, на Django change doc был ключом к решению проблемы.

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).

Это может быть очевидно, но также убедитесь, что у вас есть другое местоположение, указывающее на ваши статические и административные носители.

person Matt Luongo    schedule 09.02.2011
comment
@gsakkis, это тебе вообще помогло? - person Matt Luongo; 22.02.2011
comment
Это помогло мне ... Я разместил два веб-приложения на одном сервере {} в nginx.conf, используя этот метод. но моя проблема в том, что для обоих требуются разные статические и медиа-адреса ... что здесь делать ?? - person codeVerine; 18.02.2014

Попробуй эту конф

    location  /myproject {
    fastcgi_split_path_info ^(/myproject)(.*)$;
    fastcgi_pass 127.0.0.1:8080;
    include fastcgi_params;
}

где файл 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;

У меня это сработало.

см. документацию по fastcgi_split_path_info

person harish2704    schedule 17.09.2012

Наткнулся на ваш вопрос, так как у меня самого была проблема с суб-URL. Мой сервер использует Apache в качестве основного сервера, поэтому моя конфигурация отличается, но она работает. Может быть, это кому-нибудь поможет:

  • Apache на порту 80 (основной веб-сервер)
  • nginx на localhost: 3033 (случайный порт)
  • manage.py fastcgi на локальном хосте: 3034

Тогда конфигурация Apache выглядит так (прокси для nginx):

<Location /blogsite/>
    Order deny,allow
    Allow from all

    ProxyPass http://127.0.0.1:3033/
    ProxyPassReverse http://127.0.0.1:3033/
</Location>

А конфигурация сайта nginx такова:

server {
    listen 127.0.0.1:3033;
    server_name localhost;

    location / {
        fastcgi_pass 127.0.0.1:3034;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        fastcgi_pass_header Authorization;
        fastcgi_intercept_errors off;
    }

    access_log  /var/log/nginx/blogsite.access_log;
    error_log   /var/log/nginx/blogsite.error_log;
}

Я думаю, что проблема у вас как-то связана с конфигурацией nginx, а не с развертыванием Django. Вы можете попробовать, работает ли мое опубликованное решение для вас.

person AndiDog    schedule 03.12.2010