Salir de las sesiones SSH matando repentinamente a Apache
De acuerdo, esto es fantástico. Estoy ejecutando Apache 2.4 en instancias de servidor Ubuntu 16.04. Utilizo entornos casi idénticos para las instancias de producción y prueba, así como una instancia de VirtualBox casi idéntica que administro usando Vagrant para el desarrollo. Durante mucho tiempo, he podido SSH en cualquiera de estas instancias de servidor como el mismo usuario con el que se ejecuta Apache, implementar algunos cambios en el código de la aplicación y luego ejecutar exit
para finalizar la sesión SSH, y Apache funcionaría bien después . Ahora, sin embargo, no puedo hacerlo exit
sin que el servicio Apache encuentre un error fatal:
[mpm_prefork:emerg] [pid 23466] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[core:alert] [pid 17750] AH00050: Child 23466 returned a Fatal error... Apache is exiting!
Notas:
- El usuario de Apache es
app
. - Si hago SSH como
app
, cambio aroot
,restart
el servicio comoroot
, vuelvo a cambiar yapp
luego finalizo la sesión, mata a Apache. - Si SSH
root
,restart
el servicio, a continuación, finaliza la sesión, Apache está muy bien. - Si utilizo SSH como
root
,restart
el servicio, cambio aapp
, vuelvo a cambiar yroot
luego finalizo la sesión, Apache está bien. - Si SSH como
root
,restart
el servicio, finalizo la sesión, SSH de nuevo comoapp
, luego finalizo la sesión de nuevo, mata Apache. - Antes de esta semana, he sido capaz de consistentemente como SSH
app
, cambie aroot
,restart
el servicio comoroot
, y terminar la sesión sin matar Apache. - Intenté modificar
/lib/systemd/system/apache2.service.d/apache2-systemd.conf
y cambiar la líneaRemainAfterExit=no
aRemainAfterExit=yes
, realicé asystemctl daemon-reload
, y finalmenteservice apache2 restart
a sin efecto.
¿Existe alguna explicación para el cambio repentino de comportamiento? ¿Existe una solución razonable para restaurar el comportamiento anterior? Si no es así, ¿cuál sería la mejor práctica para implementar cambios en el código de la aplicación y otorgar permisos para que Apache (el app
usuario) lo lea sin necesidad de iniciar sesión en una sesión SSH como root
? La única razón para iniciar sesión app
fue para limitar la necesidad de iniciar sesión como root
en primer lugar.
Estoy completamente perdido aquí y no entiendo cómo todo pudo romperse de repente.
Respuestas
La causa principal de esto es un cambio en la forma en que systemd (desde 219) maneja los objetos IPC creados por usuarios registrados. De forma predeterminada, eliminará cualquier objeto de IPC que quede después de que el usuario cierre la sesión. Esto se aplica a todos los usuarios que no pertenecen al sistema (uid> = 1000). Los usuarios del sistema (uid <1000) no se ven afectados.
Dado que ha cambiado Apache para que se ejecute bajo un usuario que no es del sistema, cada vez que cierra la sesión de esa cuenta de usuario, systemd destruye todos los objetos IPC de Apache, y Apache luego se queja de perder su mutex y muere.
Puede cambiar este comportamiento estableciendo RemoveIPC=no
en /etc/systemd/logind.conf
(el valor por defecto en Ubuntu es yes
) y reiniciar systemd-logind.service
.
Es mejor dejar Apache ejecutándose como un usuario del sistema (por ejemplo, www-data
en Ubuntu) y usar permisos y ACL para dar www-data
acceso a los archivos que necesita para leer / escribir.