【问题标题】:Elastic Beanstalk running mod_wsgi Django app with multi processes causing 302 loopElastic Beanstalk 运行带有多个进程的 mod_wsgi Django 应用程序导致 302 循环
【发布时间】:2017-11-06 07:51:48
【问题描述】:

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

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

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

这是来自我们的.ebextensionspython 包含的配置

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_wsgi4.5.15

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

【问题讨论】:

    标签: python django amazon-elastic-beanstalk mod-wsgi


    【解决方案1】:

    一段时间后,我在apache error_log 中找到了一个Session data corrupted 条目

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

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

    发现这很有帮助Django Login/Session Not Sticking

    【讨论】:

      猜你喜欢
      • 2014-07-05
      • 1970-01-01
      • 2015-11-19
      • 2019-08-28
      • 2016-09-05
      • 2018-08-21
      • 2019-06-11
      • 2021-01-17
      • 2020-09-29
      相关资源
      最近更新 更多