ทำไมการตั้งค่า Nginx เป็น reverse proxy เป็นความคิดที่ดี?


41

ฉันมีไซต์ Django ที่ทำงานบน Gunicorn ด้วย reverse proxy ผ่าน Nginx Nginx ไม่ใช่แค่ค่าใช้จ่ายที่ไม่จำเป็นเพิ่มขึ้นใช่ไหม? การเพิ่มที่ด้านบนของ Gunicorn ช่วยได้อย่างไร

คำตอบ:


52

ฉันจะมุ่งเน้นไปที่พฤติกรรมไคลเอนต์ที่ช้าและการกำหนดค่าของคุณจัดการกับมันได้อย่างไร แต่อย่าถูกล่อลวงให้เชื่อว่านั่นเป็นประโยชน์เพียงอย่างเดียว วิธีการเดียวกันที่ให้ประโยชน์แก่ลูกค้าที่ช้าก็มีประโยชน์สำหรับลูกค้าที่รวดเร็วการจัดการ SSL การจัดการกับปริมาณการใช้งานและด้านอื่น ๆ ของการให้บริการ HTTP บนอินเทอร์เน็ต

Gunicorn เป็นซอฟต์แวร์ล่วงหน้า สำหรับการสื่อสารเวลาแฝงต่ำเช่น load balancer ไปยังเซิร์ฟเวอร์แอพหรือการสื่อสารระหว่างบริการระบบ pre-fork สามารถประสบความสำเร็จอย่างมาก ไม่มีค่าใช้จ่ายในการปั่นกระบวนการเพื่อจัดการคำขอและกระบวนการเดียวสามารถทุ่มเทให้กับการจัดการคำขอเดียว การกำจัดสิ่งเหล่านี้สามารถนำไปสู่ระบบโดยรวมที่เร็วขึ้นและมีประสิทธิภาพมากขึ้นจนกระทั่งจำนวนการเชื่อมต่อพร้อมกันเกินจำนวนกระบวนการที่มีอยู่เพื่อจัดการกับสิ่งเหล่านั้น

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

การจัดการการเชื่อมต่อจำนวนมากด้วย cpu และค่าใช้จ่ายหน่วยความจำน้อยมากเป็นสิ่งที่เซิร์ฟเวอร์แบบอะซิงโครนัสเช่น Nginx ทำได้ดี ลูกค้าจะไม่ได้รับผลกระทบในทางลบเหมือนกันเพราะพวกเขามีความเชี่ยวชาญในการจัดการกับลูกค้าจำนวนมากพร้อมกัน ในกรณีของ Nginx การเรียกใช้บนฮาร์ดแวร์ที่ทันสมัยสามารถจัดการการเชื่อมต่อได้หลายหมื่นรายการพร้อมกัน

หน้า Nginx ของเซิร์ฟเวอร์ pre-forking เป็นการผสมผสานที่ยอดเยี่ยม Nginx จัดการกับการสื่อสารกับลูกค้าและไม่ได้รับโทษสำหรับการจัดการกับลูกค้าที่ช้า ส่งคำขอไปยังแบ็กเอนด์ให้เร็วที่สุดเท่าที่แบ็กเอนด์สามารถจัดการกับคำร้องขอเหล่านั้นทำให้แบ็กเอนด์มีประสิทธิภาพด้วยทรัพยากรเซิร์ฟเวอร์เท่าที่จะทำได้ ส่วนแบ็คเอนด์จะส่งคืนผลลัพธ์ทันทีที่คำนวณและบัฟเฟอร์ Nginx ที่ตอบสนองต่อฟีดเพื่อทำให้ไคลเอนต์ช้าลงตามจังหวะของตนเอง ในขณะเดียวกันแบ็กเอนด์สามารถไปยังการจัดการคำขออื่นได้แม้ในขณะที่ลูกค้าช้ายังคงได้รับผล


3
nitpicking: gunicorn เป็นเซิร์ฟเวอร์ที่อิงเหตุการณ์ล่วงหน้า แต่ละกระบวนการจัดการการเชื่อมต่อต่าง ๆ แบบอะซิงโครนัส แต่นั่นไม่ได้เปลี่ยนความจริงที่ว่า nginx มีค่าใช้จ่ายต่อการเชื่อมต่อที่ต่ำลงทำให้ส่วนที่เหลือของคำอธิบายของคุณถูกต้อง
Javier

4
และเป็นโบนัส Nginx หยุด "Slow HTTP DoS Attacks" ได้อย่างมีประสิทธิภาพ จุดหนึ่งที่ฉันจะเพิ่มคือเมื่อใช้ Nginx มันสามารถเลอะสิ่งใด ๆ ที่เกี่ยวข้องกับ IP ที่คุณอาจทำใน Gunicorn ตัวอย่างเช่นรับรองความถูกต้องโดย ip เข้าสู่ระบบ ฯลฯ เว้นแต่ Gunicorn สนับสนุนการดูส่วนหัว X-Forwarded-For ฉันไม่คุ้นเคยกับ Gunicorn ดังนั้นฉันไม่สามารถบอกได้ว่าปัญหานี้จะเกิดขึ้นกับคุณเพียงใด
Niall Donegan

ขอบคุณสำหรับข้อมูล Javier ฉันไม่คุ้นเคยกับ gunicorn มากนัก
blueben

คำตอบของคุณควรเหมาะสำหรับคำถามนี้: stackoverflow.com/q/13182892/719276
arthur.sw

สิ่งนี้เกี่ยวข้องกับตัวเลือก * _busy_buffer_size หรือไม่?
CMCDragonkai

2

@blueben ถูกต้อง ตัวอย่างที่เฉพาะเจาะจงและทั่วไปของสิ่งที่สามารถเกิดขึ้นได้เมื่อไม่ได้ใช้พร็อกซีย้อนกลับคือฐานข้อมูลแบ็กเอนด์สามารถเรียกใช้การเชื่อมต่อฐานข้อมูลที่ไม่มีพร็อกซีและมีทราฟฟิกที่เพิ่มขึ้น นี่เป็นเพราะการเชื่อมต่อช้าที่จะปล่อยตามที่อธิบายไว้ @blueben

สัญชาตญาณแรกที่เห็นการจัดการฐานข้อมูลหมดอาจเป็นการสนับสนุนการเชื่อมต่อฐานข้อมูลเพิ่มเติม แต่ด้วยการเพิ่มพร็อกซีย้อนกลับที่ด้านหน้าของแอปคุณจะเห็นจำนวนการเชื่อมต่อฐานข้อมูลที่จำเป็นสำหรับการโหลดสูงทั้งลดลงอย่างมากและมีความเสถียร - ระดับการเชื่อมต่อฐานข้อมูลจะไม่ขัดขวางเกือบเท่าเมื่อมีทราฟฟิกพุ่ง

Nginx ยังยอดเยี่ยมในการให้บริการเนื้อหาแบบคงที่แคชและงาน HTTP อื่น ๆ อีกมากมายซึ่งทำให้เซิร์ฟเวอร์แอปของคุณมุ่งเน้นที่การเป็นเซิร์ฟเวอร์แอป


0

@naill Donegan พูดถึงเรื่องนี้ในความคิดเห็นด้านบน แต่มันสำคัญมากที่จะรับประกันคำตอบ

Nginx หยุดการโจมตีแบบลอริสช้าที่ gunicorn ไม่สามารถจัดการได้

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