SSH oturumlarından çıkmak Apache'yi aniden öldürüyor

Aug 18 2020

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 exitSSH oturumunu sonlandırmak için çalıştırdım ve Apache daha sonra gayet iyi çalışıyor olacaktı. . Ancak şimdi, exitApache 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 appkullanırsam root, restarthizmete geçiş yaparsam , hizmetine rootgeri dönersem app, sonra oturumu sonlandırırsam Apache'yi öldürür.
  • Hizmeti SSH olarak adlandırırsam root, restartoturumu sonlandırırsam, Apache iyidir.
  • Hizmeti SSH olarak kullanırsam root, restarthizmete geçin app, geri dönün root, sonra oturumu sonlandırın, Apache iyidir.
  • Ben SSH olarak ise root, restarthizmet, oturumu sonlandırmak, SSH tekrar olarak app, 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, restartolarak hizmet rootve Apache öldürmeden oturumu sona erdirebilir.
  • Ben değiştirerek denedim /lib/systemd/system/apache2.service.d/apache2-systemd.confve çizgi değişen RemainAfterExit=noiçin RemainAfterExit=yes, bir gerçekleştirilen systemctl daemon-reloadve son olarak bir service apache2 restarthayı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 ( appkullanıcı) bir SSH oturumunda olarak oturum açmaya gerek kalmadan onu okuması için izinler vermek için en iyi uygulama rootnedir? Gibi oturum açmanın tüm nedeni , ilk etapta appolduğ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

25 MichaelHampton Aug 18 2020 at 09:43

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=noiç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-dataUbuntu'da) çalışır durumda bırakmak ve www-dataokuma / yazma için ihtiyaç duyduğu dosyalara erişim sağlamak için izinler ve ACL'ler kullanmak daha iyidir .