การออกจากเซสชัน SSH จู่ๆก็ฆ่า Apache

Aug 18 2020

โอเคนี่คือ doozy ฉันใช้ Apache 2.4 บนอินสแตนซ์เซิร์ฟเวอร์ Ubuntu 16.04 ฉันใช้สภาพแวดล้อมที่ใกล้เคียงกันสำหรับทั้งอินสแตนซ์การผลิตและการทดสอบตลอดจนอินสแตนซ์ VirtualBox ที่ใกล้เคียงกันซึ่งฉันจัดการโดยใช้ Vagrant เพื่อการพัฒนา เป็นเวลานานที่สุดที่ฉันสามารถ SSH ในอินสแตนซ์เซิร์ฟเวอร์ใด ๆ เหล่านี้ในฐานะผู้ใช้เดียวกันกับที่ Apache ทำงานภายใต้ปรับใช้การเปลี่ยนแปลงโค้ดของแอปพลิเคชันบางอย่างจากนั้นเรียกใช้exitเพื่อยุติเซสชัน SSH และ Apache จะทำงานได้ดีในภายหลัง . อย่างไรก็ตามตอนนี้ฉันไม่สามารถทำได้exitหากไม่มีบริการ Apache พบข้อผิดพลาดร้ายแรง:

[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!

หมายเหตุ:

  • ผู้ใช้ Apache appคือ
  • ถ้าฉันเป็น SSH appสลับไปroot, restartบริการเป็นrootสวิทช์กลับไปappแล้วยุติเซสชั่นที่มันฆ่าอาปาเช่
  • ถ้าฉันเป็น SSH root, restartบริการแล้วยุติเซสชั่น Apache จะปรับ
  • ถ้าฉันเป็น SSH root, restartบริการสลับไปappสลับกลับไปrootแล้วยุติเซสชั่น Apache จะปรับ
  • ถ้าฉันเป็น SSH root, restartบริการยุติเซสชั่น, SSH อีกครั้งappแล้วยุติเซสชั่นอีกครั้งมันจะฆ่าอาปาเช่
  • ก่อนที่จะมีในสัปดาห์นี้ฉันได้รับสามารถอย่างต่อเนื่องเป็น SSH appสลับไปroot, restartบริการเป็นrootและยุติเซสชั่นโดยไม่ต้องฆ่าอาปาเช่
  • ฉันได้ลองแก้ไข/lib/systemd/system/apache2.service.d/apache2-systemd.confและเปลี่ยนบรรทัดRemainAfterExit=noเป็นRemainAfterExit=yesทำ a systemctl daemon-reloadและสุดท้ายก็service apache2 restartไม่มีผล

มีคำอธิบายเกี่ยวกับพฤติกรรมที่เปลี่ยนไปอย่างกะทันหันหรือไม่? มีการแก้ไขที่เหมาะสมเพื่อเรียกคืนพฤติกรรมก่อนหน้านี้หรือไม่? ถ้าไม่เช่นนั้นแนวทางปฏิบัติที่ดีที่สุดในการปรับใช้การเปลี่ยนแปลงโค้ดแอปพลิเคชันและการให้สิทธิ์สำหรับ Apache ( appผู้ใช้) เพื่ออ่านโดยไม่จำเป็นต้องเข้าสู่เซสชัน SSH ในฐานะrootใด เหตุผลทั้งหมดในการเข้าสู่ระบบappเพื่อ จำกัด ความจำเป็นในการเข้าสู่ระบบrootในตอนแรก

ฉันสูญเสียอย่างสิ้นเชิงที่นี่และไม่เข้าใจว่าทุกอย่างจะพังลงได้อย่างไร

คำตอบ

25 MichaelHampton Aug 18 2020 at 09:43

สาเหตุหลักของสิ่งนี้คือการเปลี่ยนแปลงวิธีที่ systemd (จาก 219) จัดการกับอ็อบเจ็กต์ IPC ที่สร้างโดยผู้ใช้ที่ล็อกอิน โดยค่าเริ่มต้นจะลบวัตถุ IPC ที่เหลือหลังจากผู้ใช้ออกจากระบบ สิ่งนี้ใช้กับผู้ใช้ที่ไม่ใช่ระบบทั้งหมด (uid> = 1000) ผู้ใช้ระบบ (uid <1000) จะไม่ได้รับผลกระทบ

เนื่องจากคุณได้เปลี่ยน Apache ให้ทำงานภายใต้ผู้ใช้ที่ไม่ใช่ระบบเมื่อใดก็ตามที่คุณออกจากระบบบัญชีผู้ใช้นั้น systemd จะทำการลบอ็อบเจ็กต์ IPC ทั้งหมดของ Apache จากนั้น Apache ก็บ่นเกี่ยวกับการสูญเสีย mutex และการตาย

คุณสามารถเปลี่ยนพฤติกรรมนี้โดยการตั้งค่าRemoveIPC=noใน/etc/systemd/logind.conf(ค่าเริ่มต้นบน Ubuntu เป็นyes) systemd-logind.serviceและรีสตาร์ท

ควรปล่อยให้ Apache ทำงานในฐานะผู้ใช้ระบบ (เช่นwww-dataบน Ubuntu) และใช้สิทธิ์และ ACL เพื่อให้www-dataเข้าถึงไฟล์ที่จำเป็นในการอ่าน / เขียน