152 votes

Empêcher le délai d'attente de la passerelle nginx 504 en utilisant PHP set_time_limit()

Je reçois le message de dépassement de délai 504 de nginx lorsque mon script PHP s'exécute plus longtemps que d'habitude. set_time_limit(0) ne semble pas empêcher cela ! Est-ce que cela ne fonctionne pas lorsque php5-fpm est exécuté sur nginx ? Si c'est le cas, quelle est la bonne façon de définir la limite de temps ?

Erreur :

504 Gateway Time-out
nginx/1.2.7

229voto

pymkin Points 571

Il existe plusieurs façons de définir le temps d'expiration pour php-fpm. Dans /etc/php5/fpm/pool.d/www.conf j'ai ajouté cette ligne :

request_terminate_timeout = 180

Aussi, dans /etc/nginx/sites-available/default j'ai ajouté la ligne suivante dans le bloc de localisation du serveur en question :

fastcgi_read_timeout 180;

Le bloc de localisation entier ressemble à ceci :

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180;
    include fastcgi_params;
} 

Maintenant il vous suffit de redémarrer php-fpm et nginx et il ne devrait plus y avoir de délais d'attente pour les requêtes prenant moins de 180 secondes.

2 votes

Au cas où quelqu'un d'autre se poserait la question, par défaut pour le mien (nginx + php5-fpm) était de 60 secondes, donc si vous voyez "délai d'attente de la passerelle" pour un script @ 60 secondes, le paramètre "fastcgi_read_timeout" doit être ajouté

1 votes

J'ai essayé de comprendre cela depuis des jours, et la réponse de @pymkin est ce qui a fonctionné pour moi. Pour d'autres amateurs comme moi qui se demandent comment redémarrer nginx et php5-fpm, exécutez les deux commandes suivantes : sudo service nginx restart & sudo service php5-fpm restart La seule chose que j'ai faite différemment est d'appliquer ces paramètres à un seul de mes sites Web plutôt qu'à la configuration de tous les sites sur mon serveur.

5 votes

Malheureusement, peu importe la valeur que j'ai définie pour fastcgi_read_timeout dans ce bloc location, il expire toujours après 60 secondes.

64voto

arp Points 55

Essayez ce lien, il propose une meilleure solution pour résoudre ce problème. Voici les étapes à suivre :

  1. Ouvrez votre fichier nginx.conf situé dans le répertoire /etc/nginx.

  2. Ajoutez ce code sous la section http { :

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    client_max_body_size 32m;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;

    Remarque : Si c'est déjà présent, modifiez les valeurs en conséquence.

  3. Rechargez Nginx et php5-fpm.

    $ service nginx reload
    $ service php5-fpm reload

    Si l'erreur persiste, envisagez d'augmenter les valeurs.

1 votes

Cela ne permet pas de trouver la cause, cela augmente simplement les temps jusqu'à l'erreur. Mais il serait préférable de trouver la solution pour comprendre pourquoi le chargement est si long. Lorsque je suis en local et que je suis le seul client, et que cela prend autant de temps, ce n'est pas du tout bon de devoir attendre pendant le développement.

21 votes

La question ne demande pas la cause du script lent, elle demande un moyen de faire attendre le serveur plus longtemps. Parfois, vous avez besoin d'exécuter des scripts spéciaux qui effectuent des tâches prenant beaucoup de temps, et ce n'est pas une mauvaise chose.

0 votes

Lien mis à jour (ci-dessus) : codetweet.com/nginx/…

17voto

Bart Points 7738

Vous ne pouvez pas utiliser PHP pour empêcher un délai d'attente émis par nginx.

Pour configurer nginx afin de permettre plus de temps, consultez la directive proxy_read_timeout.

0 votes

Cela a résolu le problème que je rencontrais où des erreurs 504 commençaient à apparaître sur ma boîte Vagrant (en utilisant Vaprobash).

3 votes

Je crois que cette réponse s'applique uniquement si vous utilisez Nginx en tant que serveur proxy. Cela ne fonctionnerait pas si vous utilisez Nginx comme serveur web principal (avec PHP-FPM).

16voto

kabus Points 412
 sudo nano /etc/nginx/nginx.conf

Ajoutez ces variables au fichier nginx.conf :

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

Puis redémarrez :

service nginx reload

0 votes

Quelles sont les valeurs maximales ? Parce que je débogue dans PhpStorm et je veux parcourir les variables.

0 votes

En fait cela a cassé ma configuration nginx php. de plus, est-ce que les 600 doivent être alignés de cette manière ? Je ne peux pas utiliser de tabulation dans le terminal n'est-ce pas ?

15voto

tfont Points 1020

La réponse correcte est d'augmenter fastcgi_read_timeout dans votre configuration Nginx.
Aussi simple que ça !

0 votes

Merci, tu sauves ma journée

1 votes

@Bauroziq pourriez-vous m'aider à préciser où je peux trouver le fichier où ajouter fastcgi_read_timeout

1 votes

Il suffit de l'ajouter dans la balise http du fichier nginx.conf

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