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

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

Я не могу, хоть убей, понять, как развернуть сайт django в некорневом месте с помощью Nginx / fastcgi, например 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. Я безуспешно пробовал все комбинации:

Я сам решил ту же проблему - оказалось, что ссылка, которую вы указали на 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).

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

Я столкнулся с связанной проблемой с Nginx и Gunicorn вместо fastcgi.

Я написал о своих выводах здесь:

http://albertoconnor.ca/blog/2011/Sep/15/hosting-django-under-different-locations

В результате вы можете использовать proxy_set_header, чтобы установить заголовок SCRIPT_NAME непосредственно в заголовки HTTP.

Я считаю, что проблема заключается в вашей настройке django, а не в настройке nginx и fastcgi. У вас есть URL-адреса, определенные как http: //hostname.domain.tld/hello и нет http: //hostname.domain.tld/myproject/hello

Итак, что касается django, запрос не соответствует ни одному сопоставленному URL-адресу.

Пожалуйста, попробуйте следующее в вашем urls.py: urlpatterns = patterns ('', (r '^ myproject / hello $', лямбда-запрос: HttpResponse ('Hello world!')),

HTH

MartinP

Для Django 1.6 <согласно другим потокам на ServerFault вы не должны устанавливать переменную SCRIPT_NAME, она должна быть '', и вы должны установить только PATH_INFO с переменной $ fastcgi_script_name.

Для Django 1.6> в соответствии с изменениями ... эти настройки больше не нужны, https://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#ChangedthewayURLpathsredetermined.I закомментировали строки информации о пути и имени сценария в fastcgi_params (в случаях, подобных Debian) или в nginx.conf (случаи RHEL)