Я запускаю django через uwsgi и nginx, и всякий раз, когда мое приложение пытается установить файл cookie, nginx отображает ошибку 405. Приложение отлично работает с apache, runserver или gunicorn, и uwsgi обслуживает его нормально, за исключением проблемы перенаправления.
Я запускаю uwsgi вот так:
uwsgi --master --http-socket :8082 \
--wsgi-file /var/django/mysite/apache/live.wsgi \
--touch-reload /var/django/mysite/apache/live.wsgi
Мой файл live.wsgi выглядит так:
import os, sys
PROJECT_ROOT = '/var/django/mysite/'
directory = os.path.join(PROJECT_ROOT, 'src')
if not directory in sys.path:
sys.path.insert(0, directory)
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
nginx передает запросы на 127.0.0.1:8082 для этого сайта.
ОБНОВЛЕНИЕ: как ни странно, проблема, похоже, вызвана фреймворк сообщений django - удаление django.contrib.messages.middleware.MessageMiddleware
останавливает ошибку. Это наводит меня на мысль, что это не имеет ничего общего с перенаправлениями, а имеет какое-то отношение к сообщению, которое создается при сохранении объекта в администраторе django.
ОБНОВЛЕНИЕ 2: Дальнейшее копание показывает, что, похоже, проблема с установкой файлов cookie - переключение структуры сообщений на использование серверной части сеанса останавливает ошибки. Я все еще не понимаю, почему стек uwsgi / nginx не позволяет django устанавливать файлы cookie. Я обновил вопрос, чтобы отразить это.
Итак, похоже, что увеличение размера буфера uwsgi до 16k остановило ошибки. Я думаю, файл cookie сообщений django слишком велик? Я не уверен, какое решение лучше - переключиться на хранилище сеансов или увеличить буфер, но готово.
Моя команда uwsgi теперь выглядит так:
uwsgi --master --http-socket :8082 \
--wsgi-file /var/django/mysite/apache/live.wsgi \
--touch-reload /var/django/mysite/apache/live.wsgi \
--buffer-size 16384
Согласно django messages docs,
Старые сообщения удаляются, если размер данных cookie превышает 4096 байт.
Поэтому я думаю, что имеет смысл, что буфер uwsgi должен быть больше этого.