2017-06-05 2 views
0

j'enquête depuis un certain temps maintenant, et tous les documents semblent dire que cela est possible, mais chaque fois que j'augmenter notre elastic beanstalkmod_wsgiNumProcesses config ci-dessus 1, notre site d'administration est inaccessible.Elastic Beanstalk en cours d'exécution mod_wsgi application Django avec des processus multiples provoquant 302 boucle

J'ai créé une réduction où j'ai testé avec une application django par défaut, et le comportement est toujours présent. J'ai également essayé de répliquer localement, cependant mes config apache et mod_wsgi ne peuvent pas répliquer le problème. Fondamentalement, ce que je vois, c'est que chaque tentative de connexion, 302 Found redirect ramène à la page de connexion. J'ai effacé les sessions de la base de données, et je peux confirmer que l'application crée une nouvelle entrée pendant la connexion POST, mais l'utilisateur est toujours redirigé vers la page de connexion (voir config et logs ci-dessous). Nous avons également un équilibreur de charge et des sessions persistantes configurées sur l'instance (s) Elastic Beanstalk.

Voici le python contenu config de notre .ebextensions

option_settings: 
    "aws:elasticbeanstalk:container:python": 
    WSGIPath: site/settings/wsgi/__init__.py 
    NumProcesses: 4 
    NumThreads: 15 

Voici le wsgi.conf résultant tiré de l'instance

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> 

Voici une capture du access_log montrant la redirection

::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 

Maintenant, l'ensemble de configs et les informations suivantes sont extraites de mon installation locale.

# 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> 

devrait 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 

La question que je, est pourquoi est-ce un travail et un produit une boucle? Je peux voir une option sur le WSGIScriptAlias, mais ce n'est pas disponible sur la config elastic beanstalk, et la documentation dit encore que c'est faisable. Qu'est-ce que j'oublie ici? Pourquoi avoir plusieurs processus à l'origine de ce problème?

Remarques supplémentaires

A défaut mod_wsgi version 3.5

travail mod_wsgi Version 4.5.15

J'ai également pu obtenir mon application wsgi locale travaillant avec python 3.6

Répondre

0

Après un certain temps, j'ai trouvé une entrée Session data corrupted dans le e apacheerror_log

Il s'avère que le code pour générer le SECRET_KEY en assignait aléatoirement un en production. Cela signifie que, lorsque la requête a été transmise à un autre processus, la clé de session ne correspond pas, déconnecte l'utilisateur et renvoie le message à la page de connexion. D'où la boucle 302 Found.

trouvé ceci utile Django Login/Session Not Sticking