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 exit
para finalizar la sesión SSH, y Apache estaría funcionando perfectamente después. . Ahora, sin embargo, no puedo evitar que exit
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
, cambioroot
alrestart
servicio comoroot
, vuelvo aapp
y luego termino la sesión, mata a Apache. - Si hago SSH como
root
serviciorestart
y luego finalizo la sesión, Apache está bien. - Si hago SSH como
root
elrestart
servicio, cambio aapp
, vuelvo aroot
y luego termino la sesión, Apache está bien. - Si hago SSH como
root
elrestart
servicio, termino la sesión, vuelvo a SSH como yapp
luego termino la sesión nuevamente, mata a Apache. - Antes de esta semana, podía utilizar SSH constantemente como
app
, cambiarroot
alrestart
servicio comoroot
y finalizar 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 finalmente aservice apache2 restart
sin 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 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 limitar la necesidad de iniciar sesión como root
en 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.conf
el valor predeterminado en Ubuntu es yes
) y reiniciando systemd-logind.service
.
Es mejor dejar Apache ejecutándose como 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 lectura/escritura.