PHP-FPM et Nginx: 502 Bad Gateway

Configuration

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

avant d'écrire quoi que ce soit d'autre, je tiens à préciser que j'ai coché à la fois nginx 502 bad gateway et Nginx + PHP-FPM 502 Bad Gateway threads, qui malheureusement n'ont pas aidé moi à cet égard.

le problème semble être assez courant: une mauvaise configuration de Nginx ou php-fpm peut conduire à une erreur 502 Bad Gateway , qui est quelque chose que je n'ai pas été en mesure de me débarrasser. Notez que cela apparaît même si 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 erreur désagréable? Ou, mieux encore, Comment puis-je obtenir php5-fpm à réellement travailler .

Ce que j'Ai Essayé jusqu'à Présent

édition essentiellement cohérente 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 tout à fait aidé beaucoup:

;;;;;;;;;;;;;
; 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

qui ne m'a fait encore plus de mal.

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 petite partie de quelques sites Web que j'ai visités, mais je peux vous dire qu'avant cette mauvaise affaire de passerelle 502, le serveur fonctionnait très bien (sans que PHP ne fonctionne). Période.).

Le problème réside principalement dans le fait que quelque chose est terriblement, terriblement mal. Et maintenant, quand j'essaie de faire un service php5-fpm restart , il est accroché dans ce que je devine est une boucle infinie ou quelque chose, 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 ; }
            if ($document_root2 ~ "^(.*\).*?[\|/]../(.*)$") { set $document_root2 ; }
            if ($document_root2 ~ "^(.*\).*?[\|/]../(.*)$") { set $document_root2 ; }
            if ($document_root2 ~ "^(.*\).*?[\|/]../(.*)$") { set $document_root2 ; }
            if ($document_root2 ~ "^(.*\).*?[\|/]../(.*)$") { set $document_root2 ; }
            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;
    }
}
75
demandé sur Community 2012-04-04 05:50:19

14 réponses

si quelqu'un trouve cette page en rencontrant le même problème que j'avais, 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 se donner la peine de cliquer et de le découvrir par eux-mêmes... ;)

La Condition:

Ubuntu ou Debian server avec NGINX et PHP 5.3 fonctionne bien, mais la mise à niveau de PHP à 5.4 donne 502 mauvaises erreurs de passerelle. La recherche de services fonctionnant sur le port 9000 (généralement netstat -lp ou similaire) ne retourne rien.

La correction:

ouvrir /etc/php5/fpm/pool.d/www.conf et noter 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 remplacer la variable fastcgi_pass dans votre vhost par l'emplacement que vous venez de noter.

donc cet exemple de configuration symfony2 (pris 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:

  # 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: remplacer ~ ^/(app|app_dev)\.php(/|$) { par ~ ^/index\.php(/|$) { si vous N'êtes pas sous SF2**

Espère que cela sauve quelqu'un un peu de temps :)

Modifier

bien sûr, vous pouvez changer le listen = /var/run/php5-fpm.sock en listen = 127.0.0.1:9000 en /etc/php5/fpm/pool.d/www.conf puis redémarrer php5-fpm (ce qui vous éviterait d'avoir à changer vos vhosts), mais vous devez supposer qu'ils ont changé php5-fpm pour courir à travers une socket plutôt que d'écouter sur le port 9000 pour une raison.

Edit2

si vous rencontrez toujours une erreur 502 voyez ceci réponse: NGINX erreur connectez-vous à php5-fpm.chaussette a échoué (13: Permission denied)

151
répondu nealio82 2017-05-23 11:46:51

essayer de définir ces valeurs, il résout problème dans fast-cgi

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
28
répondu ananthan 2012-05-22 07:08:34

j'ai fait tous ces ajustements similaires, mais de temps en temps je recevais 501/502 erreurs (quotidien).

ce sont mes paramètres 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 RAM de 8 Go donc...

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

définit ensuite 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 ce redémarrage change php-fpm

sudo service php-fpm restart
10
répondu PJunior 2015-12-22 00:58:46

si vous rencontrez le problème après avoir mis à jour php-fpm comme moi, essayez ceci: ouvrez le fichier /etc/php5/fpm/pool.d / www.conf supprimer les lignes suivantes:

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

puis redémarrez php-fpm.

4
répondu yang 2015-01-30 05:25:07

N'oubliez pas que php-fpm est un service. Après l'installation, assurez-vous de commencer:

# service php-fpm start
# chkconfig php-fpm on
3
répondu Jake Wilson 2014-06-11 06:45:17

pour tous ceux qui ont du mal à aller au fond des choses, j'ai essayé d'ajuster les temps morts comme suggéré car je ne voulais pas arrêter D'utiliser des sockets Unix...après beaucoup de dépannage et peu de choses à faire, j'ai découvert que ce problème était causé 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 facile de le faire était en commentant la ligne suivante:

;extension = apc.so

le truc pour moi!

2
répondu William Emmerson 2015-06-23 19:27:39

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

1
répondu Aaron Judd 2013-08-04 07:07:25

espérons que ce tuyau sauvera la vie de quelqu'un d'autre. Dans mon cas, le problème était que je manquais de mémoire, mais à peine, était difficile d'y penser. Gaspillage de 3h. Je recommande l'exécution:

sudo htop

ou

sudo free -m

...avec l'exécution de requêtes problématiques sur le serveur pour voir si votre mémoire ne s'épuise pas. Et si cela fonctionne comme dans mon cas, vous devez créer un fichier de pagination (sauf si vous en avez déjà un).

j'ai suivi ce tutoriel pour créer un fichier de pagination sur le serveur Ubuntu 14.04 et ça a très bien fonctionné: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

1
répondu Rav 2015-02-12 15:37:07

j'ai aussi trouvé que cette erreur peut être causée en écrivant des données json_encoded() à MySQL. Pour le contourner, Je base64_encode () le JSON. S'il vous plaît pas que lorsque décodé, l'encodage JSON peut changer les valeurs. Nb. 24 peut devenir 24,00

0
répondu Lionel Morrison 2015-11-09 22:53:50

très bien après avoir essayé toutes les solutions sur le web, j'ai fini par comprendre la question en utilisant une méthode très simple , d'abord j'ai cheked 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 modifier PHP-fpm piscines paramètre

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

je chenged Cette Ligne

pm.max_children = 5

à la nouvelle valeur

pm.max_children = 10

BTW j'utilise des VPS bas de gamme avec 128Mo de ram comme tout le monde , je pensais que la refonte pm.max_children permettrait à mon serveur de fonctionner plus rapidement et consommerait moins de mémoire, mais le réglage que nous avons utilisé était trop bas pour même démarrer le processus PHP-fpm . J'espère que cela aidera les autres depuis que je l'ai trouvé après 24 heures d'essai et d'échec , jamais mon soutien webhost n'ont été en mesure de résoudre le problème .

0
répondu Salem F 2016-04-29 15:39:50

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

dans mon cas, 502 get way à 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"

quand on sait exactement ce qui ne va pas, on le Répare. Pour ces erreurs, il suffit de modifier le buffer:

fastcgi_buffers 16 512k; 
fastcgi_buffer_size 512k;
0
répondu De Nguyen 2016-05-25 05:04:37

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 seulement de supprimer les .socket file et redémarrez mes services. Puis, tout a fonctionné. Je ne sais pas pourquoi cela a fait une différence, puisque le fichier est de taille 0 et la propriété et les permissions sont les mêmes, mais cela a fonctionné.

0
répondu humanity 2017-05-28 15:44:28

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

1 - Ouvrez l'app/config/config_dev.yml

2 - Commentaire de ces lignes:

chromephp:
    type:   chromephp
    level:  info

ChromePHP pack debug info JSON-encodé dans L'en-tête X-ChromePhp-Data, qui est trop grand pour la configuration par défaut de nginx avec fastcgi.

0
répondu Lucas Bustamante 2017-08-17 14:33:29

dans votre fichier vhost NGINX, dans le bloc de localisation qui traite vos fichiers PHP (habituellement location ~ \.php$ { ) par 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.


supplémentaire:

NGINX vhost paths

  • /etc/nginx/sites-enabled/ - Linux
  • '/ usr/local / etc/nginx/sites-enabled / '- Mac

Restart NGINX:

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

redémarrer FPM:

déterminer le nom du procédé fpm: - systemctl list-unit-files | grep fpm - Linux - brew services list | grep php - Mac

et puis redémarrez avec:

  • sudo service <service-name> restart - Linux
  • brew services restart <service-name> - Mac
0
répondu М.Б. 2018-05-23 17:32:46