Notre application REST API est servie par guncorn ( non derrière nginx) s'exécutant sur les instances AWS EC2 avec une auto-automatique typique Configuration de l'équilibrage de la mise à l'échelle/de la charge. Le délai d'attente d'inactivité de l'équilibreur de chargement est de 60 secondes et le délai d'attente continue de Gunicorn est de 2 secondes. Nous avons vu Sporadic 504 Gateway Timeout
réponses de cette configuration. Selon - Amazon Docs , cela peut être dû au fait que le délai d'attente continue du serveur est inférieur à celui du délai d'attente d'inactivité de l'équilibreur de chargement:
Cause 2: instances enregistrées fermant la connexion à l'équilibrage de la charge élastique.
Solution 2: Activez les paramètres de conservation sur vos instances EC2 et définissez le délai de conservation de la maintenance supérieure ou égale aux paramètres de délai d'attente de votre balanceur de charge.
Avec Nginx, la valeur par défaut keepalive_timeout
est de 75 secondes, ce qui fonctionne bien avec les paramètres par défaut de l'ELB. Cependant, Gunicorn Docs Recommander un keepalive
réglage dans la plage de 1 à 5 secondes.
Cela a-t-il logique de heurter le garde-corps de Gunicorn à 75 secondes, ou y a-t-il une bonne raison de le garder en dessous de 5 secondes, même si nous n'utilisons pas de proxy inverse devant celui-ci?
Vous voudrez certainement certainement soulever la minuterie de conserve par la recommandation de la CELB, car ELB réutilise les connexions. Il les détiendra jusqu'à ce que le délai d'expiration expire et si une autre demande arrive à l'ELB, elle utilisera souvent l'une des connexions déjà ouvertes pour vous l'envoyer.
504 Gateway Timeout
est une erreur étrange pour cette condition, mais il semble que c'est ce que l'ELB retourne lorsque la réutilisation d'une connexion coïncide avec la fermeture prématurée de l'arrière-plan.
La recommandation de 5 secondes a peut-être un sens si les navigateurs communiquaient directement avec le back-end, mais ce n'est pas le cas avec ELB, qui est lui-même un proxy inverse approprié lors de l'exécution en mode HTTP.