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 exitpara finalizar la sesión SSH, y Apache funcionaría bien después . Ahora, sin embargo, no puedo hacerlo exitsin 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,restartel servicio comoroot, vuelvo a cambiar yappluego finalizo la sesión, mata a Apache. - Si SSH
root,restartel servicio, a continuación, finaliza la sesión, Apache está muy bien. - Si utilizo SSH como
root,restartel servicio, cambio aapp, vuelvo a cambiar yrootluego finalizo la sesión, Apache está bien. - Si SSH como
root,restartel 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,restartel servicio comoroot, y terminar la sesión sin matar Apache. - Intenté modificar
/lib/systemd/system/apache2.service.d/apache2-systemd.confy cambiar la líneaRemainAfterExit=noaRemainAfterExit=yes, realicé asystemctl daemon-reload, y finalmenteservice apache2 restarta 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 appusuario) lo lea sin necesidad de iniciar sesión en una sesión SSH como root? La única razón para iniciar sesión appfue para limitar la necesidad de iniciar sesión como rooten 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=noen /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-dataen Ubuntu) y usar permisos y ACL para dar www-dataacceso a los archivos que necesita para leer / escribir.