nginx django suburl не работает
Я пытаюсь настроить Django под какой-то suburl, скажем, /myproject
, с nginx и uwsgi. Тем не менее, я не могу заставить его работать. Все, что я пытаюсь, кажется, что uwsgi_modifier1 30;
опция не работает. Я всегда получаю двойной путь, а не localhost:8000/myproject
, Я получил localhost:8000/myproject/myproject
Что мне не хватает? Вот соответствующие файлы:
Джанго urls.py
from django.conf.urls import patterns, include, url
from django.http import HttpResponse
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
url(r'^$', lambda x: HttpResponse('Hello world'), name='home'),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
Я ничего не изменил в django settings.py по умолчанию, кроме добавления информации о БД. А вот и файл nginx conf:
upstream mydjango {
server unix:///home/username/www/myproject/c.sock;
}
server {
listen 8000;
server_name localhost;
location /myproject/ {
uwsgi_pass mydjango;
include /home/username/www/myproject/uwsgi_params;
uwsgi_param SCRIPT_NAME /myproject;
uwsgi_modifier1 30;
}
}
и я запускаю uwsgi из командной строки сейчас:
uwsgi --socket c.sock --module myproject.wsgi --chmod-socket=666
Я не нахожу никаких ошибок в журналах, только 404, потому что нет никакого nginx conf для пути /
на 8000
порт, но нет django
URL-правило, чтобы соответствовать /myproject/myproject/
или. Так где же моя ошибка? Если это уместно, я пытаюсь это сделать на Debian Wheezy, nginx, последняя из mainline, python-3.3.2
2 ответа
Вы пытались использовать rewrite
вместо uwsgi_modifier1
?
...
location /myproject {
rewrite /myproject(.*) $1 break;
include /home/username/www/myproject/uwsgi_params;
uwsgi_pass mydjango;
}
...
Я получил это работает! Трюк состоял в том, чтобы рассказать Django о пути с помощью FORCE_SCRIPT_PATH, а также изменить статические пути. Для меня это решение достаточно хорошее, так как suburl настраивается только в локальных настройках Django и в nginx.conf.
Ubuntu 14.04 + Django 1.8 + uwsgi 1.9.17.1 + nginx 1.4.6
nginx.conf:
server {
listen 80;
server_name 192.168.1.23 firstsite.com www.firstsite.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /1/static {
root /home/ubuntu/firstsite;
}
location /1 {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /1;
uwsgi_modifier1 30;
uwsgi_pass unix:/home/ubuntu/firstsite/firstsite.sock;
}
}
Добавьте три строки в Django firstsite/settings.py:
FORCE_SCRIPT_NAME = '/1'
ADMIN_MEDIA_PREFIX = '%s/static/admin/' % FORCE_SCRIPT_NAME
STATIC_URL = '%s/static/' % FORCE_SCRIPT_NAME
Для полноты, вот мой uwsgi firstsite.ini, использующий virtualenv в ~home/Env:
[uwsgi]
project = firstsite
base = /home/ubuntu
chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application
master = true
processes = 5
socket = %(base)/%(project)/%(project).sock
chmod-socket = 664
vacuum = true