การออกจากเซสชัน SSH จู่ๆก็ฆ่า Apache
โอเคนี่คือ 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
ทำ asystemctl daemon-reload
และสุดท้ายก็service apache2 restart
ไม่มีผล
มีคำอธิบายเกี่ยวกับพฤติกรรมที่เปลี่ยนไปอย่างกะทันหันหรือไม่? มีการแก้ไขที่เหมาะสมเพื่อเรียกคืนพฤติกรรมก่อนหน้านี้หรือไม่? ถ้าไม่เช่นนั้นแนวทางปฏิบัติที่ดีที่สุดในการปรับใช้การเปลี่ยนแปลงโค้ดแอปพลิเคชันและการให้สิทธิ์สำหรับ Apache ( app
ผู้ใช้) เพื่ออ่านโดยไม่จำเป็นต้องเข้าสู่เซสชัน SSH ในฐานะroot
ใด เหตุผลทั้งหมดในการเข้าสู่ระบบapp
เพื่อ จำกัด ความจำเป็นในการเข้าสู่ระบบroot
ในตอนแรก
ฉันสูญเสียอย่างสิ้นเชิงที่นี่และไม่เข้าใจว่าทุกอย่างจะพังลงได้อย่างไร
คำตอบ
สาเหตุหลักของสิ่งนี้คือการเปลี่ยนแปลงวิธีที่ 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
เข้าถึงไฟล์ที่จำเป็นในการอ่าน / เขียน