Nginx 403 prohibido para todos los archivos

192

Tengo instalado nginx con PHP-FPM en una caja de CentOS 5, pero estoy luchando para que sirva a cualquiera de mis archivos, ya sea PHP o no.

Nginx se ejecuta como www-data: www-data, y el sitio predeterminado "Bienvenido a nginx en EPEL" (propiedad de root: root con 644 permisos) se carga bien.

El archivo de configuración nginx tiene una directiva include para /etc/nginx/sites-enabled/*.conf, y tengo un archivo de configuración example.com.conf , por lo tanto:

server {
 listen 80;

 Virtual Host Name
 server_name www.example.com example.com;


 location / {
   root /home/demo/sites/example.com/public_html;
   index index.php index.htm index.html;
 }

 location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  PATH_INFO $fastcgi_script_name;
  fastcgi_param  SCRIPT_FILENAME  /home/demo/sites/example.com/public_html$fastcgi_script_name;
  include        fastcgi_params;
 }
}

A pesar de que public_html es propiedad de www-data: www-data con 2777 permisos de archivos, este sitio no sirve ningún contenido,

 [error] 4167#0: *4 open() "/home/demo/sites/example.com/public_html/index.html" failed (13: Permission denied), client: XX.XXX.XXX.XX, server: www.example.com, request: "GET /index.html HTTP/1.1", host: "www.example.com"

He encontrado muchas otras publicaciones con usuarios que obtienen 403s de nginx, pero la mayoría de las que he visto involucran configuraciones más complejas con Ruby / Passenger (que en el pasado he tenido éxito) o solo están recibiendo errores cuando el PHP ascendente -FPM está involucrado, por lo que parecen ser de poca ayuda.

¿He hecho algo tonto aquí?

Angus Irlanda
fuente
mira

Respuestas:

333

Un requisito de permiso que a menudo se pasa por alto es que un usuario necesita x permisos en cada directorio padre de un archivo para acceder a ese archivo. Verifique los permisos en /, / home, / home / demo, etc. para acceder a www-data x. Supongo que / home es probablemente 770 y www-data no puede atravesarlo para acceder a cualquier subdirectorio. Si es así, intente chmod o + x / home (o cualquier directorio que niegue la solicitud).

EDITAR: para mostrar fácilmente todos los permisos en una ruta, puede usar namei -om /path/to/check

kolbyjack
fuente
66
Igual que aquí. En mi instalación de CentOS 6, los directorios / home / user están configurados en 700 de manera predeterminada.
jjt
2
Este chico también habla de eso: ( chmod -4 +x /mypathfuncionó para mí) nginxlibrary.com/403-forbidden-error
Peter Ehrlich
1
¿Alguien puede explicar por qué este comportamiento es diferente a apache que NO requiere que cada directorio padre tenga permisos "x"?
JoshuaDavid
3
No es diferente. La única razón por la cual apache no requeriría permiso x en los directorios principales es si se ejecuta como root.
kolbyjack
Terminé agregando el usuario www-data a mi grupo de usuarios personal y haciendo un chmod 710 a mi carpeta de usuario raíz. Trabajado como un encanto. (En una distribución basada en Debian)
basicdays
299

Si aún ve permission denieddespués de verificar los permisos de las carpetas principales, puede ser SELinux restringir el acceso.

Para verificar si SELinux se está ejecutando:

# getenforce

Para deshabilitar SELinux hasta el próximo reinicio:

# setenforce Permissive

Reinicie Nginx y vea si el problema persiste. Para permitir que nginx sirva a su directorio www (asegúrese de volver a activar SELinux antes de probar esto, es decir, setenforce Enforcing)

# chcon -Rt httpd_sys_content_t /path/to/www

Vea mi respuesta aquí para más detalles.

Kurt
fuente
1
No pude entender por qué cada vez que comencé nginx decía que open() "/usr/share/nginx/logs/xxxxxx.com-error_log" failed (13: Permission denied)después de verificar los permisos y asegurarme de que se iniciara como root. Encontré esto y descubrí que SELinux estaba habilitado. Lo deshabilité y ahora funciona sin problemas. ¡Gracias!
ub3rst4r
1
¡Gracias! Todavía tenía un problema con el permiso negado para los usuarios que poseen sus propias tomas de FPM, así que era capaz de solucionar que uno cambiando el userde nginx a raíz de /var/nginx/nginx.conf- quizás que ayuden a otra persona que se encuentra con este problema. S / O a DataPsyche para la segunda parte.
Invierno
11
Este es el comportamiento predeterminado en CentOS 7 también.
timss
44
Estoy con todos los que comentaron. Estaba listo para tirar mi computadora por la ventana. Nginx se configuró correctamente, los permisos se configuraron correctamente, incluso fui tan lejos para hacer todo 777 y todavía obtuve permisos denegados por error.
Oficial
2
En Centos 7 (SELinux habilitado), la solución más simple para mí fue setsebool httpd_read_user_content on(Para los archivos estáticos alojados desde un directorio de inicio, modificados para que sean legibles en todo el mundo) - Aunque supongo que el método anterior de @ KapiteinWitbaard es más seguro.
TimStaley
62

Resolví este problema agregando configuraciones de usuario.

en nginx.conf

worker_processes 4;
user username;

cambie el 'nombre de usuario' con el nombre de usuario de Linux

Anderson
fuente
44
Creo que esta respuesta es mejor en seguridad que la respuesta aceptada. No tiene que perder el tiempo con los permisos en su carpeta de inicio (que podría contener información confidencial) y si está haciendo desarrollo con nginx, le ahorra tener que cargar permisos de archivos extraños a SCM.
CamelBlues
Los permisos agregados en el directorio de inicio se ejecutan, no se leen, por lo que no se revela (en teoría) información confidencial (excepto, en este caso, tal vez a un script PHP malicioso que se repite hacia arriba y conoce la ubicación de los archivos confidenciales dentro de otro directorio accesible a www-data). También notará que en la pregunta original, mi nginx se estaba ejecutando como "www-data": los valores de configuración aquí ya estaban configurados según lo deseado.
Angus Irlanda
2
También tenía que agregar el grupo de usuarios: grupo de usuarios.
Gabriel A. Zorrilla
También funcionó para mí (al igual que cambiar el directorio a nginx: nginx). Sin embargo, prefiero esta solución para poder tener mi raíz de documento propiedad de otro usuario que no sea nginx. Gracias Anderson por señalar esto.
kvdv
Me salvó el día. Por cierto, ¿qué sucede si la máquina tiene varios usuarios y cada usuario tiene su propio sitio web, cómo lo manejo?
psychok7
38

Tengo este error y finalmente lo resolví con el siguiente comando.

restorecon -r /var/www/html

El problema se produce cuando mueves algo de un lugar a otro. Conserva el contexto de selinux del original cuando lo mueve, por lo que si descomprime algo en / home o / tmp, se le dará un contexto de selinux que coincide con su ubicación. Ahora envía esto a / var / www / html y toma el contexto que dice que pertenece a / tmp o / home con él y que la política no permite que httpd acceda a esos archivos.

Si copia los archivos en lugar de mv, el contexto de selinux se asigna de acuerdo con la ubicación a la que está copiando, no de dónde proviene. La ejecución de restorecon restablece el contexto a su valor predeterminado y también lo corrige.

jsina
fuente
1
Gracias @jsina, esto me ayudó mucho
Pankaj Garg
1
Maldición, +1 , yo también.
jww
24

He probado diferentes casos y solo cuando el propietario se configuró en nginx ( chown -R nginx:nginx "/var/www/myfolder"), comenzó a funcionar como se esperaba.

Andron
fuente
1
Me funcionó a mi también. Sospecho que esto sucede porque aunque nginx se inicia como root, genera procesos bajo el usuario que se especifica en el archivo nginx.conf, que es "user nginx;" por defecto. Cambiar el usuario al usuario propietario de la raíz del documento también debería funcionar como sugirió Anderson.
kvdv
Sr. Anderson ¡No! Andron;)
Andron
Disculpas Sr. Andron;) Parece que ya no puedo editar el comentario anterior ...
kvdv
Claro, no hay problema. Ahora estaba como Anderson :) y necesito escribir algunos cuentos de hadas ...
Andron
1
¿No es esto un problema de seguridad?
gontard
6

Si está utilizando SELinux, simplemente escriba:

sudo chcon -v -R --type=httpd_sys_content_t /path/to/www/

Esto solucionará el problema de permiso.

David Ding
fuente
1

Antigua pregunta, pero tuve el mismo problema. Intenté todas las respuestas anteriores, nada funcionó. Sin embargo, lo que me solucionó fue eliminar el dominio y agregarlo nuevamente. Estoy usando Plesk e instalé Nginx DESPUÉS de que el dominio ya estaba allí.

Sin embargo, primero hice una copia de seguridad local en / var / www / backups. Entonces podría copiar fácilmente los archivos.

Extraño problema ...

David
fuente
1

Tuvimos el mismo problema al usar Plesk Onyx 17. En lugar de perder el tiempo con los derechos, etc., la solución fue agregar un usuario nginx al grupo psacln, en el que todos los demás propietarios del dominio (usuarios) eran:

usermod -aG psacln nginx

Ahora nginx tiene derechos para acceder a .htaccess o cualquier otro archivo necesario para mostrar correctamente el contenido.

Por otro lado, también asegúrese de que Apache esté en el grupo psaserv, para servir contenido estático:

usermod -aG psaserv apache

¡Y no olvide reiniciar Apache y Nginx en Plesk después! (y volver a cargar páginas con Ctrl-F5)

Slavomir Miskovec
fuente
Esta es la respuesta correcta y es muy probable usermod -aG username www-dataen la mayoría de las configuraciones.
Dario Zadro
0

Me metí en una ligera variante de este problema al ejecutar el setfaclcomando por error . Corrí:

sudo setfacl -m user:nginx:r /home/foo/bar

Abandoné esta ruta a favor de agregar nginxal foogrupo, pero esa ACL personalizada estaba frustrando los intentos de nginx de acceder al archivo. Lo borré ejecutando:

sudo setfacl -b /home/foo/bar

Y entonces nginx pudo acceder a los archivos.

danvk
fuente
0

Si está utilizando PHP, asegúrese de que la indexdirectiva NGINX en el bloque del servidor contenga un index.php:

index index.php index.html;

Para obtener más información, consulte la directiva de índice en la documentación oficial.

Francisco Zanatta
fuente
0

Estaba enfrentando el mismo problema, pero las soluciones anteriores no ayudaron.

Entonces, después de mucha lucha, descubrí que sestatus estaba configurado para hacer cumplir lo que bloquea todos los puertos y al establecerlo en permisivo se resolvieron todos los problemas.

sudo setenforce 0

Espero que esto ayude a alguien como yo.

Harvey
fuente
Si bien eso podría haber solucionado su problema, ¡felicidades! - eso es un poco triste :-( Ver stopdisablingselinux.com - ¿podría encontrar una solución diferente?
Angus Irlanda