web-dev-qa-db-fra.com

PHP-FPM et Nginx: 502 mauvaise passerelle

Configuration

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

Avant d’écrire quoi que ce soit, je voudrais dire que j’ai vérifié les deux = passerelle mauvaise de nginx 502 et passerelle incorrecte de Nginx + PHP-FPM 502 , qui ont malheureusement m'a pas aidé à cet égard.

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

J'utilise un serveur Web Amazon EC2, avec le port 9000 activé, le port 80 ouvert, etc.

La question en particulier est, comment puis-je me débarrasser de cette mauvaise erreur? Ou, mieux encore, comment puis-je obtenir php5-fpm à travaille réellement.

Ce que j'ai tenté jusqu'à présent

Édition généralement cohérente des fichiers de configuration, notamment php-fpm.conf et nginx.conf.

i. php-fpm.conf

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

;;;;;;;;;;;;;
; Fpm Start ;
;;;;;;;;;;;;;

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

Maintenant, après j'ai essayé d'inclure mes fichiers de configuration:

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

Ce qui ne m'a que foutu 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 ne représente que quelques sites Web que j'ai visités, mais je peux vous affirmer qu'avant cette activité de 502 Bad Gateway, le serveur fonctionnait correctement (sans PHP ne fonctionnait pas. Période.).

Le problème réside principalement dans le fait que quelque chose ne va vraiment pas. Et maintenant, quand j'essaie de faire un service php5-fpm restart, il se bloque dans ce que je devine est une boucle infinie ou quelque chose, ce que je ne peux même pas CTRL-C hors de.

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

Si quelqu'un trouve cette page en rencontrant le même problème que moi, 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 sont pas dérangés de cliquer et de se débrouiller par eux-mêmes ...;)

La condition:

Les serveurs Ubuntu ou Debian avec NGINX et PHP 5.3 fonctionnent correctement, mais la mise à niveau de PHP vers la version 5.4 génère 502 erreurs de passerelle incorrectes. La recherche de services fonctionnant sur le port 9000 (généralement 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 symfony2 (tiré d'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

Remarque: remplacez ~ ^/(app|app_dev)\.php(/|$) { par ~ ^/index\.php(/|$) { si vous n'êtes pas sous SF2 **

J'espère que cela économise un peu de temps à quelqu'un :)

Modifier

Bien sûr, vous pouvez changer le listen = /var/run/php5-fpm.sock en listen = 127.0.0.1:9000 dans /etc/php5/fpm/pool.d/www.conf puis redémarrer php5-fpm (ce qui vous éviterait de changer de vhosts), mais vous devez supposer qu'ils ont changé php5-fpm pour fonctionner via un socket 9000 pour une raison.

Edit2

Si vous rencontrez toujours une erreur 502, consultez la réponse suivante: Une erreur nginx lors de la connexion à php5-fpm.sock a échoué (13: autorisation refusée)

152
nealio82

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

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
28
ananthan

J'ai fait tous ces réglages similaires, mais de temps en temps, j'obtenais des erreurs 501/502 (quotidiennement).

Ce sont mes paramètres sur /etc/php5/fpm/pool.d/www.conf pour éviter les erreurs nginx 501 et 502… Le serveur dispose de 16 Go de RAM. Cette configuration s’applique à un serveur 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 ces changements, redémarrez php-fpm

Sudo service php-fpm restart
10
PJunior

Si vous avez rencontré le problème après avoir mis à jour php-fpm comme moi, essayez ceci:

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

puis redémarrez php-fpm.

4
yang

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
3
Jake Wilson

Pour tous ceux qui ont du mal à aller au fond des choses, j'ai essayé de régler les délais d'attente comme suggéré, car je ne voulais pas cesser d'utiliser des sockets Unix ... après de nombreux dépannage et peu de choses à faire, j'ai constaté que le problème était en train de se poser. par l'extension APC que j'avais activée dans php-fpm il y a quelques mois. La désactivation de cette extension a résolu les erreurs intermittentes 502; la façon la plus simple de procéder consiste à commenter la ligne suivante:

;extension = apc.so

Cela a fait le tour pour moi!

2
William Emmerson

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

1
Aaron Judd

Avant de vous lancer dans la configuration de Nginx, essayez d’abord de désactiver ChromePHP.

1 - Ouvrez app/config/config_dev.yml

2 - Commentez ces lignes:

chromephp:
    type:   chromephp
    level:  info

ChromePHP contient 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.

0
Lucas Bustamante

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

0
humanity

Dans votre fichier NGINX vhost, dans le bloc location qui traite vos fichiers PHP (généralement location ~ \.php$ {) via FastCGI, vérifiez que vous avez 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:  

NGINX chemins d'accès virtuels

  • /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émarrer FPM: 

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

puis redémarrez-le avec: 

  • Sudo service <service-name> restart - Linux
  • brew services restart <service-name> - Mac
0
М.Б.

Après avoir essayé chaque solution sur le Web, j’ai fini par résoudre le problème à l’aide d’une méthode très simple, d’abord, j’ai vérifié le journal des erreurs php-fpm 

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 "

J'édite les paramètres des pools PHP-fpm 

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

J'ai modifié cette ligne 

pm.max_children = 5

À la nouvelle valeur 

pm.max_children = 10

BTW J'utilise un VPS bas de gamme avec 128 Mo de RAM Comme tout le monde, je pensais que pm.max_children ferait fonctionner mon serveur plus rapidement, consommerait moins de mémoire, mais les paramètres que nous utilisions étaient trop bas pour même démarrer le processus PHP-fpm .. Cela aide les autres, car après les avoir testés et échoués 24 heures sur 24, mon support d’hébergeur n’a pas été en mesure de résoudre le problème.

0
Salem

J'ai également constaté que cette erreur pouvait survenir lors de l'écriture de données json_encoded () sur MySQL. Pour le contourner, je base64_encode () le JSON. Veuillez noter que lors du décodage, le codage JSON peut modifier les valeurs. Nb. 24 peut devenir 24.00

0
Lionel Morrison

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

Dans mon cas, 502 se sont écartés à 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 savons exactement ce qui ne va pas, corrigez-le. Pour ces erreurs, il suffit de modifier le tampon:

fastcgi_buffers 16 512k; 
fastcgi_buffer_size 512k;
0
De Nguyen