web-dev-qa-db-fra.com

Comment empêcher un délai d'attente de la passerelle avec FastCGI sur Nginx

J'utilise Django, FastCGI et Nginx. Je crée une API de sorte que quelqu'un puisse envoyer des données via XML que je traiterai, puis renverra des codes d'état pour chaque nœud envoyé.

Le problème est que Nginx lancera un délai d'attente de la passerelle 504 si le traitement du fichier XML prend trop de temps - je pense plus de 60 secondes.

Je voudrais donc configurer Nginx de manière à ce que toutes les demandes correspondant à l'emplacement/à l'API n'expireront pas pendant 120 secondes. Quel paramètre permettra d'accomplir cela.

Ce que j'ai jusqu'ici c'est:

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

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

198
sheats

Les délais d'attente des proxy sont bien, pour les mandataires, pas pour FastCGI ...

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

Edit : Compte tenu de ce que l'on trouve sur le wiki nginx, la directive send_timeout est responsable de la définition du délai général de réponse (ce qui était un peu trompeur). ) Pour FastCGI, il y a fastcgi_read_timeout qui affecte le délai de réponse du processus Fastcgi .

HTH.

243
zgoda

Pour ceux qui utilisent nginx avec Unicorn et Rails, le délai d’expiration est probablement dans votre fichier Unicorn.rb

mettre un long délai d'attente dans Unicorn.rb

timeout 500

si vous rencontrez toujours des problèmes, essayez d’avoir fail_timeout = 0 dans votre amont dans nginx et voyez si cela résout votre problème. C'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;
}
23
Abdo

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

keepalive_timeout 300s

Dans la section server nginx (/etc/nginx/sites-available/your-config-file.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 l'affaire 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf), modifiez:

request_terminate_timeout = 300

J'espère vous aider.

Si vous utilisez Licorne.

Regardez top sur votre serveur. Unicorn utilise probablement 100% du processeur actuellement. Il y a plusieurs raisons à ce problème.

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

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

1
Pavel Kalashnikov