L'uscita dalle sessioni SSH uccide improvvisamente Apache

Aug 18 2020

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 exitper terminare la sessione SSH e Apache funzionerebbe perfettamente in seguito . Ora, tuttavia, non posso fare a exitmeno 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 a root, restartil servizio come root, ritorni a app, quindi termini la sessione, Apache viene ucciso.
  • Se io SSH come root, restartil servizio, quindi terminare la sessione, Apache va bene.
  • Se eseguo il SSH come root, restartil servizio, passa a app, torna a root, quindi termina la sessione, Apache va bene.
  • Se eseguo SSH come root, restartil servizio, termina la sessione, SSH di nuovo come app, quindi termina nuovamente la sessione, uccide Apache.
  • Prima di questa settimana, sono stato in grado di eseguire costantemente SSH come app, passare a root, restartil servizio roote terminare la sessione senza uccidere Apache.
  • Ho provato a modificare /lib/systemd/system/apache2.service.d/apache2-systemd.confe cambiare la linea RemainAfterExit=noin RemainAfterExit=yes, ho eseguito a systemctl daemon-reload, e infine service apache2 restarta 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' apputente) le autorizzazioni per leggerlo senza dover accedere a una sessione SSH come root? L'intero motivo per accedere come appera per limitare la necessità di accedere come rootin primo luogo.

Sono completamente perso qui e non capisco come tutto possa essere rotto all'improvviso.

Risposte

25 MichaelHampton Aug 18 2020 at 09:43

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=noin /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-datasu Ubuntu) e utilizzare i permessi e gli ACL per dare www-dataaccesso ai file di cui ha bisogno in lettura / scrittura.