Comment résoudre l'erreur de dépassement de délai critique du travailleur de Gunicorn?

26

J'ai utilisé nginx et gunicorn pour héberger mon site Web sur deux serveurs,

Les deux serveurs ont les mêmes versions de packages et le site Web est hébergé avec succès,

Mais dans l'un de mes serveurs, Gunicorn a toujours un délai d'expiration et j'obtiens une erreur

[CRITICAL]Worker Timeout
Booting worker with pid
Worker cannot boot with pid

Et après cela, j'obtiens une erreur 502 Badgateway dans la page Web. Je dois redémarrer le processus gunicorn pour afficher le site Web.

Voici le journal des erreurs:

2014-02-16 14:29:53 [1267] [CRITICAL] WORKER TIMEOUT (pid:4994)
2014-02-16 14:29:53 [1267] [CRITICAL] WORKER TIMEOUT (pid:4994)   
2014-02-16 14:29:53 [22140] [INFO] Booting worker with pid: 22140

Et je reçois une erreur continue comme celle-ci,

2014-02-16 14:29:53 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
2014-02-16 14:29:53 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
2014-02-16 14:29:57 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE

Et le travailleur recommence,

2014-02-16 14:32:44 [1267] [CRITICAL] WORKER TIMEOUT (pid:4993)
2014-02-16 14:32:44 [1267] [CRITICAL] WORKER TIMEOUT (pid:4993)
2014-02-16 14:32:44 [22276] [INFO] Booting worker with pid: 22276

Encore une fois Ignorer l'erreur EPIPE et cela continue jusqu'à ce que je redémarre le gunicorn. Et quand je reçois cette erreur, je reçois une erreur de passerelle 504 de nginx

sm
la source
1
Pouvez-vous fournir plus d'informations, s'il vous plaît? La ligne de commande que vous utilisez pour lancer Gunicorn serait un bon début.
supervacuo
Tracez l'ouvrier pour voir où il se coince:strace -p <PID> -e trace=network -t
Aryeh Leib Taurog
Quelle est l'application que vous exécutez? Vous souhaiterez peut-être augmenter le délai d'expiration par défaut.
Burhan Khalid
Oui Burhan Khalid, pour l'instant j'ai augmenté proxy_read_timeout à 1200 en nginx et timeout à 3600 en configuration gunicorn. J'espère que cela fonctionne
sm
@sm - ça a marché?
iamkhush

Réponses:

29

Pour résoudre ce problème, augmentez l'indicateur de délai d'expiration dans Nginx,

Dans Nginx augmenter proxy_connect_timeoutet proxy_read_timeout, vous pouvez ajouter ce qui suit dans le fichier nginx.conf sous la httpdirective. Ils par défaut à 60s.

proxy_connect_timeout 300s;

proxy_read_timeout 300s;

Redémarrez le serveur Nginx. Voir les documents nginx sur les délais d'attente .

Si le correctif ci-dessus ne fonctionne pas, augmentez l'indicateur de délai d'expiration Gunicorn dans la configuration Gunicorn, le délai d'expiration par défaut de Gunicorn est de 30 secondes.

- timeout 90

Documentation de Gunicorn sur le timeout

-t INT, --timeout INT 30 Les travailleurs silencieux pendant plus de ce nombre de secondes sont tués et redémarrés.

Généralement réglé sur trente secondes. Ne fixez cette valeur sensiblement plus haut si vous êtes sûr des répercussions pour les travailleurs de synchronisation. Pour les travailleurs non synchronisés, cela signifie simplement que le processus de travail est toujours en communication et n'est pas lié à la durée requise pour traiter une seule demande.

Gunicorn Docs on Worker Timeouts

J'espère que cela le résoudra.

sreekanth
la source
2
Cette solution m'a sauvé la vie après avoir cherché une solution toute la journée. Si vous avez vraiment un processus qui dure plus de 30 secondes (ce qui était mon problème), c'est certainement la bonne solution.
Alex P. Miller
Oui, même nous avons un scénario qui dure plus de 30 secondes, c'est pourquoi nous avons adopté la solution. Bien, cela a aidé.
sreekanth
Nous n'avons pas un tel scénario. Il y a un trafic minime sur le site, mais les travailleurs s'arrêtent chaque jour presque au même moment. S'exécute ensuite après 1-2 minutes. Ma configuration est nginx - superviseur - gunicorn - django. J'ai un délai de 120 secondes.
iamkhush
proxy_connect_timeout: "Définit un délai pour établir une connexion avec un serveur mandaté. Il convient de noter que ce délai ne peut généralement pas dépasser 75 secondes ."
deweydb
@iamkhush avez-vous pu trouver la solution à cela? Je suis également confronté à ce problème même lorsque mon application est inactive. Les travailleurs de Gunicorn expirent tous les jours et aucune des solutions telles que l'augmentation du délai ne semble fonctionner.
Ankit Jaiswal