Empêcher l'expiration de la passerelle nginx 504 en utilisant PHP set_time_limit ()


117

Je reçois un message de délai d'expiration 504 de nginx lorsque mon script PHP est plus long que d'habitude. set_time_limit(0)ne semble pas l'empêcher! Cela ne fonctionne-t-il pas lors de l'exécution de php5-fpm sur nginx? Si oui, quelle est la bonne façon de fixer le délai?

Erreur:

504 Gateway Time-out
nginx/1.2.7

Réponses:


194

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

request_terminate_timeout = 180

De plus, /etc/nginx/sites-available/defaultj'ai ajouté la ligne suivante au bloc d'emplacement du serveur en question:

fastcgi_read_timeout 180;

L'ensemble du bloc d'emplacement 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, redémarrez simplement 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
au cas où quelqu'un d'autre se le demanderait, la valeur par défaut pour le mien (nginx + php5-fpm) était de 60 secondes, donc si vous voyez "gateway timeout" pour un script @ 60 secondes, le paramètre "fastcgi_read_timeout" devrait être ajouté
Michael Nguyen

1
J'essaie 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 que j'ai appliqué ces paramètres à un seul des mes sites Web plutôt que la configuration de tous les sites Web sur mon serveur.
Pamela

4
Malheureusement, peu importe ce que je fais fastcgi_read_timeoutdans ce locationbloc, il expire toujours après 60 secondes.
Spencer Williams

cela devrait être la réponse acceptée. essayé tant de solutions mais seulement cela fonctionne. J'utilisais la propriété laravel et j'avais une erreur de délai d'expiration de la passerelle 504 et cela l'a corrigé.
Anbu369

Si vous utilisez Laravel, vous devez le définir dans le locationbloc qui gère les scripts php, plutôt que dans la docroot.
Ryan DuVal

50

Essayez ce lien , il a une meilleure solution pour résoudre ce problème. Les étapes sont donc:

  1. Ouvrez votre nginx.conffichier situé dans le /etc/nginxrépertoire.
  2. Ajoutez ce morceau de code ci-dessous dans la http {section:

    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: s'il est déjà présent, modifiez les valeurs en fonction.

  3. Rechargez Nginx et php5-fpm.

    $ service nginx reload
    $ service php5-fpm reload

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


1
Cela ne permet pas de trouver la cause, cela augmente simplement les temps jusqu'à l'erreur. Mais mieux serait de trouver une solution pourquoi il se charge si longtemps. Quand je suis sur localhost, je suis le seul client et il se charge si longtemps que ce n'est pas du tout bon d'attendre pendant le développement.
Darius.V

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

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

2
Pour ceux qui se demandent ce qui prendrait légitimement autant de temps, il pourrait s'agir par exemple d'un script d'installation à partir d'une interface Web qui tente de se connecter à une base de données, puis crée de nombreuses tables initiales et la remplit de données. peut prendre un certain temps avant une réponse.
imme

Gardez à l'esprit que ces paramètres globaux seront remplacés par les paramètres par site dans /etc/nginx/sites-available/mysite.com.
Mac

11

Vous ne pouvez pas utiliser PHP pour empêcher un timeout émis par nginx.

Pour configurer nginx afin de laisser plus de temps, consultez la proxy_read_timeoutdirective .


Cela a résolu le problème que je rencontrais où les 504 commenceraient à apparaître sur ma boîte vagabonde (en utilisant vaprobash).
Andy Fleming

2
Je pense que cette réponse ne s'applique que si vous utilisez simplement Nginx comme serveur proxy. Cela ne fonctionnerait pas si vous utilisez Nginx comme serveur Web principal (avec PHP-FPM).
orrd

10

La bonne réponse est d'augmenter fastcgi_read_timeout dans votre configuration Nginx.
Aussi simple que cela!


7
 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;
}

Et puis redémarrez:

service nginx reload

4

Il existe trois types de délais d'expiration qui peuvent se produire dans un tel cas. On voit que chaque réponse est centrée sur un seul aspect de ces possibilités. J'ai donc pensé à l'écrire pour que quelqu'un qui se rende ici à l'avenir n'ait pas besoin de vérifier chaque réponse au hasard et d'obtenir du succès sans savoir laquelle a fonctionné.

  1. Délai d'expiration de la demande du demandeur - Nécessité de définir l'en-tête du délai d'expiration (voir la configuration de l'en-tête dans la bibliothèque demandeuse)
  2. Délai d'expiration de nginx lors de la demande (avant le transfert vers le serveur mandaté) par exemple: fichier énorme en cours de téléchargement
  3. Délai d'expiration après le transfert vers le serveur proxy , le serveur ne répond pas à nginx à temps. Par exemple: scripts longs exécutés sur le serveur

Les correctifs pour chaque problème sont donc les suivants.

  1. définir l'en-tête du délai d'expiration, par exemple: en ajax

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

  1. Délai d'expiration du client nginx

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. Délai d'expiration du serveur proxy nginx

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }

Alors utilisez celui dont vous avez besoin. Peut-être que dans certains cas, vous avez besoin de toutes ces configurations. J'ai eu besoin.


1

Vous devez ajouter une directive nginx supplémentaire (for ngx_http_proxy_module) dans nginx.conf, par exemple:

proxy_read_timeout 300;

Fondamentalement, la proxy_read_timeoutdirective nginx modifie le délai d'expiration du proxy, FcgidIOTimeoutc'est pour les scripts qui sont silencieux trop longtemps, etFcgidBusyTimeout aux scripts dont l'exécution prend trop de temps.

De plus, si vous utilisez l'application FastCGI, augmentez également ces options:

FcgidBusyTimeout 300
FcgidIOTimeout 250

Rechargez ensuite nginx et PHP5-FPM.

Plesk

Dans Plesk, vous pouvez l'ajouter dans les paramètres du serveur Web sous Directives nginx supplémentaires .

Pour FastCGI, vérifiez dans Paramètres du serveur Web sous Directives supplémentaires pour HTTP .

Voir: Comment résoudre les problèmes de délai d'expiration FastCGI dans Plesk?


La FcgidBusyTimeoutvariable n'existe- t-elle pas uniquement pour Apache?
Slavik

0

Puisque vous utilisez php-fpm, vous devriez profiter de fastcgi_finish_request () pour traiter les requêtes dont vous savez qu'elles peuvent prendre plus de temps.


-1

L'utilisation set_time_limit(0)est inutile lors de l'utilisation de php-fpm ou d'un gestionnaire de processus similaire.

Bottomline n'est pas à utiliser set_time_limitlors de l'utilisation php-fpm, pour augmenter votre délai d'exécution, consultez ce tutoriel .


8
peut être fournir une explication de la réponse ici et cette réponse peut devenir obsolète si le lien expire.
Lakshmi

-7

Je résous ce problème avec la config APACHE! Toutes les méthodes (dans ce sujet) sont incorrectes pour moi ... Ensuite, j'essaye la configuration de chanche apache:

Timeout 3600

Ensuite, mon script a fonctionné!


5
La question indique nginx, si vous avez des problèmes avec Apache, vous devriez le rechercher.
hogan le

La question est sur Nginx et php-fpm pas Apache.
Kevin Kaburu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.