Я не могу, хоть убей, понять, как развернуть сайт 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. Я безуспешно пробовал все комбинации:
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
FORCE_SCRIPT_NAME = '/myproject/'
в settings.py.Я сам решил ту же проблему - оказалось, что ссылка, которую вы указали на 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)