Erreur Nginx + php-fpm «504 Gateway Time-out» avec une charge presque nulle (sur un serveur de test)

29

Après avoir débogué pendant 6 heures - j'abandonne ceci: |

Nous avons un nginx + php-fpm + mysql en LAN avec près de 100 wordpress (créé et utilisé par différents designers / développeurs travaillant tous sur la configuration de wordpres de test)

Nous utilisons nginx sans problème depuis longtemps.

Aujourd'hui, tout d'un coup - nginx a commencé à renvoyer "504 Gateway Time-out" à l'improviste ...

J'ai vérifié le journal des erreurs nginx pour un hôte virtuel ...

2010/09/06 21:24:24 [error] 12909#0: *349 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 21:25:11 [error] 12909#0: *349 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 21:25:11 [error] 12909#0: *443 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 21:25:12 [error] 12909#0: *443 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:08:32 [error] 12909#0: *1025 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:09:33 [error] 12909#0: *1025 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:09:40 [error] 12909#0: *1064 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:09:40 [error] 12909#0: *1064 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:24:44 [error] 12909#0: *1313 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:24:53 [error] 12909#0: *1313 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"

Comme je lance php-fpm sur le port 9000 via le mode TCP, j'ai exécuté "netstat | grep 9000" et j'ai remarqué quelque chose d'inhabituel ... (Coller la sortie partielle ici pour faciliter la lecture)

tcp        9      0 localhost:9000          localhost:36094         CLOSE_WAIT  14269/php5-fpm  
tcp        0      0 localhost:46664         localhost:9000          FIN_WAIT2   -               
tcp     1257      0 localhost:9000          localhost:36135         CLOSE_WAIT  -               
tcp     1257      0 localhost:9000          localhost:36125         CLOSE_WAIT  -               
tcp        9      0 localhost:9000          localhost:36102         CLOSE_WAIT  14268/php5-fpm  
tcp        0      0 localhost:46662         localhost:9000          FIN_WAIT2   -               
tcp      745      0 localhost:9000          localhost:46644         CLOSE_WAIT  -               
tcp        0      0 localhost:46658         localhost:9000          FIN_WAIT2   -               
tcp     1265      0 localhost:9000          localhost:46607         CLOSE_WAIT  -               
tcp        0      0 localhost:46672         localhost:9000          ESTABLISHED 12909/nginx: worker
tcp     1257      0 localhost:9000          localhost:36119         CLOSE_WAIT  -               
tcp     1265      0 localhost:9000          localhost:46613         CLOSE_WAIT  -               
tcp        0      0 localhost:46646         localhost:9000          FIN_WAIT2   -               
tcp     1257      0 localhost:9000          localhost:36137         CLOSE_WAIT  -               
tcp        0      0 localhost:46670         localhost:9000          ESTABLISHED 12909/nginx: worker
tcp     1265      0 localhost:9000          localhost:46619         CLOSE_WAIT  -               
tcp     1336      0 localhost:9000          localhost:46668         ESTABLISHED -               
tcp        0      0 localhost:46648         localhost:9000          FIN_WAIT2   -               
tcp     1336      0 localhost:9000          localhost:46670         ESTABLISHED -               
tcp        9      0 localhost:9000          localhost:36108         CLOSE_WAIT  14274/php5-fpm  
tcp     1336      0 localhost:9000          localhost:46684         ESTABLISHED -               
tcp        0      0 localhost:46674         localhost:9000          ESTABLISHED 12909/nginx: worker
tcp     1336      0 localhost:9000          localhost:46666         ESTABLISHED -               
tcp     1257      0 localhost:9000          localhost:46648         CLOSE_WAIT  -               
tcp     1336      0 localhost:9000          localhost:46678         ESTABLISHED -               
tcp        0      0 localhost:46668         localhost:9000          ESTABLISHED 12909/nginx: wo             

Il existe de nombreuses paires "CLOSE_WAIT" et "FIN_WAIT2" comme indiqué ci-dessous (dans la sortie ci-dessus):

tcp     1337      0 localhost:9000          localhost:46680         CLOSE_WAIT  -               
tcp        0      0 localhost:46680         localhost:9000          FIN_WAIT2   -

Veuillez noter le port 46680 ci-dessus.

J'ai activé le journal des erreurs de requêtes lentes mysql, mais cela n'a pas fonctionné.

À partir de maintenant, redémarrez php5-fpm chaque minute via un cronjob (voir la commande ci-dessous) en gardant tout fonctionnant "en douceur" mais je déteste le patchwork et je veux résoudre ce problème ...

1 * * * * service php5-fpm restart > /dev/null

J'ai effectué des recherches approfondies sur Google - je n'ai reçu aucune aide. Comme mentionné, il s'agit d'un serveur de test en réseau local, la charge du processeur n'est jamais dépassée de 0,10 et l'utilisation de la mémoire est également inférieure à 25% (le système a 2 Go de RAM et un serveur Ubuntu installé). laissez au moins un soupçon.

Merci d'avance pour votre aide.

-Rahul

(note - il s'agit de republication de - http://forum.nginx.org/read.php?11,127694 )

Mise à jour: j'ai trouvé la réponse, qui est publiée ci-dessous.

rahul286
la source

Réponses:

31

J'ai trouvé la réponse sur mon message sur le forum nginx - http://forum.nginx.org/read.php?2,127854

La réponse, dans mon cas, est de définir:

request_terminate_timeout=30s

dans la configuration php-fpm (généralement /etc/php5/fpm/php-fpm.conf)

Notez que vous pouvez également utiliser des valeurs autres que 30s.

Je l'ai utilisé pour faire correspondre ma valeur dans le php.inifichier principal qui est:

max_execution_time = 30

Merci a tous. :-)

rahul286
la source
5
Cette configuration peut également être trouvée dans le fichier www.conf. Merci pour la réponse cependant, cela semble avoir fait l'affaire.
eddiemoya
2
Il s'agit d'une directive au niveau du pool, vous obtiendrez un message d'erreur lorsque vous essayez de la mettre dans la section php-fpm.conf [global]. Cela ne fonctionne que si vous disposez également de vos configurations de pool. Aussi: documents request_terminate_timeout .
tanius
Si c'est la bonne réponse dont j'ai VRAIMENT BESOIN, ce vendredi sera encore le meilleur de 2015.
Philip
2
J'ai trouvé que l'insertion request_terminate_timeout=30sdans mon php-fpm.conffichier provoquait une erreur (111 connexion refusée). Lorsque je l'ai déplacé dans mon www.conffichier, cela a fonctionné.
AJB
Sur CentOS 7.2 lors de l'utilisation de php7, request_terminate_timeout se trouve dans: /etc/php-fpm.d/www.conf
nadavkav
16

Voici comment cela a résolu mon problème:

apporter les modifications suivantes à /etc/nginx/nginx.conf dans http {section

proxy_connect_timeout  600s;
proxy_send_timeout  600s;
proxy_read_timeout  600s;
fastcgi_send_timeout 600s;
fastcgi_read_timeout 600s;

puis redémarrez nginx

/etc/init.d/nginx restart

Vijay Kumar
la source
2
Oui, cela ne semble vraiment pas avoir de rapport avec le problème de la personne qui pose la question.
HopelessN00b
3
mais heureusement c'est ce dont j'avais besoin :)
luchaninov
Cela n'a pas résolu mon problème, mais cela m'a permis de voir l'erreur réelle au lieu du message de délai d'attente, ce qui m'a conduit au problème réel.
Michael
4

Si vous utilisez php 5.3, augmentez l'arriéré.

Si vous utilisez php 5.2, rétroportez le patch pour augmenter la taille du backlog de 128.

Utilisez également un socket Unix plutôt qu'un socket TCP. unix: /tmp/php5-cgi.sock (ou le chemin correspondant)

karmawhore
la source
Je dois être d'accord, en particulier avec l'utilisation du socket Unix.
Matt
Merci karmawhore pour la réponse. J'ai trouvé une solution sur la liste de diffusion nginx.
rahul286
@ rahul286 qui a répondu? Je suis intéressé!
breiti
@breiti voir mon anser ci-dessous - serverfault.com/a/179136/17440
rahul286
3

Grand merci

request_terminate_timeout = 30s

Cela fonctionne parfaitement pour moi

mais, je devais insérer la ligne dans ce fichier: "/etc/php5/fpm/pool.d/www.conf" c'est-à-dire dans la "Section Travailleur".

PHP 5.3.21-1 - Wordpress 3.5.1

http://php-fpm.org/wiki/Configuration_File

Franck
la source
J'ai eu une combinaison de facteurs qui finissent par provoquer l'erreur 502, votre recette a fait le tour de magie! Merci beaucoup!
Jorge Vicente Mendoza
2

dans mon cas (même message d'erreur nginx), certains scripts php problématiques ne se terminent pas pour s'exécuter et attendent quelque chose, ce qui ne produit plus d'enfants php5-fpm pour nginx.

réparer:

  1. ajouter un délai d'exécution autre l'a mentionné ce post. request_terminate_timeout=30s
  2. augmenter le nombre d'enfants. et tout fonctionnait comme un charme. pm.max_spare_servers=16 pm.min_spare_servers=2

maintenant tout fonctionnait comme un charme.

c2h2
la source
J'ai eu une longue demande de connexion externe dans mon script php. Recherchez ces tâches longues et mettez-y un délai d'attente.
Ali Nadalizadeh
1

J'ai eu le même problème et je l'ai résolu en supprimant complètement Apache:

yum remove httpd

Après cela, je recommande de restaurer PHP et NGINX:

/etc/init.d/nginx restart
/etc/init.d/php-fpm restart
Nikolay
la source
1
Nous n'avions alors pas d'apache sur notre serveur. Heureux de connaître votre cas car cela pourrait nous aider à l'avenir.
rahul286
0

Pour moi, le même problème s'est produit après la suppression de rabbitmq du serveur. Rien de ce qui précède n'a été utile, la réinstallation de tous les modules php5 a résolu le problème. J'avais Debian 8.2 sur ce serveur. L'espoir sera utile à quelqu'un.

Taggart Comet
la source
-1

Cela peut également aider les gens:

En fonction de votre configuration, vous devriez regarder les paramètres de configuration de fastcgi ainsi que php ... dans mon cas (j'utilise apache2 + php5-fpm) et le temps max_execution dépend également de la durée pendant laquelle le module fastcgi attend la réponse ( -délai d'inactivité) ...

http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiExternalServer

farinspace
la source
pourquoi utiliser apache2 ?? Je veux dire que vous pouvez utiliser nginx directement pour interagir avec php5-fpm. Pas besoin d'utiliser Apache quand vous avez nginx!
rahul286
Si vous utilisez nginx, si d'autres n'utilisent PAS nginx, nous espérons que cela les aidera. :-) ... Je suis tombé sur cette page à la recherche d'une question liée à Apache2 + php5-fpm
farinspace
D'accord. Je pensais que vous utilisez Nginx avec Apache pour les scripts PHP comme certaines personnes l'ont utilisé dans le passé.
rahul286