Django + gunicorn + virtualenv + problème de supervision

J'ai un problème étrange avec ma configuration virtualenv + gunicorn, uniquement lorsque Gunicorn est lancé via le superviseur. Je me rends count qu'il peut très bien être un problème avec mon superviseur et j'apprécierais tout commentaire sur un meilleur endroit pour requestr de l'aide …

En bref: lorsque je lance Gunicorn à partir de mon shell user, dans mon virtualenv, tout fonctionne parfaitement. Je peux accéder à toutes les vues de mon projet Django.

Lorsque gunicorn est lancé par le superviseur lors du démarrage du système, tout va bien.

Mais, si je dois tuer les process de gunicorn_django, ou si je reprends un controller, une fois que Gunicorn_django a relancé, toutes les requêtes sont répondues avec un Traceback étrange:

(...) File "/home/hc/prod/venv/lib/python2.6/site-packages/Django-1.2.5-py2.6.egg/django/db/__init__.py", line 77, in connection = connections[DEFAULT_DB_ALIAS] File "/home/hc/prod/venv/lib/python2.6/site-packages/Django-1.2.5-py2.6.egg/django/db/utils.py", line 92, in __getitem__ backend = load_backend(db['ENGINE']) File "/home/hc/prod/venv/lib/python2.6/site-packages/Django-1.2.5-py2.6.egg/django/db/utils.py", line 50, in load_backend raise ImproperlyConfigured(error_msg) TemplateSyntaxError: Caught ImproperlyConfigured while rendering: 'django.db.backends.postgresql_psycopg2' isn't an available database backend. Try using django.db.backends.XXX, where XXX is one of: 'dummy', 'mysql', 'oracle', 'postgresql', 'postgresql_psycopg2', 'sqlite3' Error was: cannot import name utils 

La stack complète est disponible ici: http://pastebin.com/BJ5tNQ2N

Je suis entrain de courir…

  • Ubuntu / Maverick (à jour)
  • Python = 2.6.6
  • virtualenv = 1.5.1
  • gunicorn = 0.12.0
  • Django = 1.2.5
  • psycopg2 = '2.4-beta2 (dt dec pq3 ext)'

configuration gunicorn:

 backlog = 2048 bind = "127.0.0.1:8000" pidfile = "/tmp/gunicorn-hc.pid" daemon = True debug = True workers = 3 logfile = "/home/hc/prod/log/gunicorn.log" loglevel = "info" 

configuration du superviseur:

 [program:gunicorn] directory=/home/hc/prod/hc command=/home/hc/prod/venv/bin/gunicorn_django -c /home/hc/prod/hc/gunicorn.conf.py user=hc umask=022 autostart=True autorestart=True redirect_stderr=True 

Aucun conseil ? J'ai été coincé sur ce sujet pendant un bon moment.

Il semble que ce soit une limite de memory étrange, car je n'applique rien de spécial:

 $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 

Je l'ai traqué avec l'aide de davisp, un développeur de canicule. Je vous remercie !

C'était un problème d'environnement, causé par un environnement HOME invalide dans l'environnement du sous-process du chef Gunicorn.

Je n'ai rien trouvé sur stderr jusqu'à ce que je mette un "import psycopg2" dans mon file settings.py, qui a produit le message suivant sur les files stderr du superviseur pour gunicorn.

 Error: Can't extract file(s) to egg cache The following error occurred while trying to extract file(s) to the Python egg cache: [Errno 13] Permission denied: '/root/.python-eggs'" 

J'ai ajouté la ligne suivante dans mon file de configuration de superviseur pour gunicorn, et maintenant Python trouve son path vers un cache d'oeufs pouvant être écrit sur u +. Tout va bien.

 environment=HOME='/home/hc'