ฉันมีไซต์ Django ที่ทำงานบน Gunicorn ด้วย reverse proxy ผ่าน Nginx Nginx ไม่ใช่แค่ค่าใช้จ่ายที่ไม่จำเป็นเพิ่มขึ้นใช่ไหม? การเพิ่มที่ด้านบนของ Gunicorn ช่วยได้อย่างไร
ฉันมีไซต์ Django ที่ทำงานบน Gunicorn ด้วย reverse proxy ผ่าน Nginx Nginx ไม่ใช่แค่ค่าใช้จ่ายที่ไม่จำเป็นเพิ่มขึ้นใช่ไหม? การเพิ่มที่ด้านบนของ Gunicorn ช่วยได้อย่างไร
คำตอบ:
ฉันจะมุ่งเน้นไปที่พฤติกรรมไคลเอนต์ที่ช้าและการกำหนดค่าของคุณจัดการกับมันได้อย่างไร แต่อย่าถูกล่อลวงให้เชื่อว่านั่นเป็นประโยชน์เพียงอย่างเดียว วิธีการเดียวกันที่ให้ประโยชน์แก่ลูกค้าที่ช้าก็มีประโยชน์สำหรับลูกค้าที่รวดเร็วการจัดการ SSL การจัดการกับปริมาณการใช้งานและด้านอื่น ๆ ของการให้บริการ HTTP บนอินเทอร์เน็ต
Gunicorn เป็นซอฟต์แวร์ล่วงหน้า สำหรับการสื่อสารเวลาแฝงต่ำเช่น load balancer ไปยังเซิร์ฟเวอร์แอพหรือการสื่อสารระหว่างบริการระบบ pre-fork สามารถประสบความสำเร็จอย่างมาก ไม่มีค่าใช้จ่ายในการปั่นกระบวนการเพื่อจัดการคำขอและกระบวนการเดียวสามารถทุ่มเทให้กับการจัดการคำขอเดียว การกำจัดสิ่งเหล่านี้สามารถนำไปสู่ระบบโดยรวมที่เร็วขึ้นและมีประสิทธิภาพมากขึ้นจนกระทั่งจำนวนการเชื่อมต่อพร้อมกันเกินจำนวนกระบวนการที่มีอยู่เพื่อจัดการกับสิ่งเหล่านั้น
ในสถานการณ์ของคุณคุณกำลังติดต่อกับลูกค้าที่มีความล่าช้าสูงทางอินเทอร์เน็ต ลูกค้าที่ช้าเหล่านี้สามารถผูกกระบวนการเดียวกันเหล่านั้น เมื่อ QPS มีความสำคัญรหัสแอปพลิเคชันจะต้องได้รับจัดการและแก้ไขคำขอโดยเร็วที่สุดเพื่อให้สามารถดำเนินการต่อไปยังคำขออื่นได้ เมื่อลูกค้าที่ช้าสื่อสารโดยตรงกับระบบของคุณพวกเขาจะผูกกระบวนการนั้นและทำให้ช้าลง แทนที่จะจัดการและกำจัดคำขอโดยเร็วที่สุดกระบวนการนั้นก็ต้องรอลูกค้าช้า QPS ที่มีประสิทธิภาพลดลง
การจัดการการเชื่อมต่อจำนวนมากด้วย cpu และค่าใช้จ่ายหน่วยความจำน้อยมากเป็นสิ่งที่เซิร์ฟเวอร์แบบอะซิงโครนัสเช่น Nginx ทำได้ดี ลูกค้าจะไม่ได้รับผลกระทบในทางลบเหมือนกันเพราะพวกเขามีความเชี่ยวชาญในการจัดการกับลูกค้าจำนวนมากพร้อมกัน ในกรณีของ Nginx การเรียกใช้บนฮาร์ดแวร์ที่ทันสมัยสามารถจัดการการเชื่อมต่อได้หลายหมื่นรายการพร้อมกัน
หน้า Nginx ของเซิร์ฟเวอร์ pre-forking เป็นการผสมผสานที่ยอดเยี่ยม Nginx จัดการกับการสื่อสารกับลูกค้าและไม่ได้รับโทษสำหรับการจัดการกับลูกค้าที่ช้า ส่งคำขอไปยังแบ็กเอนด์ให้เร็วที่สุดเท่าที่แบ็กเอนด์สามารถจัดการกับคำร้องขอเหล่านั้นทำให้แบ็กเอนด์มีประสิทธิภาพด้วยทรัพยากรเซิร์ฟเวอร์เท่าที่จะทำได้ ส่วนแบ็คเอนด์จะส่งคืนผลลัพธ์ทันทีที่คำนวณและบัฟเฟอร์ Nginx ที่ตอบสนองต่อฟีดเพื่อทำให้ไคลเอนต์ช้าลงตามจังหวะของตนเอง ในขณะเดียวกันแบ็กเอนด์สามารถไปยังการจัดการคำขออื่นได้แม้ในขณะที่ลูกค้าช้ายังคงได้รับผล
@blueben ถูกต้อง ตัวอย่างที่เฉพาะเจาะจงและทั่วไปของสิ่งที่สามารถเกิดขึ้นได้เมื่อไม่ได้ใช้พร็อกซีย้อนกลับคือฐานข้อมูลแบ็กเอนด์สามารถเรียกใช้การเชื่อมต่อฐานข้อมูลที่ไม่มีพร็อกซีและมีทราฟฟิกที่เพิ่มขึ้น นี่เป็นเพราะการเชื่อมต่อช้าที่จะปล่อยตามที่อธิบายไว้ @blueben
สัญชาตญาณแรกที่เห็นการจัดการฐานข้อมูลหมดอาจเป็นการสนับสนุนการเชื่อมต่อฐานข้อมูลเพิ่มเติม แต่ด้วยการเพิ่มพร็อกซีย้อนกลับที่ด้านหน้าของแอปคุณจะเห็นจำนวนการเชื่อมต่อฐานข้อมูลที่จำเป็นสำหรับการโหลดสูงทั้งลดลงอย่างมากและมีความเสถียร - ระดับการเชื่อมต่อฐานข้อมูลจะไม่ขัดขวางเกือบเท่าเมื่อมีทราฟฟิกพุ่ง
Nginx ยังยอดเยี่ยมในการให้บริการเนื้อหาแบบคงที่แคชและงาน HTTP อื่น ๆ อีกมากมายซึ่งทำให้เซิร์ฟเวอร์แอปของคุณมุ่งเน้นที่การเป็นเซิร์ฟเวอร์แอป
@naill Donegan พูดถึงเรื่องนี้ในความคิดเห็นด้านบน แต่มันสำคัญมากที่จะรับประกันคำตอบ
Nginx หยุดการโจมตีแบบลอริสช้าที่ gunicorn ไม่สามารถจัดการได้