Te sugerimos que pruebes esta solución en un ambiente controlado antes de pasarlo a producción, un saludo.
El problema de permisos ocurre porque uwsgi restablece la propiedad y los permisos de /tmp/uwsgi.sock a 755 y el usuario ejecuta uwsgi cada vez que se inicia uwsgi.
La forma correcta de resolver el problema es hacer que uwsgi cambie la propiedad y/o el permiso de /tmp/uwsgi.sock para que nginx pueda escribir en este socket. Por lo tanto, hay tres soluciones posibles.
-
Ejecute uwsgi como usuario www-data para que este usuario sea propietario del archivo de socket creado por él.
uwsgi -s /tmp/uwsgi.sock -w my_app:app --uid www-data --gid www-data
-
Cambie la propiedad del archivo de socket para que sea propiedad de www-data.
uwsgi -s /tmp/uwsgi.sock -w my_app:app --chown-socket=www-data:www-data
-
Cambie los permisos del archivo de socket, para que www-data pueda escribir en él.
uwsgi -s /tmp/uwsgi.sock -w my_app:app --chmod-socket=666
Prefiero el primer enfoque porque no deja a uwsgi ejecutándose como root.
Los dos primeros comandos deben ejecutarse como usuario root. El tercer comando no necesita ejecutarse como usuario root.
El primer comando deja a uwsgi ejecutándose como usuario de www-data. Los comandos segundo y tercero dejan uwsgi ejecutándose como el usuario real que ejecutó el comando.
El primer y segundo comando permiten que solo el usuario de www-data escriba en el socket. El tercer comando permite que cualquier usuario escriba en el socket.
Prefiero el primer enfoque porque no deja a uwsgi ejecutándose como usuario raíz y no hace que el archivo de socket se pueda escribir en todo el mundo.
Si bien la solución aceptada es true también puede ser que SELinux esté bloqueando el acceso. Si configuró los permisos correctamente y aún recibe mensajes de permiso denegado, intente:
sudo setenforce Permissive
Si funciona, entonces SELinux tuvo la culpa, ¡o más bien funcionó como se esperaba! Para agregar los permisos necesarios para nginx
hacer:
# to see what permissions are needed.
sudo grep nginx /var/log/audit/audit.log | audit2allow
# to create a nginx.pp policy file
sudo grep nginx /var/log/audit/audit.log | audit2allow -M nginx
# to apply the new policy
sudo semodule -i nginx.pp
Después de eso, restablezca la política de SELinux para hacer cumplir con:
sudo setenforce Enforcing
Tienes que establecer estos permisos (chmod
/chown
) en la configuración de uWSGI.
Es el chmod-socket
y el chown-socket
.
http://uwsgi-docs.readthedocs.org/en/latest/Options.html#chmod-socket http://uwsgi-docs.readthedocs.org/en/latest/Options.html#chown-socket
Más adelante puedes encontrar las críticas de otros desarrolladores, tú incluso eres capaz dejar el tuyo si lo deseas.