Demandes de longue durée avec gunicorn + nginx

8

J'ai mis en place un serveur d'intégration pour notre application basée sur Django. Certaines fonctionnalités sont encore expérimentales et entraînent des demandes trop longues.

Je suis d'accord avec les mauvaises performances, pour l'instant, mais je dois pouvoir m'intégrer. Chaque fois que nous utilisons la fonctionnalité qui mène à une longue demande, l'application se bloque (comme prévu) puis, après peut-être une minute et demie, renvoie un «502 - Bad Gateway». Le reste de l'application fonctionne bien.

J'ai vérifié le journal gunicorn, et chaque fois que cela se produit, je reçois une ligne comme

2012-01-20 17:30:13 [23128] [DEBUG] GET /results/
2012-01-20 17:30:43 [23125] [ERROR] WORKER TIMEOUT (pid:23128)
Traceback (most recent call last):
  File "/home/demo/python_envs/frontend/lib/python2.6/site-packages/gunicorn/app/base.py", line 111, in run
    os.setpgrp()
OSError: [Errno 1] Operation not permitted

cependant, cela se produit bien avant le délai d'expiration réel du travailleur, que j'ai défini à 10 minutes juste pour être sûr. Voici une partie du script parvenu qui exécute gunicorn.

description "..."

start on runlevel [2345]
stop on runlevel [!2345]
#Send KILL after 5 seconds
kill timeout 5
respawn

env VENV="/path/to/a/virtual/env/"

#how to know the pid
pid file $VENV/run/guniconr-8080.pid

script
exec sudo -u demo $VENV/bin/gunicorn_django --preload --daemon -w 4 -t 600 --log-level debug --log-file $VENV/run/gunicorn-8080.log -p $VENV/run/gunicorn-8080.pid -b localhost:8080 /path/to/settings.py
end script

J'utilise la version 0.13.4 de gunicorn. Toute aide serait grandement appréciée.

Matt Luongo
la source

Réponses:

5

502 Bad Gatewaysignifie que votre travailleur gunicorn a expiré. Vous pouvez ajouter une --timeoutoption à la gnuicorncommande. La valeur par défaut est 30 s.

Comme le note @ greg-k, l' proxy_read_timeoutoption de Nginx contrôle un autre délai d'expiration. Si vous voyez une 504 Gateway Timeouterreur, vous pouvez ajuster cette option.

Moniteur de poisson
la source
Cela fait un moment que je ne m'inquiète pas, mais n'est-ce pas la même chose que l' -toption que j'avais déjà dans la question?
Matt Luongo
3

C'est peut-être un problème avec votre configuration nginx. Avez-vous configuré la valeur proxy_read_timeout?

Cette directive définit le délai de lecture pour la réponse du serveur mandaté. Il détermine combien de temps nginx attendra pour obtenir la réponse à une demande. Le délai d'attente n'est pas établi pour la réponse entière, mais seulement entre deux opérations de lecture.

Source: http://wiki.nginx.org/HttpProxyModule#proxy_read_timeout

Greg K
la source
Je viens de passer à un serveur plus grand / plus rapide pour le développement ($$ :(), mais si cela revient, je
Matt Luongo