ข้อดีของการเทียบท่า nginx และ php ในตู้คอนเทนเนอร์ที่แตกต่างกันคืออะไร?


19

ฉันเพิ่งเริ่มทำงานกับ Docker และ Kubernetes และฉันได้ดูสแต็คจำนวนมากซึ่งบางคนสร้าง nginx + php ในภาพเดียวและบางคนสร้างภาพด้วย nginx และอีกคนหนึ่งที่มี php (ติดตั้งเส้นทางเดียวกันและล้อมรอบ คอนเทนเนอร์ทั้งสองในการปรับใช้เดียวกันใน Kubernetes)

อะไรคือข้อดีของการสร้างอิมเมจเทียบท่าสองชิ้นแทนที่จะติดตั้งทั้ง nginx + php ในอันเดียวกัน

คำตอบ:


19

PHP กับ nginx มักจะทำโดยใช้ php-fpm ซึ่งเป็นกระบวนการแยกต่างหาก

การรักษาความคิดหลักของนักเทียบท่าของหนึ่งกระบวนการ (ดูจุดสิ้นสุดคำตอบสำหรับรายละเอียดเพิ่มเติมในจุดนี้) ต่อคอนเทนเนอร์สิ่งนี้เหมาะสมที่จะมีกระบวนการ nginx และกระบวนการ php-fpm ในภาชนะแยก

เมื่อการสื่อสารระหว่าง nginx และ php-fpm เกิดขึ้นผ่าน fastcgi คอนเทนเนอร์ php-fpm สามารถอยู่บนโฮสต์ที่แยกจากกันและสิ่งนี้ช่วยให้สามารถใช้คลัสเตอร์ของคอนเทนเนอร์ php-fpm ที่อยู่ด้านหลัง nginx

หลังจากกำแพงความคิดเห็นที่นี่เป็นพื้นหลังเล็ก ๆ น้อย ๆ เอกสารประกอบนักเทียบท่ามีย่อหน้าเกี่ยวกับแนวคิดที่ว่าคอนเทนเนอร์ควรมีข้อกังวลเพียงข้อเดียว

แนวคิดหลักของคอนเทนเนอร์ linux ( lxc ) คือการเรียกใช้กระบวนการในเนมสเปซที่แยกได้ที่ระดับซีพียูและหน่วยความจำนักเทียบท่าเพิ่มที่ด้านบนของการแยกที่ระดับระบบไฟล์
ข้อดีคือการประนีประนอมของกระบวนการภายในเนมสเปซนี้จะไม่อนุญาตให้อ่านหน่วยความจำของกระบวนการอื่นและดังนั้นจึงควรป้องกันการบุกรุกอื่น ๆ ในโฮสต์

ในขณะที่พูดคุยเกี่ยวกับ nginx และ php-fpm พวกเขาทำงานเป็นคู่ แต่แต่ละคนมีความกังวลของตัวเอง nginx จะทำส่วน HTTP, เส้นทาง, การตรวจสอบส่วนหัว ฯลฯ และ php-fpm จะทำการตีความรหัสและส่งกลับส่วน html เพื่อ nginx . แม้ว่าจะเป็นเรื่องปกติที่ทั้งสองจะต้องให้บริการแอพพลิเคชั่นเดียวซึ่งไม่จำเป็น

ทั้งนี้ขึ้นอยู่กับบริบทที่อาจมีคอนเทนเนอร์รวมทั้งสแต็กทั้งหมดสำหรับแอปพลิเคชันได้ง่ายขึ้นบนเวิร์กสเตชันผู้พัฒนาสำหรับตัวอย่าง แต่เหมาะสำหรับการใช้ผลิตพยายามที่จะให้การปฏิสัมพันธ์น้อยลงในภาชนะที่มีกระบวนการแยกออกจากกันในภาชนะเดียวกันกับ supervisord นำหุ้นของปัญหาที่เกิดขึ้นในระยะเวลาของกระบวนการผีดิบและเข้าสู่ระบบการจัดการ (เรื่องกันตัวอย่างที่นี่มีวัตถุประสงค์เพื่อประกอบการอธิบายเท่านั้น)

ดังนั้นในที่สุดฉันก็จะพูดถึงหน้านักเทียบท่าด้วยความสำคัญ:

ในขณะที่“ หนึ่งกระบวนการต่อคอนเทนเนอร์” มักจะเป็นกฎง่ายๆ แต่ก็ไม่ใช่กฎที่ยากและรวดเร็ว ใช้วิจารณญาณที่ดีที่สุดของคุณเพื่อให้ภาชนะบรรจุที่สะอาดและแบบแยกส่วนที่เป็นไปได้

ไม่มี "กฎกระสุนปืนเงิน" ที่ใช้กับทุกสิ่งมันเป็นความสมดุลระหว่างความซับซ้อนภายในคอนเทนเนอร์และความซับซ้อนในการปรับแต่งตู้คอนเทนเนอร์เอง


3
แนวคิดหลักคือจริง ๆ "แต่ละคอนเทนเนอร์ควรมีเพียงข้อกังวลเดียว" และ "ไม่จำเป็นต้องเป็นความจริงที่ว่าควรมีกระบวนการระบบปฏิบัติการเพียงกระบวนการเดียวต่อหนึ่งคอนเทนเนอร์" docs.docker.com/engine/userguide/eng-image/ …
2640621

ผมยอมรับว่ามันเป็นทางลัดในการนัดหยุดความคิด, Nginx ไม่ได้เป็นกระบวนการเสาหินเดียวไม่เป็น PHP-FPM แต่แทนที่กระบวนการกังวลในคำตอบของฉันและมันยังคงเป็น Nginx ตกลงไม่เส้นทาง, PHP-FPM ไม่ตีความ
Tensibai

3
คำตอบคือหนึ่งบริการหนึ่งพอร์ตต่อคอนเทนเนอร์ไม่ใช่หนึ่งกระบวนการจริงๆ ในทางตรงกันข้ามถ้าคุณมีกระบวนการที่กำลังทำงานอยู่หลายแห่งในคอนเทนเนอร์คุณต้องพิจารณากระบวนการเริ่มต้นบางอย่างการจัดการบริการการรีสตาร์ทการบันทึกอิสระการขึ้นต่อกันของแพ็คเกจอิสระมันจะซับซ้อนขึ้นเล็กน้อย และบางครั้งการแมป 1: 1 จะเปลี่ยนเป็นการแมป 1: n เมื่อปรับขนาด
Jiri Klouda

@Jiri เล่นเป็นผู้สนับสนุนของปีศาจ: ดังนั้น apache ที่อยู่ด้านหน้าของแอพ Rails ที่ใช้ postgres DB ควรอยู่ในคอนเทนเนอร์เดียวกันหรือไม่? นั่นเป็นเพียงบริการเดียวในมุมมองภายนอกหลังจากทั้งหมด
Tensibai

1
@JiriKlouda ตอบแก้ไขฉันหวังว่ามันมีรายละเอียดเพียงพอที่จะถ่ายทอดทุกจุดที่แสดงความคิดเห็น
Tensibai

4

ไม่มีประโยชน์ใดที่มีความหมายเมื่อเทียบกับการจัดการตู้สองตู้ ตราบใดที่คุณมีความสัมพันธ์แบบ 1: 1 ระหว่างกระบวนการและพวกเขามีจุดประสงค์เดียวให้ใส่ไว้ในคอนเทนเนอร์เดียวกัน


คุณหมายถึงภาพที่แตกต่างในภาชนะเดียวกันหรือไม่?
CarlosAS

คุณจะเริ่ม nginx และ php-fpm ในที่เก็บเดียวกันได้อย่างไร กรุณาเพิ่มตัวอย่าง
030

1
@ 030 นี่เป็นตัวอย่าง
CarlosAS

2
@carlos กันตัวอย่างที่ถูกต้องมากสำหรับวัตถุประสงค์ dev ผมป้องกันชนิดของสิ่งสำหรับการใช้งานการผลิตนี้ (ทำงาน supervisord ภายในภาชนะที่สามารถเปิดใน footgun ค่อนข้างง่าย)
Tensibai

ฉันไม่เห็นด้วยกับคำตอบนั้นด้วยเหตุผลนี้เซิร์ฟเวอร์ apache ที่มีการรักษาความปลอดภัย mod พูดคุยกับ Tomcat ที่พูดคุยกับเซิร์ฟเวอร์ postgresql ที่โฮสต์แอปเดียวควรพอดีภายในคอนเทนเนอร์เดียว
Tensibai

4

ที่จริงจุดหนึ่งที่ขาดหายไปที่นี่คือความยืดหยุ่นในแนวนอน มีบทความจาก Jamie Alquiza เมื่อนานมาแล้วที่กล่าวถึงเรื่องนี้:

http://archive.is/pDzz0

กล่าวโดยย่อคือคุณปรับขนาด php-fpm ในแนวนอนเพื่อให้ได้ประสิทธิภาพที่สูงขึ้น การปรับ Nginx + php-fpm ร่วมกันจะไม่ก่อให้เกิดประโยชน์ใด ๆ แก่คุณ ฉันแนะนำให้คุณทำการทดสอบความเครียด (เช่น Tsung, Gatling และอื่น ๆ ) โปรดอย่าใช้ Apache ab ซึ่งเป็นของเล่นที่เก่าแก่มาก ๆ ) เพื่อตรวจสอบสิ่งที่บทความระบุไว้ ส่วนตัวแล้วฉันมีประสบการณ์ในโลกแห่งความเป็นจริงที่พิสูจน์แล้วว่าบทความนี้เป็นเรื่องจริง

แต่มีข้อเสียอยู่สองประการ (อาจไม่ใช่สำหรับ Kubernetes) สำหรับเครื่องโลหะเปลือย / VMs:

  1. วิธีกำหนดค่า Nginx ค้นพบการเปลี่ยนแปลงคอนเทนเนอร์ php-fpm แบบไดนามิกหรือไม่ นี่คือส่วนที่ง่าย
  2. เราจะแบ่งปันระบบไฟล์ / ไฟล์เดียวกันหลังจากการปรับสเกลได้อย่างไร คอนเทนเนอร์ Nginx และ php-fpm ควรอ่านเนื้อหาเดียวกันทั้งหมดเพื่อให้เกิดความสอดคล้องกัน สิ่งนี้จะทำให้คุณเป็นส่วนของจิ๊กซอว์น้อยที่สุด (และส่วนที่สนุกที่สุด) ในการทำงาน

แก้ไข: ตอนนี้เกือบครึ่งหนึ่งของปี 2019 รุ่นเก่า php-fpm + nginx ในพ็อดเดียวกันมีการใช้งานที่แตกต่างกัน หากคุณคุ้นเคยกับบริการเครือข่ายแล้ว nginx (หรือสิ่งที่เรียกว่า Nginmesh) ทำหน้าที่เป็นรถเทียมข้างรถจักรยานยนต์เพื่อจัดการกับการจราจรที่ถูก จำกัด ตะวันออก - ตะวันตก ตะวันออก - ตะวันตก จำกัด การจราจรเป็นส่วนใหญ่ที่ใช้ในการรับรองความถูกต้องระหว่างการบริการหรือฟังก์ชั่นแฟนซีอื่น ๆ ในขณะที่บริสุทธิ์ php-fpm ไม่สามารถทำเช่นนั้น


-1

ข้อได้เปรียบคือ: คุณสามารถเรียกใช้หลายคอนเทนเนอร์ php-fpm ใน back-end เราเรียกมันว่าคลัสเตอร์ PHP ผ่านจำนวนพอร์ต ตัวอย่างพอร์ต 9000, 9001, 9002 .. และอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.