2009-02-18 4 views
188

Je cours Django, FastCGI, et Nginx. Je crée une sorte d'api où quelqu'un peut envoyer des données via XML que je vais traiter et ensuite retourner des codes d'état pour chaque nœud qui a été envoyé.Comment empêcher un délai de passerelle avec FastCGI sur Nginx

Le problème est que Nginx lancera un Timeout de passerelle 504 si je prends trop de temps pour traiter le XML - je pense que plus de 60 secondes. Donc, je voudrais configurer Nginx de sorte que si des demandes correspondant à l'emplacement/API ne sera pas expiré pendant 120 secondes. Quel paramètre va accomplir cela.

Ce que j'ai à ce jour est la suivante:

# Handles all api calls 
    location ^~ /api/ { 
     proxy_read_timeout 120; 
     proxy_connect_timeout 120; 
     fastcgi_pass 127.0.0.1:8080; 
    } 

Edit: Ce que je ne fonctionne pas :)

+7

Vous pouvez définir des valeurs de délai d'attente sur "2m" au lieu de "120". –

+1

Il semble mauvais que les données ne soient pas diffusées en continu ... c'est-à-dire qu'un serveur qui commence à répondre en 60 secondes ou plus ne semble pas acceptable. –

Répondre

235

temporisations Proxy sont bien, pour les serveurs proxy, et non pour FastCGI ...

Les directives qui affectent les délais d'attente FastCGI sont client_header_timeout, client_body_timeout et send_timeout.

Modifier: Considérant ce qui se trouve sur le wiki nginx, le send_timeout directive est responsable de la définition du délai général de réponse (ce qui était peu trompeur). Pour FastCGI, il y a fastcgi_read_timeout qui affecte le fastcgi process response timeout.

HTH.

+44

La réponse était le fastcgi_read_timeout - merci! – sheats

+7

Pour toute personne utilisant uwsgi et ayant cette erreur, uwsgi_read_timeout 600; fixé mon problème. – Homer6

+2

Ma question ici serait (en tant qu'administrateur de serveur amateur) où vais-je changer cela? Fichier httpd.conf? – jeffkee

21

Pour ceux qui utilisent nginx avec la licorne et les rails, le plus probable est le délai d'attente dans votre fichier unicorn.rb

mettre un grand délai d'attente dans unicorn.rb

timeout 500 

si vous êtes confronté à des problèmes encore, essayez avoir fail_timeout = 0 dans votre amont dans nginx et voir si cela résout votre problème. Ceci est à des fins de débogage et peut être dangereux dans un environnement de production.

upstream foo_server { 
     server 127.0.0.1:3000 fail_timeout=0; 
} 
+5

Si vous downvoting ce qui semble être une réponse légitime, pouvez-vous s'il vous plaît commenter pourquoi. Cette réponse me semble bien. –

+3

Je pense que les gens l'ont downvoted parce qu'il s'agit de Django, cependant votre réponse a résolu mon problème de timeout de passerelle avec Rails + Unicorn :) – ZiggyTheHamster

1

Si vous utilisez une licorne.

Regardez top sur votre serveur. Unicorn utilise probablement 100% de CPU en ce moment. Il existe plusieurs raisons à ce problème.

  • Vous devriez vérifier vos requêtes HTTP, certaines d'entre elles peuvent être très dures.

  • Vérifiez la version de la licorne. Peut-être que vous l'avez mis à jour récemment, et quelque chose a été brisé.

0

Dans http section nginx (de /etc/nginx/nginx.conf) ajouter ou modifier:

keepalive_timeout 300s 

Dans server section nginx (/ etc/nginx/sites disponibles/votre -config-fichier.com) ajouter ces lignes:

client_max_body_size 50M; 
fastcgi_buffers 8 1600k; 
fastcgi_buffer_size 3200k; 
fastcgi_connect_timeout 300s; 
fastcgi_send_timeout 300s; 
fastcgi_read_timeout 300s; 

Dans php fichier dans le cas 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) modifier:

request_terminate_timeout = 300 

J'espère vous aider.

+0

Quelque chose de "mauvais" arriverait si je changeais le temps à 10000 secondes? – utdev

+0

Ne se passe rien de mal, mais votre service attendez plus de temps. Vous pouvez changer la valeur comme vous voulez. –

Questions connexes