PHP FPM da permiso denegado?

9

Leí varias entradas sobre por qué PHP-FPM podría darme permiso denegado, pero no puedo resolverlo.

Los registros de error se leen como:

    2013/04/20 23:33:28 [crit] 15479#0: *6 open() "/var/lib/nginx/tmp/fastcgi
/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 
99.999.999.999, server: example.net, request: "GET /wp-admin/ HTTP/1.1", 
upstream: "fastcgi://unix:/tmp/php-fpm.sock:", host: "example.net", referrer:    
"http://example.net/"

Estoy un poco pero perdido:

  1. He configurado / var / lib / nginx / tmp en ec2-user (incluso +777 todo para verificar)
  2. He configurado /tmp/php-fpm.sock en ec2-user
  3. el archivo nginx conf está configurado en ec2-user
  4. php-conf está configurado para usuario y grupo ec2-user
  5. ps aux proporciona ec2-user en todos los procesos php-fpm y nginx

Mi configuración de Nginx incluye muchos archivos, la configuración básica es:

user              ec2-user ec2-user;
worker_processes  5;  
error_log /opt/nginx/error.log;    
pid        /var/run/nginx.pid;    
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /opt/nginx/access.log main;    
    sendfile        on;
    keepalive_timeout  65;
    client_max_body_size 13m;
    index index.php index.html index.htm;
    upstream php {
       server unix:/tmp/php-fpm.sock;
    }
    include /etc/nginx/conf.d/*.conf;
    include /mnt/web/nginx/conf.d/*.conf;
}

mi /etc/nginx/conf.d/ está vacío mi /mnt/web/nginx/conf.d contiene MUCHAS configuraciones de sitios web que incluyen "wordpress.conf":

location / {
    try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 24h;
    log_not_found off;
}
location ~ \.php$ {
    try_files $uri =404;    
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php;
}

Mi /opt/php/etc/php-fpm.conf:

include=/opt/php/etc/fpm.d/*.conf
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-fpm.sock
user = ec2-user
group = ec2-user
pm = dynamic
pm.max_children = 250
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
pm.status_path = /fpm-status
ping.path = /fpm-ping
slowlog = log/$pool.log.slow
catch_workers_output = yes

ACTUALIZACIÓN: encontró el problema, póngalo en la respuesta

Edelwater
fuente
1
¿está habilitado selinux? ejecutar getenforce o cat / selinux / enforce si no está habilitado 0
silviud
1
¿Cuál es el resto de su configuración nginx?
Michael Hampton
1
su socket del archivo de registro es /tmp/php-fpm.sock pero cambió / var / lib / nginx / tmp - ¿hizo chroot en nginx?
silviud
1
enviar la salida desde el comando mount
silviud
1
también mire que todos los directorios en su hogar ... vea serverfault.com/questions/170192/…
silviud

Respuestas:

16

Había configurado / var / lib / nginx / tmp en ec2-user / ec2-user (incluso +777 todo para verificar)

Pero ... también tuve que configurar / var / lib / nginx en ec2-user / ec2-user

... después también chown / chgrp la carpeta padre nginx: no más errores.

Me tomó algunas horas ...

Edelwater
fuente
77
chown -Rf www-data:www-data /var/lib/nginxtrabajó para mi. no necesitaba chmod nada.
Chris
comprobación de los archivos de registro ayuda siempre, recuerde revisar antes de nada :)
tristeza poesía
9

Esto generalmente sucede. Cuando la userconfiguración en nginx.conf se cambia de

user nginx;

a otra cosa En este caso,

user ec2-user ec2-user;

El comando chmod no es necesario según el comentario de Chris, y podría abrir un agujero de seguridad.

Solución:

Verifique la propiedad actual de usuarios y grupos en / var / lib / nginx.

$ ls -ld /var/lib/nginx
drwx------ 3 nginx nginx 4096 Aug  5 00:05 /var/lib/nginx

Esto le indica que un usuario y un grupo posiblemente inexistente llamado nginxpropietario de esta carpeta. Esto evita la carga de archivos.

Cambie la propiedad de la carpeta al usuario definido en nginx.conf en este caso ec2-user(es posible que no se requiera sudo).

$ sudo chown -Rf ec2-user:ec2-user /var/lib/nginx

Verifique que realmente haya cambiado.

$ ls -ld /var/lib/nginx
drwx------ 3 ec2-user ec2-user 4096 Aug  5 00:05 /var/lib/nginx

El error de permiso denegado ahora debería desaparecer. Verifique el error.log (basado en la ubicación nginx.conf error_log).

$ sudo nano /opt/nginx/error.log

Si eso no funciona, es posible que deba volver a cargar nginx y php-fpm.

$ sudo service nginx reload
$ sudo service php-fpm reload
nu everest
fuente
Eso funcionó en mi servidor de Google Cloud Centos 7.
Damodar Bashyal
3

Ninguna de las otras soluciones funcionó para mí, pero encontré que esto funciona:

$ apt-get install php-pear php5-dev
$ pecl install timezonedb
$ echo 'extension=timezonedb.so'> /etc/php5/mods-available/timezonedb.ini
$ ln -sf /etc/php5/mods-available/timezonedb.ini /etc/php5/conf.d/30-timezonedb.ini
$ service php5-fpm restart

Fuente

nulovariable
fuente
Ok, probamos varias soluciones y esta es la que funcionó. No sabemos por qué funcionó o cuál fue el problema, pero lo hizo.
Neil Masters
1

Tengo un problema similar con la carga de archivos. error nginx 500 2015/07/05 03:50:36 [crit] 3656#0: *7 open() "/var/lib/nginx/tmp/client_body/0000000007" failed (13: Permission denied), client: 10.0.2.2, server: www.test.com, request: "POST /api/v1/users HTTP/1.1", host: "test"

El problema estaba relacionado solo con el permiso, solo lo configuré chmod -R 755 /var/lib/nginxy las cosas funcionaron

Bishwanath Jha
fuente
0

Acabo de resolver mi problema con los permisos. La forma más fácil y más simple era no ejecutar php-fpm o nginx como sudo (superusuario). Lo que deberías hacer es:

  1. Chown todas las ubicaciones de salida de registro para nginx a yourUserName: yourUserName ejemplo :chown yourUserName:yourUserName /var/log/nginx/error.log
  2. Siguiente actualización del servidor dir también ejemplo :chown yourUserName:yourUserName -R /var/www

Al no usar root no tuve que cambiar el usuario o grupo php-fpm ni ningún usuario o grupo que escucha. Asegúrese de comentar también nginx.conf 'usuario', ya que será el nombre del usuario actual.

clh
fuente
No publique la misma respuesta varias veces. Además, este problema ha sido resuelto durante mucho tiempo.
Sven
0

En lugar de editar permisos en / var / lib / nginx / lo que sea, ¿no tendría más sentido simplemente decirle a nginx que use una ruta diferente como / tmp / nginx? Esto solucionó el problema para mí:

# create the directory
mkdir /tmp/nginx
chown -R nginx.nginx /tmp/nginx (assumes nginx user is named nginx)
chmod -R 700 /tmp/nginx

Los permisos / tmp / nginx deben ser de preferencia 700 (lo cual no debería ser un problema siempre que el propietario sea el mismo usuario especificado en la directiva /etc/nginx/nginx.conf 'user') o 770 si por alguna razón necesita tener un propietario de archivo diferente y nginx para realizar E / S a través de permisos de grupo. Nunca he visto eso pero quién sabe.

En centos7, edite /etc/nginx/nginx.conf para indicarle a nginx que use ese nuevo directorio para los cuerpos de los clientes.

...

http {
  ...
  client_body_temp_path /tmp/nginx 1 2;
  ...
}

y reinicie nginx (nuevamente centos7)

systemctl restart nginx
siliconrockstar
fuente
Nunca chmod 777 nada. ¡Especialmente no el caché! Ahora cualquier usuario local puede reescribir su caché y enviar datos potencialmente maliciosos a sus usuarios. Para las cargas, alguien podría sustituir su propia carga.
Michael Hampton
Jesús, relájate, esta compilación es parte de un clúster de demostración. Pero es una buena captura para las personas que quizás no conozcan mejor, editaré la respuesta.
siliconrockstar el