SSH oturumlarından çıkmak Apache'yi aniden öldürüyor
Tamam, bu bir felaket. Apache 2.4'ü Ubuntu 16.04 sunucu örneklerinde çalıştırıyorum. Hem üretim hem de test örnekleri için neredeyse aynı ortamları ve ayrıca geliştirme için Vagrant kullanarak yönettiğim neredeyse özdeş bir VirtualBox örneğini kullanıyorum. En uzun süredir, Apache'nin altında çalıştığı aynı kullanıcıyla bu sunucu örneklerinden herhangi birine SSH uygulayabildim, bazı uygulama kodu değişikliklerini uyguladım ve ardından exit
SSH oturumunu sonlandırmak için çalıştırdım ve Apache daha sonra gayet iyi çalışıyor olacaktı. . Ancak şimdi, exit
Apache hizmeti ölümcül bir hatayla karşılaşmadan yapamıyorum :
[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!
Notlar:
- Apache kullanıcısı
app
. - SSH olarak
app
kullanırsamroot
,restart
hizmete geçiş yaparsam , hizmetineroot
geri dönersemapp
, sonra oturumu sonlandırırsam Apache'yi öldürür. - Hizmeti SSH olarak adlandırırsam
root
,restart
oturumu sonlandırırsam, Apache iyidir. - Hizmeti SSH olarak kullanırsam
root
,restart
hizmete geçinapp
, geri dönünroot
, sonra oturumu sonlandırın, Apache iyidir. - Ben SSH olarak ise
root
,restart
hizmet, oturumu sonlandırmak, SSH tekrar olarakapp
, sonra tekrar oturumu sonlandırmak, bu Apaçi öldürür. - Önce bu hafta, ben sürekli SSH mümkün oldum
app
, geçişroot
,restart
olarak hizmetroot
ve Apache öldürmeden oturumu sona erdirebilir. - Ben değiştirerek denedim
/lib/systemd/system/apache2.service.d/apache2-systemd.conf
ve çizgi değişenRemainAfterExit=no
içinRemainAfterExit=yes
, bir gerçekleştirilensystemctl daemon-reload
ve son olarak birservice apache2 restart
hayır etkisi ile.
Davranıştaki ani değişiklik için bir açıklama var mı? Önceki davranışı geri yüklemek için makul bir düzeltme var mı? Değilse, uygulama kodundaki değişiklikleri dağıtmak ve Apache'ye ( app
kullanıcı) bir SSH oturumunda olarak oturum açmaya gerek kalmadan onu okuması için izinler vermek için en iyi uygulama root
nedir? Gibi oturum açmanın tüm nedeni , ilk etapta app
olduğu gibi oturum açma ihtiyacını sınırlamaktı root
.
Burada tamamen kayboldum ve her şeyin birdenbire nasıl kırılabileceğini anlamıyorum.
Yanıtlar
Bunun temel nedeni, systemd'nin (219'dan itibaren) oturum açmış kullanıcılar tarafından oluşturulan IPC nesnelerini işleme şeklindeki bir değişikliktir. Varsayılan olarak, kullanıcı oturumu kapattıktan sonra kalan tüm IPC nesnelerini kaldıracaktır. Bu, tüm sistem dışı kullanıcılar için geçerlidir (uid> = 1000). Sistem kullanıcıları (uid <1000) etkilenmez.
Apache'yi sistem dışı bir kullanıcı altında çalışacak şekilde değiştirdiğiniz için, bu kullanıcı hesabından her çıkış yaptığınızda, systemd tüm Apache'nin IPC nesnelerini patlatır ve Apache muteksini kaybetmekten şikayet eder ve ölür.
Sen ayarlayarak bu davranışı değiştirebilirsiniz RemoveIPC=no
içinde /etc/systemd/logind.conf
(Ubuntu'da varsayılan yes
) ve yeniden başlatmayı systemd-logind.service
.
Apache'yi bir sistem kullanıcısı olarak (örneğin www-data
Ubuntu'da) çalışır durumda bırakmak ve www-data
okuma / yazma için ihtiyaç duyduğu dosyalara erişim sağlamak için izinler ve ACL'ler kullanmak daha iyidir .