Elastic Beanstalk 运行 mod_wsgi 多进程导致 302 循环的 Django 应用程序

Elastic Beanstalk running mod_wsgi Django app with multi processes causing 302 loop

我已经调查了一段时间,所有文档似乎都说这是可能的,但每当我将 elastic beanstalk mod_wsgi NumProcesses 配置增加到 [=20 以上时=],我们的管理站点无法访问。

我在使用默认 django 应用程序进行测试时创建了一个缩减,但该行为仍然存在。我也尝试在本地复制,但是我的 apachemod_wsgi 配置无法复制问题。

基本上,我所看到的是,每次尝试登录都会导致 302 Found redirect 返回登录页面。我已经从数据库中清除了会话,并且我可以确认应用程序在登录期间创建了一个新条目 POST,但用户仍然被定向回登录页面(请参阅下面的配置和日志)。我们还在 Elastic Beanstalk 个实例上配置了负载均衡器和粘性会话。

这是我们 .ebextensions

中包含的 python 配置
option_settings:
  "aws:elasticbeanstalk:container:python":
    WSGIPath: site/settings/wsgi/__init__.py
    NumProcesses: 4
    NumThreads: 15

这是从实例

中提取的结果 wsgi.conf
WSGIPythonHome /opt/python/run/baselinenv
WSGISocketPrefix run/wsgi
WSGIRestrictEmbedded On

<VirtualHost *:80>

Alias /static/ /opt/python/current/app/site/static/
<Directory /opt/python/current/app/site/static/>
Order allow,deny
Allow from all
</Directory>


WSGIScriptAlias / /opt/python/current/app/site/settings/wsgi/__init__.py


<Directory /opt/python/current/app/>
  Require all granted
</Directory>

WSGIDaemonProcess wsgi processes=4 threads=15 display-name=%{GROUP} \
  python-path=/opt/python/current/app:/opt/python/run/venv/lib64/python3.4/site-packages:/opt/python/run/venv/lib/python3.4/site-packages user=wsgi group=wsgi \
  home=/opt/python/current/app
WSGIProcessGroup wsgi
</VirtualHost>

这是显示重定向的 access_log 的截图

::1 - - [05/Jun/2017:13:26:18 +0000] "POST /admin/login/?next=/admin/ HTTP/1.1" 302 -
::1 - - [05/Jun/2017:13:26:18 +0000] "GET /admin/ HTTP/1.1" 302 -
::1 - - [05/Jun/2017:13:26:18 +0000] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1650

现在,以下一组配置和信息取自我的本地安装。

# wsgi.conf

WSGIVerboseDebugging 'On'
WSGIPythonHome /usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7
WSGISocketPrefix /tmp/wsgi
WSGIRestrictEmbedded On

<VirtualHost *:80>

Alias /static/ /Users/www/app/site/static/
<Directory /Users/www/app/site/static/>
Order allow,deny
Allow from all
</Directory>

WSGIProcessGroup _www
WSGIScriptAlias / /Users/www/app/site/settings/wsgi/__init__.py \
        process-group=_www


<Directory /Users/www/app/>
  Require all granted
</Directory>

WSGIDaemonProcess _www processes=4 threads=15 display-name=%{GROUP} group=_www user=_www \
  python-path=/Users/www/app:/usr/local/lib/python2.7 \
  home=/Users/www/app/site
</VirtualHost>

预计access_log

::1 - - [05/Jun/2017:23:27:48 +1000] "POST /admin/login/?next=/admin/ HTTP/1.1" 302 -
::1 - - [05/Jun/2017:23:27:48 +1000] "GET /admin/ HTTP/1.1" 200 2783

我的问题是,为什么一个有效,另一个产生循环?我可以在 WSGIScriptAlias 上看到一个选项,但在 elastic beanstalk 配置上不可用,文档仍然说这是可行的。我在这里错过了什么?为什么有多个进程会导致此问题?

补充说明

失败 mod_wsgi 版本 3.5

工作 mod_wsgi 版本 4.5.15

我还能够让我的本地 wsgi 应用程序与 python 3.6

一起使用

一段时间后,我在 apache error_log

中找到了一个 Session data corrupted 条目

事实证明,生成 SECRET_KEY 的代码是在生产环境中随机分配的。

意思是,当请求传递给另一个进程时,会话密钥不匹配,将用户注销并将返回到登录页面。因此 302 Found 循环。

觉得这很有帮助 Django Login/Session Not Sticking