UWSGI、Django、nginx cookie 问题 - 导致 405 错误

UWSGI、Django、nginx cookie 问题 - 导致 405 错误

我通过 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 缓冲区需要大于这个值是有道理的。

相关内容