214 votes

Comment prévenir un dépassement de délai de la passerelle avec FastCGI sur Nginx

Je lance 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, puis renvoyer des codes d'état pour chaque nœud qui a été envoyé.

Le problème est que Nginx renverra un délai d'attente de passerelle 504 si je mets trop de temps à traiter le XML - je pense plus de 60 secondes.

Je voudrais donc configurer Nginx de sorte que si des requêtes correspondant à l'emplacement /api ne dépassent pas 120 secondes. Quel paramètre accomplira cela.

Voici ce que j'ai jusqu'à présent:

    # Gère tous les appels d'api
    location ^~ /api/ {
        proxy_read_timeout 120;
        proxy_connect_timeout 120;
        fastcgi_pass 127.0.0.1:8080;
    }

Modifier : Ce que j'ai ne fonctionne pas :)

7 votes

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

1 votes

Il semble mauvais que les données ne soient pas diffusées... c'est-à-dire qu'un serveur mette plus de 60 secondes à commencer à répondre semble inacceptable.

257voto

zgoda Points 8549

Les délais d'attente du proxy sont bien, pour les proxies, 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 : En tenant compte de ce qui est trouvé sur le wiki de nginx, la directive send_timeout est responsable de définir le délai d'expiration général de la réponse (ce qui était un peu trompeur). Pour FastCGI, il y a fastcgi_read_timeout qui affecte le délai d'expiration de la réponse du processus FastCGI.

8 votes

Pour toute personne utilisant uwsgi et rencontrant cette erreur, uwsgi_read_timeout 600; a résolu mon problème.

2 votes

Ma question ici serait (en tant qu'administrateur de serveur amateur) où dois-je aller pour changer cela? fichier httpd.conf?

2 votes

Si cela peut aider, le mien était à /etc/nginx/ dans le système DV de Media Temple.

25voto

Abdo Points 3360

Pour ceux qui utilisent nginx avec unicorn et rails, il est probable que le délai d'attente soit défini dans votre fichier unicorn.rb

mettez un délai d'attente élevé dans unicorn.rb

timeout 500

Si vous rencontrez toujours des problèmes, essayez d'avoir fail_timeout=0 dans votre amont en nginx et voyez si cela résout votre problème. Cela est dans un but de débogage et peut être dangereux dans un environnement de production.

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

3 votes

Je pense que les gens ont voté contre car il s'agit de Django, cependant votre réponse a résolu mon problème de délai d'expiration de la passerelle avec Rails + Unicorn :)

9voto

josecarlos Points 746

Dans la section http de nginx (/etc/nginx/nginx.conf) ajoutez ou modifiez:

keepalive_timeout 300s

Dans la section server de nginx (/etc/nginx/sites-available/votre-fichier-config.com) ajoutez 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 le fichier php dans le cas de 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) modifiez:

request_terminate_timeout = 300

J'espère que cela vous aide.

1voto

Pavel Kalashnikov Points 1436

Si vous utilisez une licorne.

Regardez top sur votre serveur. Il est probable que la licorne utilise actuellement 100 % du CPU. Il existe plusieurs raisons à ce problème.

  • Vous devriez vérifier vos requêtes HTTP, certaines peuvent être très complexes.

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

1voto

Kamil Dąbrowski Points 135

Dans le serveur proxy configuré comme suit

location / {
                proxy_pass http://ip:80;                
                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;
            }

Dans le serveur php configuré comme suit

server {
        client_body_timeout 120;
        location = /index.php {
                #include fastcgi.conf; //exemple
                #fastcgi_pass unix:/run/php/php7.3-fpm.sock;//exemple version
                fastcgi_read_timeout 120s;
       }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X