Salir de las sesiones SSH mata repentinamente a Apache

Salir de las sesiones SSH mata repentinamente a Apache

Bien, esto es una maravilla. Estoy ejecutando Apache 2.4 en instancias de servidor Ubuntu 16.04. Utilizo entornos casi idénticos para 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 utilizar 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 estaría funcionando perfectamente después. . Ahora, sin embargo, no puedo evitar que exitel 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 rootal restartservicio como root, vuelvo a appy luego termino la sesión, mata a Apache.
  • Si hago SSH como rootservicio restarty luego finalizo la sesión, Apache está bien.
  • Si hago SSH como rootel restartservicio, cambio a app, vuelvo a rooty luego termino la sesión, Apache está bien.
  • Si hago SSH como rootel restartservicio, termino la sesión, vuelvo a SSH como y appluego termino la sesión nuevamente, mata a Apache.
  • Antes de esta semana, podía utilizar SSH constantemente como app, cambiar rootal restartservicio como rooty finalizar 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-reloady finalmente a service apache2 restartsin efecto.

¿Existe alguna explicación para el repentino cambio de comportamiento? ¿Existe una solución razonable para restaurar el comportamiento anterior? De lo contrario, ¿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 limitar la necesidad de iniciar sesión como rooten primer lugar.

Estoy completamente perdido y no entiendo cómo todo pudo romperse de repente.

Respuesta1

La causa principal de esto es un cambio en la forma en que systemd (de 219) maneja los objetos IPC creados por usuarios registrados. De forma predeterminada, eliminará cualquier objeto IPC que quede después de que el usuario cierre la sesión. Esto se aplica a todos los usuarios que no son del 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 configurando RemoveIPC=no( /etc/systemd/logind.confel valor predeterminado en Ubuntu es yes) y reiniciando systemd-logind.service.

Es mejor dejar Apache ejecutándose como usuario del sistema (por ejemplo, www-dataen Ubuntu) y usar permisos y ACL para dar www-dataacceso a los archivos que necesita para lectura/escritura.

información relacionada