L'uscita dalle sessioni SSH uccide improvvisamente Apache
Ok, questo è un doozy. Sto eseguendo Apache 2.4 su istanze del server Ubuntu 16.04. Uso ambienti quasi identici sia per istanze di produzione che di test, oltre a un'istanza VirtualBox quasi identica che gestisco utilizzando Vagrant per lo sviluppo. Per molto tempo, sono stato in grado di eseguire SSH in una qualsiasi di queste istanze del server come lo stesso utente con cui viene eseguito Apache, distribuire alcune modifiche al codice dell'applicazione e quindi eseguire exit
per terminare la sessione SSH e Apache funzionerebbe perfettamente in seguito . Ora, tuttavia, non posso fare a exit
meno che il servizio Apache incontri un errore fatale:
[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!
Appunti:
- L'utente Apache è
app
. - Se eseguo SSH come
app
, passo aroot
,restart
il servizio comeroot
, ritorni aapp
, quindi termini la sessione, Apache viene ucciso. - Se io SSH come
root
,restart
il servizio, quindi terminare la sessione, Apache va bene. - Se eseguo il SSH come
root
,restart
il servizio, passa aapp
, torna aroot
, quindi termina la sessione, Apache va bene. - Se eseguo SSH come
root
,restart
il servizio, termina la sessione, SSH di nuovo comeapp
, quindi termina nuovamente la sessione, uccide Apache. - Prima di questa settimana, sono stato in grado di eseguire costantemente SSH come
app
, passare aroot
,restart
il servizioroot
e terminare la sessione senza uccidere Apache. - Ho provato a modificare
/lib/systemd/system/apache2.service.d/apache2-systemd.conf
e cambiare la lineaRemainAfterExit=no
inRemainAfterExit=yes
, ho eseguito asystemctl daemon-reload
, e infineservice apache2 restart
a senza alcun effetto.
C'è qualche spiegazione per l'improvviso cambiamento di comportamento? Esiste una soluzione ragionevole per ripristinare il comportamento precedente? In caso contrario, quale sarebbe la migliore pratica per distribuire le modifiche al codice dell'applicazione e concedere ad Apache (l' app
utente) le autorizzazioni per leggerlo senza dover accedere a una sessione SSH come root
? L'intero motivo per accedere come app
era per limitare la necessità di accedere come root
in primo luogo.
Sono completamente perso qui e non capisco come tutto possa essere rotto all'improvviso.
Risposte
La causa principale di ciò è un cambiamento nel modo in cui systemd (da 219) gestisce gli oggetti IPC creati dagli utenti registrati. Per impostazione predefinita, rimuoverà tutti gli oggetti IPC rimasti dopo che l'utente si disconnette. Questo vale per tutti gli utenti non di sistema (uid> = 1000). Gli utenti di sistema (uid <1000) non sono interessati.
Dal momento che hai modificato Apache in modo che venga eseguito con un utente non di sistema, ogni volta che ti disconnetti da quell'account utente, systemd distrugge tutti gli oggetti IPC di Apache e Apache si lamenta di perdere il suo mutex e muore.
È possibile modificare questo comportamento impostando RemoveIPC=no
in /etc/systemd/logind.conf
(di default su Ubuntu è yes
) e riavviare systemd-logind.service
.
È meglio lasciare Apache in esecuzione come utente di sistema (ad esempio www-data
su Ubuntu) e utilizzare i permessi e gli ACL per dare www-data
accesso ai file di cui ha bisogno in lettura / scrittura.