【问题标题】:uWSGI processes lose Django sessionsuWSGI 进程丢失 Django 会话
【发布时间】:2013-07-18 14:00:22
【问题描述】:

我只是浪费了几个小时没有真正的解决方案,问题是: 我登录 Django admin 后立即或单击几下后被抛出。

我在所有设置和配置中查找了一段时间。到目前为止唯一的线索来自 uwsgi 日志文件,例如:

www.example.com [pid: 20047|app: 0|req: 1120/2060] 217.9.101.34 () {42 vars in 841 bytes} [Thu Jul 18 15:27:35 2013] GET /admin/ => ...
www.example.com [pid: 20047|app: 0|req: 1122/2063] 217.9.101.34 () {40 vars in 786 bytes} [Thu Jul 18 15:27:37 2013] GET /admin/auth/ => ...
www.example.com [pid: 20047|app: 0|req: 1124/2066] 217.9.101.34 () {40 vars in 801 bytes} [Thu Jul 18 15:27:39 2013] GET /admin/auth/user/ => ...
www.example.com [pid: 20047|app: 0|req: 1125/2067] 217.9.101.34 () {40 vars in 740 bytes} [Thu Jul 18 15:27:39 2013] GET /admin/jsi18n/ => ...
www.example.com [pid: 19082|app: 0|req: 947/2072] 217.9.101.34 () {42 vars in 841 bytes} [Thu Jul 18 15:27:41 2013] GET /admin/ => ...
www.example.com [pid: 20047|app: 0|req: 1128/2081] 217.9.101.34 () {42 vars in 841 bytes} [Thu Jul 18 15:27:44 2013] GET /admin/auth/

前几个请求具有相同的进程 ID,这就是我登录的位置。然后另一个进程接受我的下一个请求,显然这个进程不知道我的会话并且我已注销。下一个请求再次具有原始 ID,但我的 cookie 已被重置。

我已经尝试了一切:再次设置项目,再次设置 uwsgi 配置,检查 nginx,重新启动一切,但没有任何帮助。它也可能不是 cookie 错误,因为它出现在多台计算机上的多个浏览器上。毕竟,cookie 已设置好,会话已记录到数据库中。

堆栈是 Django 1.5.1、Python 2.7、virtualenv、buildout、MySQL 5.5、nginx、uwsgi、Ubuntu 12.04

有什么想法吗?

编辑:

这是 uwsgi 配置:

[uwsgi]
#vhost = true  # tried to see if that helps
plugins = python
socket = /tmp/example.com.sock
master = true
enable-threads = true
processes = 8
cheaper = 2
max-requests=1000
reload-on-rss=110
vacuum=True
harakiri=20
buffer-size=16384  # added to try if that helps
wsgi-file = /var/www/blabla/.../django.wsgi
virtualenv = /var/www/blabla
chdir = /var/www/blabla/...
touch-reload = /var/www/blabla/.../django.wsgi

【问题讨论】:

  • 使用 gunicorn。最好的东西。
  • 您是否在 Django 应用程序中对身份验证或中间件做任何特别的事情,或者只是标准的东西?
  • @DanielRoseman 只是标准的东西,它也为我工作了好几天,而其他用户抱怨,现在在测试时我经常收到这个错误......

标签: python django nginx uwsgi


【解决方案1】:

您检查过您的 SESSION_ENGINE 吗?例如,如果您将其设置为使用 django 缓存并将其设置为 locmem:// 您将遇到此类问题

另一个(即使很难发生)问题(如果您处于 --lazy/--lazy-apps 模式)可能是带有旧代码副本的进程,您是否尝试过重新加载整个实例?

【讨论】:

  • 我没有更改默认的 SESSION_ENGINE。我还尝试打开和关闭惰性模式以查看它是否有作用,但它没有。我还停止了所有 uwsgi 进程并启动了几次。
  • 每个日志行之前的主机名有点可疑:您是否处于虚拟主机模式?如果是,是否可以按需加载应用程序?如果是,您确定您的所有模块都对多口译员友好吗?
  • 按需是什么意思?我只是放置 uwsgi 配置,然后执行 service uwsgi start。
  • 我刚刚看到你的配置,一切正常,只是为了确定:你运行的是哪个版本的 uWSGI?你可以在服务器上运行“ps aux”来检查是否有 uwsgi 进程在运行(停止后)?
  • 我有 Ubuntu 软件包:1.0.3+dfsg-1ubuntu0.1,停止后,有时进程会继续运行,我需要执行 killall... 我知道这似乎是Ubuntu 上的已知错误
【解决方案2】:

默认情况下,django 将会话存储在数据库中,因此您的问题很可能是由于这个错误:https://code.djangoproject.com/ticket/20537

考虑更新到 uwsgi >= 1.2.6

【讨论】:

    猜你喜欢
    • 2011-08-12
    • 2020-01-09
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2010-12-29
    • 2015-04-18
    • 1970-01-01
    • 2013-08-10
    相关资源
    最近更新 更多