Mon Django sur mon serveur de production hébergé sur Webfaction fonctionnait bien jusqu'à ce que j'essaie de redémarrer après avoir poussé une modification dans le fichier settings.py. J'ai couru
Apache2/bin/restart
comme d'habitude. Ensuite, j'ai essayé d'accéder à mon application sur mon navigateur et j'ai obtenu un délai d'expiration de la passerelle 504. J'ai regardé dans les journaux mod_wsgi et j'ai vu ceci:
[Thu Nov 03 23:46:53.605625 2016] [wsgi:error] [pid 8027:tid 139641332168448]
[client 127.0.0.1:34570] Timeout when reading response headers from daemon
process 'myapp' : /home/<me>/webapps/<myapp>/<ProjectName>/<myapp>/wsgi.py
Qu'est-ce que cela signifie et comment y remédier? La seule chose que j'ai modifiée dans le fichier settings.py était de déplacer des noms de variables. Je peux toujours interagir avec succès avec l'application avec
python2.7 manage.py Shell
Mais je ne peux pas y accéder sur le Web, ni utiliser l'API.
EDIT: Voici mon fichier wsgi.py:
import os
from Django.core.wsgi import get_wsgi_application
os.environ.setdefault("Django_SETTINGS_MODULE", "<myapp>.settings")
application = get_wsgi_application()
Les modules d'extension Python C, comme numpy, sont connus pour provoquer des délais d'attente lorsqu'ils sont utilisés sous mod_wsgi. Il y a une explication claire du problème (directement de l'auteur de mod_wsgi) disponible à https://serverfault.com/a/514251/109598
Si cela semble être la cause de votre problème, alors la solution est probablement simple - ajoutez ce qui suit à votre httpd.conf:
WSGIApplicationGroup %{GLOBAL}
Assurez-vous de redémarrer votre instance Apache après avoir effectué cette modification.
Essayez d'augmenter la directive Timeout
dans httpd.conf
, par défaut à 60 secondes dans Apache 2.4. Par exemple:
TimeOut 600
Voici comment j'ai pu trouver la cause première de mon problème.
python manage.py showmigrations
Mon application n'a pas pu atteindre le serveur de base de données, elle expirerait donc. En exécutant manage.py, je pouvais voir le message d'erreur sur la console.
Dans mon cas (Python 3.6), le module mimetypes a causé ce problème. Je n'ai pas approfondi la question, mais j'ai supprimé un appel à mimetypes.guess_type
résolu le problème. L'appel a été effectué dans la fonction de vue Django view).