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
应用程序进行测试时创建了一个缩减,但该行为仍然存在。我也尝试在本地复制,但是我的 apache
和 mod_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
我已经调查了一段时间,所有文档似乎都说这是可能的,但每当我将 elastic beanstalk
mod_wsgi
NumProcesses
配置增加到 [=20 以上时=],我们的管理站点无法访问。
我在使用默认 django
应用程序进行测试时创建了一个缩减,但该行为仍然存在。我也尝试在本地复制,但是我的 apache
和 mod_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