Salir de las sesiones SSH matando repentinamente a Apache

Aug 18 2020

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 a root, restartel servicio como root, vuelvo a cambiar y appluego 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 a app, vuelvo a cambiar y rootluego finalizo la sesión, Apache está bien.
  • Si SSH como root, restartel servicio, finalizo la sesión, SSH de nuevo como app, luego finalizo la sesión de nuevo, mata Apache.
  • Antes de esta semana, he sido capaz de consistentemente como SSH app, cambie a root, restartel servicio como root, y terminar la sesión sin matar Apache.
  • Intenté modificar /lib/systemd/system/apache2.service.d/apache2-systemd.confy cambiar la línea RemainAfterExit=noa RemainAfterExit=yes, realicé a systemctl daemon-reload, y finalmente service 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

25 MichaelHampton Aug 18 2020 at 09:43

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.