Keluar dari sesi SSH tiba-tiba membunuh Apache
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 exit
untuk menghentikan sesi SSH, dan Apache akan berjalan dengan baik sesudahnya . Sekarang, bagaimanapun, saya tidak dapat melakukan exit
tanpa 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 keroot
,restart
layanan sebagairoot
, beralih kembali keapp
, kemudian menghentikan sesi, itu membunuh Apache. - Jika saya SSH sebagai
root
,restart
layanan, kemudian menghentikan sesi, Apache baik-baik saja. - Jika saya SSH sebagai
root
,restart
layanan, beralih keapp
, beralih kembali keroot
, kemudian menghentikan sesi, Apache baik-baik saja. - Jika saya SSH sebagai
root
,restart
layanan, mengakhiri sesi, SSH lagi sebagaiapp
, kemudian mengakhiri sesi lagi, itu membunuh Apache. - Sebelum minggu ini, saya dapat secara konsisten SSH sebagai
app
, beralih keroot
,restart
layanan sebagairoot
, dan mengakhiri sesi tanpa mematikan Apache. - Saya sudah mencoba memodifikasi
/lib/systemd/system/apache2.service.d/apache2-systemd.conf
dan mengubah barisRemainAfterExit=no
menjadiRemainAfterExit=yes
, melakukan asystemctl daemon-reload
, dan akhirnya aservice apache2 restart
tanpa 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 ( app
pengguna) untuk membacanya tanpa perlu masuk ke sesi SSH sebagai root
? Seluruh alasan untuk masuk seperti app
untuk membatasi kebutuhan untuk masuk seperti root
di tempat pertama.
Saya benar-benar bingung di sini dan tidak mengerti bagaimana semuanya bisa tiba-tiba rusak.
Jawaban
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=no
di /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-data
di Ubuntu), dan menggunakan izin dan ACL untuk memberikan www-data
akses ke file yang dibutuhkan untuk membaca / menulis.