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

10voto

Gayan Kavirathne Points 671

Il existe trois types de délais d'attente qui peuvent se produire dans un tel cas. On peut voir que chaque réponse est axée sur un seul aspect de ces possibilités. J'ai donc pensé l'écrire afin qu'une personne qui visiterait cet endroit à l'avenir n'ait pas besoin de vérifier aléatoirement chaque réponse et réussisse sans savoir laquelle a fonctionné.

  1. Délai d'attente de la requête du demandeur - Besoin de définir l'en-tête de délai d'attente (voir la configuration de l'en-tête dans la bibliothèque de requête)
  2. Délai d'attente de nginx lors de la demande (avant de rediriger vers le serveur mandataire) par exemple : Envoi d'un gros fichier
  3. Délai d'attente après la redirection vers le serveur mandataire, le serveur ne répond pas à nginx à temps. par exemple : Scripts chronophages s'exécutant sur le serveur

Les corrections pour chaque problème sont les suivantes.

  1. définir l'en-tête de délai d'attente par exemple : en ajax

    $.ajax({
        url: "test.html",
        error: function(){
            // se déclenchera lorsque le délai d'attente est atteint
        },
        success: function(){
            //faire quelque chose
        },
        timeout: 3000 // définir le délai d'attente à 3 secondes
    });
  2. Temps d'attente du client nginx

    http{
         #en secondes
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  3. Temps d'attente du serveur mandataire nginx

    http{
      #Temps d'attente pour le serveur de réponse
       proxy_read_timeout 600s;
    
    }

Utilisez donc celui dont vous avez besoin. Peut-être que dans certains cas, vous aurez besoin de toutes ces configurations. J'en avais besoin.

1voto

kenorb Points 2464

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

proxy_read_timeout 300;

Fondamentalement, la directive nginx proxy_read_timeout modifie le délai d'attente du proxy, le FcgidIOTimeout est pour les scripts qui sont trop longtemps silencieux, et FcgidBusyTimeout est pour les scripts qui mettent trop de temps à s'exécuter.

Par ailleurs, si vous utilisez une application FastCGI, augmentez également ces options :

FcgidBusyTimeout 300
FcgidIOTimeout 250

Ensuite, rechargez 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 les Paramètres du serveur Web sous Directives supplémentaires pour HTTP.

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

0 votes

Est-ce que la variable FcgidBusyTimeout existe uniquement pour Apache ?

0voto

Kate Points 197

Comme vous utilisez php-fpm, vous devriez tirer parti de fastcgi_finish_request() pour le traitement des requêtes que vous savez peuvent prendre plus de temps.

0 votes

Pouvez-vous fournir un exemple s'il vous plaît ?

0voto

pangkalizer Points 1

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

En fin de compte, ne pas utiliser set_time_limit lors de l'utilisation de php-fpm, pour augmenter votre délai d'exécution, consultez ce tutoriel.

8 votes

Peut-être fournir une explication de la réponse ici aussi, car cette réponse pourrait devenir obsolète si le lien expire.

0voto

RSiqueira Points 91

Après de longues heures à chercher des réponses à ce problème, je vois une chose.

Il y a une autre couche dans mon application :

  1. Équilibreur de charge (le problème était là tout le temps)
  2. Serveur Web (nginx)
  3. Application (php)

En évitant de faire une requête au LB, je peux voir la réponse réussie aux tests avec "sleep" en php.

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