PHP-FPM et Nginx: mauvaise passerelle 502

Configuration

  • Ubuntu Server 11.10 64 bit
  • Amazon AWS, Ec2, hébergé sur le cloud
  • t1.micro instance

Avant d’écrire quelque chose d’autre, je voudrais dire que j’ai vérifié à la fois la mauvaise passerelle nginx 502 et les threads Nginx + PHP-FPM 502 Bad Gateway , qui ne m’ont malheureusement pas aidé à cet égard.

Le problème semble assez commun: une mauvaise configuration de nginx ou php-fpm peut entraîner une erreur 502 Bad Gateway , ce que je n’ai pas réussi à éliminer. Notez que cela apparaît même lorsque je vais dans la racine de mon domaine sans spécifier de répertoire particulier.

J’exécute un serveur Web Amazon EC2, avec le port 9000 activé, le port 80 ouvert, etc.

La question est en particulier, comment puis-je me débarrasser de cette erreur méchante? Ou mieux encore, comment faire fonctionner php5-fpm ?

Ce que j’ai tenté jusqu’ici

Généralement, modification des fichiers de configuration, notamment php-fpm.conf et nginx.conf .

je. php-fpm.conf

J’ai ajouté ce qui suit, qui n’a pas beaucoup aidé:

 ;;;;;;;;;;;;; ; Fpm Start ; ;;;;;;;;;;;;; ;pm.start_servers = 20 ;pm.min_spare_servers = 5 ;pm.max_spare_servers = 35 

Maintenant, j’ai ensuite essayé d’inclure mes fichiers de configuration:

include=/etc/php5/fpm/*.conf

Ce qui ne m’a que vissé encore plus loin.

Configuration complète

 ;;;;;;;;;;;;;;;;;;;;; ; FPM Configuration ; ;;;;;;;;;;;;;;;;;;;;; ; All relative paths in this configuration file are relative to PHP's install ; prefix (/usr). This prefix can be dynamicaly changed by using the ; '-p' argument from the command line. ; Include one or more files. If glob(3) exists, it is used to include a bunch of ; files from a glob(3) pattern. This directive can be used everywhere in the ; file. ; Relative path can also be used. They will be prefixed by: ; - the global prefix if it's been set (-p arguement) ; - /usr otherwise ;include=/etc/php5/fpm/*.conf ;;;;;;;;;;;;;;;;;; ; Global Options ; ;;;;;;;;;;;;;;;;;; [global] ; Pid file ; Note: the default prefix is /var ; Default Value: none pid = /var/run/php5-fpm.pid ; Error log file ; Note: the default prefix is /var ; Default Value: log/php-fpm.log error_log = /var/log/php5-fpm.log ; Log level ; Possible Values: alert, error, warning, notice, debug ; Default Value: notice log_level = notice ; If this number of child processes exit with SIGSEGV or SIGBUS within the time ; interval set by emergency_restart_interval then FPM will restart. A value ; of '0' means 'Off'. ; Default Value: 0 ;emergency_restart_threshold = 0 ; Interval of time used by emergency_restart_interval to determine when ; a graceful restart will be initiated. This can be useful to work around ; accidental corruptions in an accelerator's shared memory. ; Available Units: s(econds), m(inutes), h(ours), or d(ays) ; Default Unit: seconds ; Default Value: 0 emergency_restart_interval = 0 ; Time limit for child processes to wait for a reaction on signals from master. ; Available units: s(econds), m(inutes), h(ours), or d(ays) ; Default Unit: seconds ; Default Value: 0 ;process_control_timeout = 0 ; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging. ; Default Value: yes daemonize = no ;;;;;;;;;;;;; ; Fpm Start ; ;;;;;;;;;;;;; ;pm.start_servers = 20 ;pm.min_spare_servers = 5 ;pm.max_spare_servers = 35 ;;;;;;;;;;;;;;;;;;;; ; Pool Definitions ; ;;;;;;;;;;;;;;;;;;;; ; Multiple pools of child processes may be started with different listening ; ports and different management options. The name of the pool will be ; used in logs and stats. There is no limitation on the number of pools which ; FPM can handle. Your system will tell you anyway :) ; To configure the pools it is recommended to have one .conf file per ; pool in the following directory: include=/etc/php5/fpm/pool.d/*.conf 

ii . nginx.conf

En toute honnêteté, cette configuration est une poignée de quelques sites Web que j’ai visités, mais je peux vous dire qu’avant cette activité 502 Bad Gateway, le serveur fonctionnait correctement (sans PHP. Période.).

Le problème réside principalement dans le fait que quelque chose est terriblement, terriblement faux. Et maintenant, quand j’essaie de faire un service php5-fpm restart , il se bloque dans ce que je pense être une boucle infinie ou quelque chose que je ne peux même pas extraire de CTRLC.

Configuration complète

 user www-data; worker_processes 1; pid /var/run/nginx.pid; events { worker_connections 64; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush off; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; server { listen 80; server_name ec2-xx-xx-xx-xx.compute-x.amazonaws.com; location ~ ^(.+\.php)(.*)$ { root /home/wayvac/public; fastcgi_pass unix:/var/run/php5-fpm.pid; #fastcgi_pass 127.0.0.1:9000; #Un-comment this and comment "fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;" if you are not using php-fpm. fastcgi_index index.php; set $document_root2 $document_root; if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; } if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; } if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; } if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; } if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; } fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root2$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root2$fastcgi_path_info; include fastcgi_params; fastcgi_param DOCUMENT_ROOT $document_root2; } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { root /home/wayvac/public; index index.html index.htm index.php; } location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { # Some basic cache-control for static files to be sent to the browser expires max; add_header Pragma public; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; } #include drop.conf; #include php.conf; } } 

Si quelqu’un trouve cette page en rencontrant le même problème que j’ai eu, j’ai trouvé la réponse ici: http://www.howtoforge.com/installing-nginx-with-php5-and-php-fpm-and-mysql-support-lemp -on-ubuntu-12.04-lts

Pour ceux d’entre vous qui ne peuvent pas être dérangés de cliquer et de travailler pour eux-mêmes …;)

La condition:

Le serveur Ubuntu ou Debian avec NGINX et PHP 5.3 fonctionne correctement, mais la mise à niveau de PHP vers la version 5.4 donne 502 erreurs liées à la mauvaise passerelle. La recherche de services exécutés sur le port 9000 (en général, l’exécution de netstat -lp ou similaire) ne renvoie rien.

Le correctif:

Ouvrez /etc/php5/fpm/pool.d/www.conf et notez le paramètre ‘listen’ (dans mon cas /var/run/php5-fpm.sock ):

 ; The address on which to accept FastCGI requests. ; Valid syntaxes are: ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on ; a specific port; ; 'port' - to listen on a TCP socket to all addresses on a ; specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. listen = /var/run/php5-fpm.sock 

et remplacez la variable fastcgi_pass dans votre vhost par l’emplacement que vous venez de noter.

Donc, cet exemple de configuration de symfony2 (prise ici: http://wiki.nginx.org/Symfony ):

  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ ^/(app|app_dev)\.php(/|$) { fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; } 

devient ceci:

  # pass the PHP scripts to FastCGI server at /var/run/php5-fpm.sock location ~ ^/(app|app_dev)\.php(/|$) { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; } 

Puis redémarrez nginx:

 sudo /etc/init.d/nginx restart 

Note: remplacez ~ ^/(app|app_dev)\.php(/|$) { avec ~ ^/index\.php(/|$) { si vous n’êtes pas sur SF2 **

J’espère que cela permet d’économiser un peu de temps 🙂

modifier

Bien sûr, vous pouvez changer le listen = /var/run/php5-fpm.sock pour listen = 127.0.0.1:9000 dans /etc/php5/fpm/pool.d/www.conf puis redémarrez php5-fpm (ce qui vous évite d’avoir à changer vos hôtes), mais vous devez supposer qu’ils ont changé php5-fpm pour passer par un socket plutôt que d’écouter sur le port 9000 pour une raison quelconque.

Edit2

Si vous rencontrez toujours une erreur 502, voyez cette réponse: erreur nginx connectez-vous à php5-fpm.sock a échoué (13: autorisation refusée)

Essayez de définir ces valeurs, cela résout le problème dans fast-cgi

 fastcgi_buffer_size 16k; fastcgi_buffers 4 16k; 

J’ai fait tous ces réglages similaires, mais de temps en temps je recevais des erreurs 501/502 (quotidiennement).

Ce sont mes parameters sur /etc/php5/fpm/pool.d/www.conf pour éviter les erreurs 501 et 502 nginx … Le serveur a 16 Go de RAM. Cette configuration est pour un serveur de RAM de 8 Go alors …

 sudo nano /etc/php5/fpm/pool.d/www.conf 

puis définissez les valeurs suivantes pour

 pm.max_children = 70 pm.start_servers = 20 pm.min_spare_servers = 20 pm.max_spare_servers = 35 pm.max_requests = 500 

Après cela, redémarrez php-fpm

 sudo service php-fpm restart 

Si vous avez rencontré le problème après avoir mis à jour php-fpm comme moi, essayez ceci: ouvrez /etc/php5/fpm/pool.d/www.conf décommentez les lignes suivantes:

 listen.owner = www-data listen.group = www-data listen.mode = 0666 

puis redémarrez php-fpm.

N’oubliez pas que php-fpm est un service. Après l’avoir installé, assurez-vous de le démarrer:

 # service php-fpm start # chkconfig php-fpm on 

Pour quiconque ayant du mal à aller au fond des choses, j’ai essayé de régler les délais d’attente comme je ne voulais pas arrêter d’utiliser les sockets Unix … après beaucoup de dépannage et peu de choses à faire, j’ai trouvé que ce problème était causé par l’extension APC que j’avais activée en php-fpm il y a quelques mois. La désactivation de cette extension a permis de résoudre les erreurs intermittentes 502, le plus simple étant de commenter la ligne suivante:

 ;extension = apc.so 

Cela a fait le tour pour moi!

Le port a été changé en 9001 en 5.4, il suffit de changer le port de 9000 à 9001 dans le nginx conf et en configuration php-fpm a fonctionné pour moi.

J’espère que cette astuce sauvera la vie de quelqu’un d’autre. Dans mon cas, le problème était que je manquais de mémoire, mais seulement légèrement, il était difficile d’y penser. 3 heures après ça. Je recommande de courir:

 sudo htop 

ou

 sudo free -m 

… avec des requêtes problématiques sur le serveur pour voir si votre mémoire n’est pas épuisée. Et si c’est le cas dans mon cas, vous devez créer un fichier d’échange (sauf si vous en avez déjà un).

J’ai suivi ce tutoriel pour créer un fichier d’échange sur Ubuntu Server 14.04 et cela fonctionnait très bien: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

J’ai également constaté que cette erreur peut être causée lors de l’écriture des données json_encoded () sur MySQL. Pour le contourner, je base64_encode () le JSON. Veuillez ne pas savoir que le décodage JSON peut modifier les valeurs. Nb. 24 peut devenir 24.00

Tout de suite après avoir essayé toutes les solutions sur le Web, j’ai fini par résoudre le problème en utilisant une méthode très simple, d’abord j’ai noté php-fpm err log

 cat /var/log/php5-fpm.log 

et l’erreur la plus répétée était

 " WARNING: [pool www] server reached pm.max_children setting (5), consider raising it " 

Je modifie les parameters des pools PHP-fpm

 nano /etc/php5/fpm/pool.d/www.conf 

J’ai chengé cette ligne

 pm.max_children = 5 

À nouvelle valeur

 pm.max_children = 10 

BTW J’utilise des VPS bas de gamme avec 128 Mo de RAM Comme tout le monde je pensais pm.max_children réutiliser pm.max_children rendrait mon serveur plus rapide à consumr moins de mémoire, mais les parameters que nous utilisons étaient trop faibles pour démarrer le processus PHP-fpm. J’espère que cela aidera les autres depuis que j’ai trouvé cela après 24 heures de test et en échec, jamais mon support webhost n’était capable de résoudre le problème.

Vous devriez voir le journal des erreurs. Par défaut, son emplacement est dans /var/log/nginx/error.log

Dans mon cas, 502 obtiennent chemin à cause de:

 GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local" 2016/05/25 11:57:28 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local" 2016/05/25 11:57:29 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local" 2016/05/25 11:57:29 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "symfony2.local" 

Lorsque nous soaps exactement ce qui ne va pas, alors réparez-le. Pour ces erreurs, modifiez simplement le tampon:

 fastcgi_buffers 16 512k; fastcgi_buffer_size 512k; 

Je suis très en retard sur ce jeu, mais mon problème a commencé lorsque j’ai mis à jour PHP sur mon serveur. J’ai pu supprimer le fichier .socket et redémarrer mes services. Ensuite, tout a fonctionné. Vous ne savez pas pourquoi cela a fait une différence, car le fichier est de taille 0 et la propriété et les permissions sont les mêmes, mais cela a fonctionné.

Avant de jouer avec Nginx config, essayez de désactiver ChromePHP en premier.

1 – Ouvrez app / config / config_dev.yml

2 – Commentez ces lignes:

 chromephp: type: chromephp level: info 

ChromePHP emballe les informations de débogage codées json dans l’en-tête X-ChromePhp-Data, qui est trop volumineux pour la configuration par défaut de nginx avec fastcgi.

Dans votre fichier NGINX vhost, dans le bloc d’emplacement qui traite vos fichiers PHP (généralement l’ location ~ \.php$ { ) via FastCGI, assurez-vous d’avoir les lignes suivantes:

 proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; fastcgi_buffer_size 16k; fastcgi_buffers 4 16k; 

Après cela, n’oubliez pas de redémarrer fpm et nginx.


Additionnel:

Chemins NGINX vhost

  • /etc/nginx/sites-enabled/ – Linux
  • ‘/ usr / local / etc / nginx / sites-enabled /’ – Mac

Redémarrez NGINX:

  • sudo service nginx restart – Linux
  • brew service restart nginx – Mac

Redémarrez FPM:

Déterminez le nom du processus fpm: – systemctl list-unit-files | grep fpm systemctl list-unit-files | grep fpm – Linux – brew services list | grep php brew services list | grep php – Mac

puis redémarrez-le avec:

  • sudo service restart – Linux
  • brew services restart – Mac