Hace un tiempo tuve que actualizar versiones de php5 y nginx en una serie de servidores y según los iba actualizando empezaban a aparecer errores 502 Bad Gateway en los servidores Nginx. Por lo general los errores 502 Bad Gateway responden a un intento de conectar a un backend que no está levantado o escuchando en donde le decimos.
Viendo que esto ocurría de repente, me fijé en que nginx estaba soltando los siguientes errores de permission denied en php5-fpm.sock:
connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream
Sabiendo que estos servidores habían estado funcionando correctamente con anterioridad, el error de permisos en php5-fpm.sock debía de venir de la actualización propiamente.
En concreto lo que me encontré es que nginx había pasado de ejecutarse como www-data a un nuevo usuario nginx. El unix socket de php5 tenía permisos para www-data y ahí aparecía el conflicto. Para recapitular, veremos a continuación donde se configura el usuario con que se ejecutan tanto php5 como nginx en nuestro servidor:
Configurar usuario de nginx
Nginx se ejecuta con el usuario que le indiquemos en la directiva user dentro del archivo nginx.conf
user www-data;
Configurar usuario de PHP-FPM
PHP-FPM creará un socket con los permisos correspondientes a lo que le especifiquemos en las variables listen.owner, listen.group y listen.mode del archivo /etc/php5/fpm/pool.d/www.conf
listen = /var/run/php5-fpm.sock listen.owner = www-data listen.group = www-data listen.mode = 0666
Es importante conocer de antemano los cambios que introducen las actualizaciones de paquetes antes de subirlos a entornos de producción. En mi caso me encontré con estos problemas en un entorno de desarrollo.
Otra opción para sacar adelante el servicio de forma rápida habría sido levantar el PHP-FPM escuchando en un puerto TCP en vez de en un unix socket, pero eso exigiría editar todos los sites que tengamos configurados para cambiarles el backend php.
Este error también se puede manifestar con el siguiente mensaje en las peticiones de Nginx:
502 Bad Gateway