PHP-FPM y Nginx: 502 Bad Gateway


78

Configuración

  • Ubuntu Server 11.10 de 64 bits
  • Amazon AWS, Ec2, alojado en la nube
  • instancia t1.micro

Antes de escribir cualquier otra cosa, me gustaría decir que he comprobado los subprocesos de nginx 502 bad gateway y Nginx + PHP-FPM 502 Bad Gateway , que desafortunadamente no me han ayudado en este sentido.

El problema parece ser bastante común: una configuración incorrecta de nginx o php-fpm puede provocar un 502 Bad Gatewayerror, que es algo de lo que no he podido deshacerme. Tenga en cuenta que esto aparece incluso cuando voy a la raíz de mi dominio , sin especificar ningún directorio en particular.

Estoy ejecutando un servidor web Amazon EC2, con el puerto 9000 habilitado, el puerto 80 abierto, etc.

La pregunta en particular es, ¿cómo puedo deshacerme de este desagradable error? O, mejor aún, ¿cómo puedo ponerme php5-fpma trabajar ?

Lo que he intentado hasta ahora

Edición mayoritariamente consistente de archivos de configuración, en particular php-fpm.confy nginx.conf.

yo. php-fpm.conf

Agregué lo siguiente, que no ha ayudado mucho:

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

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

Ahora, luego intenté incluir mis archivos de configuración:

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

Lo que solo me jodió aún más.

Configuración completa

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

Honestamente, esta configuración es un puñado de algunos sitios web que he visitado, pero puedo decirles que antes de este negocio de 502 Bad Gateway, el servidor funcionaba bien (sin PHP funcionando. Punto).

El problema radica principalmente en el hecho de que algo está terriblemente, terriblemente mal. Y ahora, cuando intento hacer una service php5-fpm restart, se cuelga en lo que supongo es un bucle infinito o algo, que no puedo ni siquiera CTRL- Cde.

Configuración completa

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

Respuestas:


151

Si alguien encuentra esta página y encuentra el mismo problema que tuve, encontré la respuesta aquí .

Para aquellos de ustedes que no pueden molestarse en hacer clic y resolverlo por sí mismos ...;)

La condición:

El servidor Ubuntu o Debian con NGINX y PHP 5.3 funciona bien, pero actualizar PHP a 5.4 da 502 errores Bad Gateway. Buscar servicios que se ejecutan en el puerto 9000 (normalmente en ejecución netstat -lpo similar) no devuelve nada.

La solución:

Abra /etc/php5/fpm/pool.d/www.confy tome nota del parámetro 'escuchar' (en mi caso /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

y reemplace la variable fastcgi_pass en su vhost con la ubicación que acaba de anotar.

Entonces, esta configuración de muestra de Symfony2 (tomada de aquí ):

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

se convierte en esto:

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

Luego reinicia nginx:

sudo /etc/init.d/nginx restart

Nota: reemplace ~ ^/(app|app_dev)\.php(/|$) {con ~ ^/index\.php(/|$) {si no está en SF2 **

Espero que esto le ahorre a alguien un poco de tiempo :)

Editar

Por supuesto, puede cambiar listen = /var/run/php5-fpm.socka listen = 127.0.0.1:9000in y /etc/php5/fpm/pool.d/www.confluego reiniciar php5-fpm (lo que le evitaría tener que cambiar sus vhosts), pero debe asumir que cambiaron php5-fpm para que se ejecute a través de un socket en lugar de escuchar en el puerto 9000 para un razón.

Editar2

Si sigues experimentando el error 502, consulta esta respuesta .


2
Los conectores Unix son sólo marginalmente más rápido y podrían fallar bajo carga pesada drupal.org/node/1635622#comment-6814968
Desmond Hume

no ayudó, ya estaba configurado así, y sigo experimentando 502 todo el tiempo.
vsync

Una puerta de enlace incorrecta solo significa que Nginx no puede encontrar PHP. ¿Está seguro de que el servicio php-fpm está instalado y funcionando? Intente reiniciarlo si se está ejecutando, tal vez esté colgando.
nealio82

@Nealio Estoy usando un servidor ubuntu que ejecuta nginx. ¿Sabes dónde puedo encontrar exactamente el archivo al que se refiere # 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; }?
user111671

1
Parece que han cambiado esto recientemente y lo hicieron para que siempre use los números de puerto originales, es decir127.0.0.1:9000
marksyzm

28

Intente establecer estos valores, resuelve el problema en fast-cgi

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;

Esto lo hizo por mí. Fue bastante difícil de precisar ya que el error fastcgi se truncó en el registro de nginx. ¡Gracias!
jrhorn424

1
adelante, configúrelo en 64k para Symfony2.3 :) la salida de error de Symfony parece abrumar los búferes ...
Stefan

2
@Jusfeel Estas opciones deben agregarse al archivo de configuración de nginx.
biphobe

Qué milagrosa solución. Gracias
enero

¡Apliqué a Siwapp instalado bajo nginx y funciona muy bien! Muchas gracias :)
akajack

11

Hice todos estos ajustes similares, pero de vez en cuando recibía errores 501/502 (diariamente).

Esta es mi configuración en /etc/php5/fpm/pool.d/www.conf para evitar errores 501 y 502 nginx… El servidor tiene 16 Gb de RAM. Esta configuración es para un servidor RAM de 8 Gb, así que ...

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

luego establezca los siguientes valores para

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

Después de estos cambios, reinicie php-fpm

sudo service php-fpm restart

4

Si encontró el problema después de actualizar php-fpm como yo, intente esto: abra /etc/php5/fpm/pool.d/www.conf, descomente las siguientes líneas:

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

luego reinicie php-fpm.


También lo resolvió para mí. El archivo conf estaba /etc/php/php-fpm.d/www/confen Arch Linux. Tenga en cuenta que la configuración de permisos en 0666probablemente no sea adecuada para producción. En cambio, un servidor de producción debe coincidir con el usuario de Nginx y el usuario de PHP-FPM y mantener los permisos 0660para aumentar la seguridad.
conradkleinespel

3

No olvides que php-fpmes un servicio. Después de instalarlo, asegúrese de iniciarlo:

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

2

Para cualquier otra persona que esté luchando por llegar al fondo de esto, intenté ajustar los tiempos de espera como se sugirió, ya que no quería dejar de usar sockets Unix ... después de mucha resolución de problemas y no mucho para continuar, descubrí que este problema se estaba causando por la extensión APC que habilité en php-fpm hace unos meses. La desactivación de esta extensión resolvió los errores 502 intermitentes, la forma más sencilla de hacerlo era comentando la siguiente línea:

;extension = apc.so

¡Esto me sirvió!


1

El puerto se cambió a 9001 en 5.4, simplemente cambiar el puerto de 9000 a 9001 en nginx conf y en la configuración php-fpm funcionó para mí.


1

Espero que este consejo salve la vida de otra persona. En mi caso el problema fue que me quedé sin memoria, pero solo un poco, era difícil pensar en ello. Perdí 3 horas en eso. Recomiendo correr:

sudo htop

o

sudo free -m

... junto con ejecutar solicitudes problemáticas en el servidor para ver si su memoria no se agota. Y si funciona como en mi caso, debe crear un archivo de intercambio (a menos que ya tenga uno).

He seguido este tutorial para crear un archivo de intercambio en Ubuntu Server 14.04 y funcionó bien: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/


1

Debería ver el registro de errores. De forma predeterminada, su ubicación está en /var/log/nginx/error.log

En mi caso, 502 se sale debido a:

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"

Cuando sepamos exactamente qué está mal, corríjalo. Para estos errores, simplemente modifique el búfer:

fastcgi_buffers 16 512k; 
fastcgi_buffer_size 512k;

0

También descubrí que este error puede deberse al escribir datos json_encoded () en MySQL. Para evitarlo, baso64_encode () el JSON. Tenga en cuenta que cuando se decodifica, la codificación JSON puede cambiar los valores. Nótese bien. 24 pueden convertirse en 24,00


0

Muy bien, después de probar todas las soluciones en la web, terminé solucionando el problema con un método muy simple, primero verifiqué php-fpm err log

cat /var/log/php5-fpm.log 

y el error más repetido fue

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

Edito la configuración de los pools PHP-fpm

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

Chenged esta línea

pm.max_children = 5

A un nuevo valor

pm.max_children = 10

Por cierto, estoy usando un VPS de gama baja con 128 MB de ram. Como todos los demás, pensaba que redusarlo pm.max_childrenhará que mi servidor se ejecute más rápido y consuma menos memoria, pero la configuración que usamos era demasiado baja para iniciar el proceso PHP-fpm. Espero que esto ayude a otros, ya que encontré esto después de 24 horas de pruebas y fallas, pero mi soporte de alojamiento web no pudo resolver el problema.


0

Llego muy tarde a este juego, pero mi problema comenzó cuando actualicé php en mi servidor. Pude simplemente eliminar el archivo .socket y reiniciar mis servicios. Entonces, todo funcionó. No estoy seguro de por qué hizo la diferencia, ya que el archivo es de tamaño 0 y la propiedad y los permisos son los mismos, pero funcionó.


0

Antes de jugar con la configuración de Nginx, primero intente deshabilitar ChromePHP.

1 - Abra la aplicación / config / config_dev.yml

2 - Comenta estas líneas:

chromephp:
    type:   chromephp
    level:  info

ChromePHP empaqueta la información de depuración codificada en json en el encabezado X-ChromePhp-Data, que es demasiado grande para la configuración predeterminada de nginx con fastcgi.



0

En su archivo vhost de NGINX, en el bloque de ubicación que procesa sus archivos PHP (generalmente location ~ \.php$ {) a través de FastCGI, asegúrese de tener las siguientes líneas:

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

Después de eso, no olvide reiniciar fpm y nginx.


Adicional:

Rutas de NGINX vhost

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

Reinicie NGINX:

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

Reinicie FPM:

Determine el nombre del proceso fpm: - systemctl list-unit-files | grep fpm- Linux - brew services list | grep php- Mac

y luego reinícielo con:

  • sudo service <service-name> restart - Linux
  • brew services restart <service-name> - Mac

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.