我通过 uwsgi 和 nginx 运行 django,每当我的应用程序尝试设置 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。我已更新问题以反映这一点。
答案1
好的,看来将 uwsgi 缓冲区大小增加到 16k 已经阻止了错误。我猜 django 消息 cookie 太大了?我不确定切换到会话存储或增加缓冲区哪种解决方案最好,但就是这样。
我的 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 消息文档,
如果 Cookie 数据大小超过 4096 字节,旧消息将被删除。
所以我猜测 uwsgi 缓冲区需要大于这个值是有道理的。