web-dev-qa-db-fra.com

Empêcher le délai d'expiration de la passerelle nginx 504 à l'aide de PHP set_time_limit ()

Je reçois 504 messages de délai d'attente 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 lors de l'exécution de php5-fpm sur nginx? Si oui, quelle est la bonne manière de fixer la limite de temps?

Erreur:

504 Gateway Time-out
nginx/1.2.7
105
Nyxynyx

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

request_terminate_timeout = 180

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

fastcgi_read_timeout 180;

Le bloc d'emplacement 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, redémarrez php-fpm et nginx et il ne devrait plus y avoir de délai d'attente pour les demandes prenant moins de 180 secondes.

179
pymkin

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

  1. Ouvrez votre fichier nginx.conf situé dans le répertoire /etc/nginx.
  2. Ajoutez ce morceau de code ci-dessous dans 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: 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.

45
arp

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

Pour configurer nginx afin d’accorder plus de temps, reportez-vous à la directive proxy_read_timeout) .

9
Bart

La réponse correcte augmente fastcgi_read_timeout dans votre configuration Nginx.
Aussi simple que cela!

8
tfont
 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
5
kabus

Il existe trois types de délais d'expiration qui peuvent survenir dans un tel cas. On peut constater que chaque réponse ne porte que sur un aspect de ces possibilités. J'ai donc pensé l'écrire pour que les personnes qui visitent cet endroit à l'avenir n'aient pas besoin de vérifier chaque réponse au hasard et d'obtenir le succès sans savoir laquelle a fonctionné.

  1. Délai d'attente de la requête du demandeur - Nécessité de définir un en-tête de délai d'attente (voir la configuration de l'en-tête dans la bibliothèque demandeuse)
  2. Délai d'attente de nginx lors de la demande (avant d'être transféré au serveur mandaté), par exemple: fichier énorme en cours de téléchargement
  3. Délai d'attente après transfert sur le serveur mandaté, le serveur ne répond pas nginx à temps. Par exemple: des scripts qui prennent du temps et s'exécutent sur le serveur

Donc, les correctifs pour chaque problème sont les suivants.

  1. définir l'en-tête de délai d'attente, par exemple: in 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'attente du client nginx

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
    
  2. délai d'inactivité du serveur mandaté par 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 aurez besoin de toutes ces configurations. J'ai eu besoin.

1
Gayan Kavirathne

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

proxy_read_timeout 300;

En gros, la directive nginx proxy_read_timeout modifie le délai du proxy, la FcgidIOTimeout concerne les scripts trop longs et la commande FcgidBusyTimeout, ses scripts sont trop longs à exécuter.

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 Paramètres du serveur Web sous Directives nginx supplémentaires .

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

Voir: Comment résoudre les problèmes de délai d’exécution de FastCGI dans Plesk?

1
kenorb

Utiliser set_time_limit(0) est inutile si vous utilisez php-fpm ou un gestionnaire de processus similaire.

Bottomline ne doit pas utiliser set_time_limit lorsqu’on utilise php-fpm, pour augmenter le délai d’exécution, cochez tutoriel .

0
pangkalizer

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

0
Kate