2 votes

Comment éviter le temps d'attente du premier octet avec nginx

J'ai une application en RubyOnRails, proxée par un serveur NGINX qui se trouve derrière un service CDN. Le CDN a une limitation selon laquelle si la première byte de la réponse n'arrive pas en 60 secondes, le serveur CDN renvoie :

Erreur 503 délai de première byte dépassé

Le problème est que j'ai des requêtes qui prennent plus de 60 secondes à être traitées du côté Rails. Y a-t-il un moyen de contourner la réponse, en envoyant quelques bytes avant que la réponse ne termine son traitement ? Comment faire ?

Édition 1:

Je sais que 60s est un long laps de temps et nous réfléchissons à des moyens d'éviter cela. Pourtant, j'ai besoin d'une solution temporaire qui permet à ces requêtes de 60s de fonctionner. Même si j'utilise Ajax, certains appels ajax prendraient plus de 60s et rencontreraient le même problème. Les options tcp_nopush ou tcp_nodelay n'ont pas fonctionné, je pense que c'est parce que nginx attend la réponse de l'application rails pour savoir quels en-têtes il doit envoyer. Donc, peut-être que la solution est quelque chose que je dois contourner à l'intérieur du cycle requête/réponse RubyOnRails

3voto

Maria Wilson Points 31

Une demande prenant plus de 60 secondes est un laps de temps significatif. Vous voudrez peut-être revoir votre application. Un temps de chargement de page aussi long pourrait entraîner le départ de nombreux visiteurs de votre application. Vous voudrez peut-être envisager de charger les données de manière asynchrone, par exemple avec AJAX ou des websockets.

Le temps du premier octet est généralement appliqué aux en-têtes, pas au corps de la réponse. Le client devrait recevoir les en-têtes rapidement. Êtes-vous sûr que ce sont vos CDN qui interrompent les demandes? NGinx va également interrompre vos demandes. Un bon moyen de vérifier est d'utiliser curl:

curl -I -H "Host: " http:///request/uri 

(Utilisez le vrai IP de votre proxy, pas l'IP du CDN)

L'option -I vous montrera les en-têtes de réponse, de cette façon vous pourrez avoir une bonne indication du code d'erreur (s'il y en a) renvoyé par NGinx. Vous pouvez également voir si vous recevez des en-têtes de demande et combien de temps cela prend, car c'est à cela que se réfère le premier octet TCP.

Si vous ne recevez pas rapidement les en-têtes, essayez d'utiliser:

http {
tcp_nopush off; 
tcp_nodelay on; # forcer le socket à envoyer le tampon
}

Si vous recevez une erreur de délai d'attente de passerelle ou similaire, veuillez essayer les options de configuration suivantes:

http {
keepalive_timeout 300;
proxy_connect_timeout 300;
proxy_read_timeout    300;
proxy_send_timeout    300;
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X