Error de nginx conectarse a php5-fpm.sock falló (13: Permiso denegado)

290

Actualizo nginx a 1.4.7 y php a 5.5.12 , después de eso recibí el error 502 . Antes de actualizar todo funciona bien.

nginx-error.log

2014/05/03 13:27:41 [crit] 4202#0: *1 connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream, client: xx.xxx.xx.xx, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "xx.xx.xx.xx"

nginx.conf

user  www www;
worker_processes  1;

        location / {
            root   /usr/home/user/public_html;
            index  index.php index.html index.htm;
        }
        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME    /usr/home/user/public_html$fastcgi_script_name;
            include fastcgi_params;
        }
Peter
fuente
3
Este informe de error explica por qué sucede esto: bugs.php.net/bug.php?id=67060
Matt Cooper
1
Todos los que vengan de una actualización de Ubuntu 14 a 16 necesitan cambiar el calcetín a unix: /var/run/php/php7.0-fpm.sock
Karussell

Respuestas:

626

Tuve un error similar después de la actualización de php. PHP corrigió un error de seguridad donde otenía rwpermiso para el archivo socket.

  1. Abierto /etc/php5/fpm/pool.d/www.confo/etc/php/7.0/fpm/pool.d/www.conf , según su versión.
  2. Descomente todas las líneas de permiso, como:

    listen.owner = www-data
    listen.group = www-data
    listen.mode = 0660
  3. Reiniciar fpm - sudo service php5-fpm restartosudo service php7.0-fpm restart

Nota : si su servidor web se ejecuta como un usuario que no sea www-data, deberá actualizar el www.confarchivo en consecuencia

Xander
fuente
11
Dado que esto hace que el socket sea grabable para absolutamente todos, no puedo evitar pensar que esta es una solución horrible.
Shadur
11
Este enfoque restaura la configuración predeterminada insegura resuelta en bugs.php.net/bug.php?id=67060 ; considere en su lugar la solución listen.owner sugerida por artooro.
Chris Burgess
2
Muy confuso. ¿Por qué no editar su respuesta para que sea correcta? (Ir a / etc ...) y luego comentar sobre cómo hay una forma menos segura que solo funciona hasta el reinicio (Ir a / var / ..).
SamGoody
1
@Tecnocat ¿Por qué es menos seguro? Creo que son los mismos. www-data y 660. Entonces, no entiendo lo que está mal.
Xander
13
sudo usermod -aG www-data nginxpermite que nginx acceda al archivo
AnthumChris
107

Todas las correcciones mencionadas actualmente aquí básicamente habilitan el agujero de seguridad nuevamente.

Lo que terminé haciendo es agregar las siguientes líneas a mi archivo de configuración PHP-FPM.

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

Asegúrese de que www-data sea en realidad el usuario con el que se está ejecutando el trabajador nginx. Para debian es www-data por defecto.

Hacerlo de esta manera no habilita el problema de seguridad que se suponía que este cambio debía solucionar .

artooro
fuente
16
Para comprobar el nombre de usuario nginxps aux|grep nginx
SamGoody
2
En Ubuntu en /etc/php5/fpm/php.ini
Reality Extractor
1
@RealityExtractor No lo creo. Ese archivo solo contiene configuraciones generales de PHP, nada relacionado con el administrador de procesos FPM.
Martijn Heemels
44
Para mí, también tuve que eliminar manualmente /var/run/php5-fpm.sock, ya que fue creado por www-data. Solo un
aviso
1
Esta es la solución adecuada, en cuanto a seguridad.
jschorr
45

La solución de @ Xander funciona, pero no persiste después de un reinicio.

Me di cuenta que tenía que cambiar listen.modea 0660en /etc/php5/fpm/pool.d/www.conf.

Muestra de www.conf:

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions. 
; Default Values: user and group are set as the running user
;                 mode is set to 0660
;listen.owner = www-data
;listen.group = www-data
;listen.mode = 0660

Editar: @Chris Burgess, he cambiado esto al método más seguro.

Eliminé el comentario para listen.mode, .group y .owner:

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

/ var / run Solo contiene información sobre el sistema en ejecución desde el último arranque, por ejemplo, usuarios actualmente conectados y demonios en ejecución. ( http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard#Directory_structure ).

Nota al margen:

Mis php5-fpm -vInformes: PHP 5.4.28-1+deb.sury.org~precise+1. El problema también ocurrió después de una actualización reciente.

Eric C
fuente
55
Este enfoque restaura la configuración predeterminada insegura resuelta en bugs.php.net/bug.php?id=67060 ; considere en su lugar la solución listen.owner sugerida por artooro.
Chris Burgess
Si listen.acl_groupsse establece, listen.ownery listen.groupse ignoran. Configuré listen.acl_groups =, luego el problema 502 / permisos desapareció. Lo encontré después de descomentar las listen.líneas como se systemctl status php-fpmindicó anteriormente, el problema 502 persistió y mostró la advertencia WARNING: [pool www] ACL set, listen.owner = 'nobody' is ignored.
idoimaging
37

Si ha intentado todo en esta publicación pero no está teniendo éxito para que PHP funcione, esto es lo que lo solucionó para mi caso:

Asegúrese de tener estas líneas sin comentarios en /etc/php5/fpm/pool.d/www.conf:

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

Asegúrese de que / etc / nginx / fastcgi_params tenga este aspecto:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  PATH_INFO          $fastcgi_script_name;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Estas dos líneas faltaban en mi / etc / nginx / fastcgi_params, ¡asegúrese de que estén allí!

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO          $fastcgi_script_name;

Luego, reinicie php5-fpm y nginx. Debería hacer el truco.

aMMT
fuente
2
Muchas gracias! Estaba perdiendo todas mis esperanzas, esto me salvó el trasero.
Diego Castro el
1
Eres mi héroe, salvaste el día!
jeppeb 01 de
1
¡No hay palabras que puedan describir lo agradecido que estoy! Después de actualizar los paquetes, todo salió mal y esto salvó el día.
Nikola Prokopić
Quiero darte más de uno +
g9m29
28

De hecho, "listen.mode" debería ser: "0660" y no "0666", ya que Other Writable u Other Readable nunca es una buena opción aquí.

Por lo tanto, trate de averiguar qué usuario / grupo ejecuta su servidor web. Yo uso CentOs y se ejecuta como usuario "nginx" Así que agregue a su php-fpm.conf:

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

finalmente reiniciar php-fpm

CRHenkie
fuente
Por lo que vale, en mi sistema Ubuntu 12.04, el usuario y el grupo lo son www-data.
Brad
1
Para mí en CentOS, funcionó para establecer el usuario como "nadie" y el grupo como "nginx". Probablemente no sea una mejora importante, pero preferiría otorgar permisos tan limitados como sea posible.
Kzqai
23

Verifique qué usuario ejecuta nginx. A partir de Ubuntu 12.04, nginx se ejecuta por un usuario nginx que no es miembro del grupo www-data.

usermod -a -G www-data nginx

y reiniciar los demonios nginx y php5-fpm resuelve el problema.

Çağatay Gürtürk
fuente
Esta solución parece ser la más limpia y segura. Trabajó en Ubuntu 14.04, Nginx 1.7.10, PHP 5.5.9-1ubuntu4.6 (fpm-fcgi)
AnthumChris
12

Alternativa a ampliar los permisos en su configuración de php, puede cambiar el usuario especificado en su configuración de nginx.

En la primera línea de su extracto nginx.conf anterior, el usuario y el grupo se especifican como www y www, respectivamente.

user  www www;

Mientras tanto, su configuración php probablemente especifica un usuario y un grupo de datos de www:

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

Puede cambiar la línea en su nginx.conf, a cualquiera de los siguientes, entonces:

user www-data www;
user www-data www-data; # or any group, really, since you have the user matching
user www www-data; # requires that your php listen.mode gives rw access to the group
JellicleCat
fuente
¡Muchas gracias!
Aline Matos
¡Muchas gracias! Cambiar nginx.conf es necesario.
LCB
7

También se debe tener en cuenta sus grupos FPM individuales, si los hay.

No pude entender por qué ninguna de estas respuestas me funcionó hoy. Este había sido un escenario para establecer y olvidar para mí, donde había olvidado que listen.user y listen.group se duplicaban por grupo.

Si utilizó grupos para diferentes cuentas de usuario como lo hice yo, donde cada cuenta de usuario posee sus procesos y sockets FPM, establecer solo las opciones de configuración predeterminadas listen.owner y listen.group en 'nginx' simplemente no funcionará. Y obviamente, dejar que 'nginx' los posea a todos tampoco es aceptable.

Para cada grupo , asegúrese de que

listen.group = nginx

De lo contrario, puede dejar la propiedad del grupo y tal solo.

Ted Phillips
fuente
Gracias. Si Ngnix funciona para diferentes cuentas de usuario, debe cambiarse así "listen.group = nginx"
MURATSPLAT
6

Acabo de recibir este error nuevamente hoy cuando actualicé mi máquina (con actualizaciones para PHP) que ejecuta Ubuntu 14.04 . El archivo de configuración de distribución /etc/php5/fpm/pool.d/www.confestá bien y no requiere ningún cambio actualmente.

Encontré los siguientes errores:

dmesg | grep php
[...]
[ 4996.801789] traps: php5-fpm[23231] general protection ip:6c60d1 sp:7fff3f8c68f0 error:0 in php5-fpm[400000+800000]
[ 6788.335355] traps: php5-fpm[9069] general protection ip:6c5d81 sp:7fff98dd9a00 error:0 in php5-fpm[400000+7ff000]

Lo extraño fue que tengo 2 sitios en ejecución que utilizan PHP-FPM en esta máquina, uno estaba funcionando bien y el otro (una instalación RSS de Tiny Tiny) me dio un 502, donde ambos funcionaban bien antes .

Comparé ambos archivos de configuración y descubrí que fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;faltaba para el sitio afectado.

Ambos archivos de configuración ahora contienen el siguiente bloque y vuelven a funcionar bien:

location ~ \.php$ {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include /etc/nginx/snippets/fastcgi-php.conf;
}

Actualizar

Cabe señalar que Ubuntu incluye dos archivos de parámetros relacionados con fastcgi y también un fragmento de configuración que está disponible desde Vivid y también en la versión PPA . La solución se actualizó en consecuencia.

Diferencia de los archivos de parámetros fastcgi:

$ diff -up fastcgi_params fastcgi.conf
--- fastcgi_params      2015-07-22 01:42:39.000000000 +0200
+++ fastcgi.conf        2015-07-22 01:42:39.000000000 +0200
@@ -1,4 +1,5 @@

+fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
 fastcgi_param  QUERY_STRING       $query_string;
 fastcgi_param  REQUEST_METHOD     $request_method;
 fastcgi_param  CONTENT_TYPE       $content_type;

Fragmento de configuración en /etc/nginx/snippets/fastcgi-php.conf

# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;
LiveWireBT
fuente
3
Muchas gracias. Tengo el mismo problema. Es extraño que en el paquete no se incluya esta línea. Solo lo agrego a / etc / nginx / fastcgi_params y todo funciona nuevamente ahora.
Bukashk0zzz
5

La siguiente solución simple funcionó para mí, evitando posibles problemas de permisos con el zócalo.

En su configuración nginx, establezca fastcgi_pass en:

fastcgi_pass   127.0.0.1:9000;

En vez de

fastcgi_pass   /var/run/php5-fpm.sock;

Esto debe coincidir con el parámetro listen = en /etc/php5/fpm/pool.d/www.conf, así que también configúrelo en:

listen = 127.0.0.1:9000;

Luego reinicie php5-fpm y nginx

service php5-fpm restart

Y

service nginx restart

Para obtener más información, consulte: https://wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm/

supershnee
fuente
Si bien esto puede ponerlo en marcha, no es una solución para solucionar un problema de calcetines.
Chris
5

El problema en mi caso fue que el servidor web Nginx se estaba ejecutando como usuario nginx y el grupo se estaba ejecutando como usuario www-data.

Resolví el problema cambiando el usuario en el que se está ejecutando Nginx en el /etc/nginx/nginx.confarchivo (podría ser diferente en su sistema, el mío es Ubuntu 16.04.1)

Cambio: user nginx;

a: user www-data;

luego reinicie Nginx: service nginx restart

EarthMind
fuente
4

Simple pero funciona ..

listen.owner = nginx
listen.group = nginx

chown nginx:nginx /var/run/php-fpm/php-fpm.sock
Terry Lin
fuente
Según tengo entendido, esto no sobrevivirá a un reinicio, por lo que es más una solución temporal.
Chris
4

He solucionado el mismo problema en Amazon Linux AMI 2016.09 (Centos 7) siguiendo estos pasos.

Abra sus archivos www.conf (Ejemplo: sudo nano /etc/php-fpm.d/www.conf) Por último, busque las líneas que configuran listen.owner y listen.group y cambie sus valores de "nobody" a "nginx ":

listen.owner = nginx
listen.group = nginx
listen.mode = 0666

Por último, busque las líneas que establecen el usuario y el grupo y cambie sus valores de "apache" a "nginx":

user = nginx
group = nginx

Reinicie php-fpm (reinicio del servicio sudo php-fpm)

Nanhe Kumar
fuente
2
Use 660 en lugar de 666. 666 es inseguro y fue corregido por este parche bugs.php.net/…
Xander
3

Lo más importante aquí es qué usuario está usando nginx, entonces ¿necesita especificarlo también?

en su nginx.conf

user www-data;
worker_processes  1;

        location / {
            root   /usr/home/user/public_html;
            index  index.php index.html index.htm;
        }
        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME    /usr/home/user/public_html$fastcgi_script_name;
            include fastcgi_params;
        }

en tu www.conf

listen.owner = www-data
listen.group = www-data
;listen.mode = 0660

en su caso, el usuario y el grupo son "www", así que simplemente reemplácelo.

  • reiniciar nginx y php fpm
Erenss
fuente
2

Si tiene un grupo diferente por usuario, asegúrese de que el usuario y el grupo estén configurados correctamente en el archivo de configuración. Puede encontrar el usuario nginx en el archivo /etc/nginx/nginx.conf. El grupo nginx es igual que el usuario nginx.

user = [pool-user]
group = [pool-group]
listen.owner = [nginx-user]
listen.group = [nginx-group]

fuente
2

Verifique también SELINUX (/ etc / selinux):

# getenforce

apágalo:

# setenforce 0
alquimista
fuente
1
Nunca debe optar por reducir la seguridad de un sistema para que algo funcione, sino utilizar una de las muchas opciones en las otras respuestas para resolver su problema. ¡No desactive selinux sin una razón extremadamente buena para hacerlo!
SlyDave
2

En mi caso, php-fpm no se estaba ejecutando en absoluto, así que solo tuve que iniciar el servicio 😂

service php7.3-fpm start
#on ubuntu 18.04
Nómada de la tecnología
fuente
2

Sólo ve /etc/php5/php-fpm.conf pid = /var/run/php5-fpm.pid archivo IS PID

En archivo /etc/php5/fpm/pool.d/www.conf

listen = /var/run/php5-fpm.sock IS SOCKET file

si pide igual listen ( pid = /var/run/php5-fpm.sock and listen = /var/run/php5-fpm.sock) -> configuración incorrecta y terminar sett/etc/php5/fpm/pool.d/www.conf

user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
Bogdik
fuente
1

Solo para agregar, en CentOS (y probablemente Red Hat y Fedora) el archivo para cambiar los permisos está en:

/etc/php-fpm.d/www.conf

Adrian Stride
fuente
1

Después de actualizar Ubuntu 14.04 lts a Ubuntu 16.04 lts, ​​encontré una razón más para este error que no había visto antes.

Durante el proceso de actualización, de alguna manera había perdido mi ejecutable php5-fpm por completo. Todos los archivos de configuración estaban intactos y me tomó un tiempo darme cuenta de queservice php5-fpm start realmente no comenzaba un proceso, ya que no mostraba ningún error.

Mi momento de despertar fue cuando noté que no había ningún archivo de socket /var/run/php5-fpm.sock, como debería haber, ni tampoconetstat -an mostraba procesos que escuchaban en el puerto que intenté como alternativa al intentar resolver este problema. Como el archivo / usr / sbin / php5-fpm tampoco existía, finalmente estaba en el camino correcto.

Para resolver este problema, actualicé php de la versión 5.5 a la 7.0. apt-get install php-fpmhizo el truco como efecto secundario. Después de eso e instalando otros paquetes necesarios, todo volvió a la normalidad.


Sin embargo, esta solución de actualización puede tener problemas propios . Como php ha evolucionado bastante, es posible que el software se rompa de formas inimaginables. Entonces, a pesar de que seguí ese camino, es posible que desee mantener la versión que le gusta solo por un tiempo más.

Afortunadamente, parece que hay una buena manera de hacerlo , como se describe en el sitio Personalizar Windows:

add-apt-repository ppa:ondrej/php
apt-get purge php5-common
apt-get update
apt-get install php5.6

Una solución más ordenada como podría ser, no lo intenté. Espero que los próximos días me digan si debería haberlo hecho.

sankari
fuente
1

Tuve el error similar.

Todas las recomendaciones no ayudaron.

El único reemplazo de www-data con nginx ha ayudado a:

$ sudo chmod nginx:nginx /var/run/php/php7.2-fpm.sock

/var/www/php/fpm/pool.d/www.conf

user = nginx
group = nginx
...
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
Alexander Gavriliuk
fuente
Hola @Alexander, debes usar el comando chown para cambiar los propietarios a nginx. Esto realmente me ayudó mucho.
Pratik Ghela
0

Cambié el sistema operativo en mi servidor varias veces tratando de obtener el sistema más cómodo.

Solía ​​funcionar muy bien la mayor parte del tiempo, pero finalmente recibí este error 502 Gateway.

Utilizo un socket php fpm para cada cuenta en lugar de mantener el mismo para todos. Entonces, si uno falla, al menos las otras aplicaciones siguen ejecutándose.

Solía ​​tener datos de usuario y grupo www. Pero esto cambió en mi Debian 8 con la última versión de Nginx 1.8 y php5-fpm.

El usuario predeterminado es nginx y también lo es el grupo. Para estar seguro de esto, la mejor manera es verificar los archivos / etc / group y / etc / passwd. Estos no pueden mentir.

Es allí donde descubrí que ahora tengo nginx en ambos y ya no www-data.

Tal vez esto pueda ayudar a algunas personas que todavía intentan descubrir por qué sigue apareciendo el mensaje de error.

Funcionó para mi.

Marc Quattrini
fuente
0

Para aquellos que intentaron todo en este hilo y todavía se atascaron: Esto resolvió mi problema. Actualicé /usr/local/nginx/conf/nginx.conf

  1. Descomente la línea que dice user

  2. haz que www-datase convierta en:user www-data;

  3. Guárdelo (se requiere acceso de root)

  4. Reiniciar nginx

Davis
fuente
0

Si tienes declaraciones

pid = /run/php-fpm.pid

y

escuchar = /run/php-fpm.pid

en diferentes archivos de configuración, entonces root será el propietario de este archivo.

IvanTheFirst
fuente