Keluar dari sesi SSH tiba-tiba membunuh Apache

Aug 18 2020

Oke, ini doozy. Saya menjalankan Apache 2.4 pada instance server Ubuntu 16.04. Saya menggunakan lingkungan yang hampir identik untuk produksi dan pengujian contoh, serta contoh VirtualBox yang hampir identik yang saya kelola menggunakan Vagrant untuk pengembangan. Untuk waktu yang lama, saya dapat melakukan SSH ke salah satu contoh server ini sebagai pengguna yang sama yang dijalankan Apache, menerapkan beberapa perubahan kode aplikasi, dan kemudian menjalankan exituntuk menghentikan sesi SSH, dan Apache akan berjalan dengan baik sesudahnya . Sekarang, bagaimanapun, saya tidak dapat melakukan exittanpa layanan Apache yang mengalami kesalahan 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!

Catatan:

  • Pengguna Apache adalah app.
  • Jika saya SSH sebagai app, beralih ke root, restartlayanan sebagai root, beralih kembali ke app, kemudian menghentikan sesi, itu membunuh Apache.
  • Jika saya SSH sebagai root, restartlayanan, kemudian menghentikan sesi, Apache baik-baik saja.
  • Jika saya SSH sebagai root, restartlayanan, beralih ke app, beralih kembali ke root, kemudian menghentikan sesi, Apache baik-baik saja.
  • Jika saya SSH sebagai root, restartlayanan, mengakhiri sesi, SSH lagi sebagai app, kemudian mengakhiri sesi lagi, itu membunuh Apache.
  • Sebelum minggu ini, saya dapat secara konsisten SSH sebagai app, beralih ke root, restartlayanan sebagai root, dan mengakhiri sesi tanpa mematikan Apache.
  • Saya sudah mencoba memodifikasi /lib/systemd/system/apache2.service.d/apache2-systemd.confdan mengubah baris RemainAfterExit=nomenjadi RemainAfterExit=yes, melakukan a systemctl daemon-reload, dan akhirnya a service apache2 restarttanpa efek.

Adakah penjelasan untuk perubahan perilaku yang tiba-tiba? Apakah ada perbaikan yang wajar untuk memulihkan perilaku sebelumnya? Jika tidak, lalu apa praktik terbaik untuk menerapkan perubahan pada kode aplikasi dan memberikan izin kepada Apache ( apppengguna) untuk membacanya tanpa perlu masuk ke sesi SSH sebagai root? Seluruh alasan untuk masuk seperti appuntuk membatasi kebutuhan untuk masuk seperti rootdi tempat pertama.

Saya benar-benar bingung di sini dan tidak mengerti bagaimana semuanya bisa tiba-tiba rusak.

Jawaban

25 MichaelHampton Aug 18 2020 at 09:43

Akar penyebabnya adalah perubahan dalam cara systemd (dari 219) menangani objek IPC yang dibuat oleh pengguna yang masuk. Secara default, ini akan menghapus objek IPC yang tersisa setelah pengguna keluar. Ini berlaku untuk semua pengguna non-sistem (uid> = 1000). Pengguna sistem (uid <1000) tidak terpengaruh.

Karena Anda telah mengubah Apache untuk dijalankan di bawah pengguna non-sistem, setiap kali Anda keluar dari akun pengguna itu, systemd akan melakukan nukes pada semua objek IPC Apache, dan Apache kemudian mengeluh tentang kehilangan mutexnya dan mati.

Anda dapat mengubah perilaku ini dengan mengatur RemoveIPC=nodi /etc/systemd/logind.conf(default pada Ubuntu adalah yes) dan memulai ulang systemd-logind.service.

Lebih baik membiarkan Apache berjalan sebagai pengguna sistem (misalnya www-datadi Ubuntu), dan menggunakan izin dan ACL untuk memberikan www-dataakses ke file yang dibutuhkan untuk membaca / menulis.