ฉันกำลังมองหาคำตอบที่ง่ายเกินไปสำหรับคำถามต่อไปนี้ ฉันกำลังพยายามสร้างความเข้าใจพื้นฐานเกี่ยวกับวิธีการทำงานของ Nginx ควบคู่ไปกับบางอย่างเช่น Gunicorn

ฉันต้องการทั้ง Nginx และบางอย่างเช่น Gunicorn เพื่อปรับใช้แอพ Django บน Nginx หรือไม่

ถ้าเป็นเช่นนั้น อะไรจะจัดการกับคำขอ HTTP ได้จริง

ป.ล. ฉันไม่ต้องการใช้ Apache และ mod_wsgi!

answer

ง่ายเกินไป: คุณต้องการบางสิ่งที่รัน Python แต่ Python ไม่ได้ดีที่สุดในการจัดการคำขอทุกประเภท

[ข้อจำกัดความรับผิดชอบ: ฉันเป็นนักพัฒนา Gunicorn]

เรียบง่ายน้อยลง: ไม่ว่าคุณจะใช้เซิร์ฟเวอร์แอปใด (Gunicorn, mod_wsgi, mod_uwsgi, cherrypy) การปรับใช้ที่ไม่สำคัญใดๆ จะมีบางอย่างที่ต้นน้ำที่จะจัดการกับคำขอที่แอป Django ของคุณไม่ควรจัดการ ตัวอย่างเล็กๆ น้อยๆ ของคำขอดังกล่าวกำลังให้บริการสินทรัพย์คงที่ (images/css/js)

ซึ่งส่งผลให้มีสองชั้นแรกของ "สถาปัตยกรรมสามระดับ" แบบคลาสสิก กล่าวคือ เว็บเซิร์ฟเวอร์ (Nginx ในกรณีของคุณ) จะจัดการคำขอรูปภาพและทรัพยากรแบบคงที่จำนวนมาก คำขอที่จำเป็นต้องสร้างแบบไดนามิกจะถูกส่งต่อไปยังแอปพลิเคชันเซิร์ฟเวอร์ (Gunicorn ในตัวอย่างของคุณ) (นอกจากนี้ ระดับที่สามของสามระดับคือฐานข้อมูล)

ตามประวัติศาสตร์แล้ว แต่ละระดับเหล่านี้จะโฮสต์บนเครื่องที่แยกจากกัน (และเป็นไปได้มากว่าจะมีหลายเครื่องในสองระดับแรก กล่าวคือ: เว็บเซิร์ฟเวอร์ 5 แห่งส่งคำขอไปยังเซิร์ฟเวอร์แอปสองเครื่องซึ่งจะทำการสืบค้นฐานข้อมูลเดียว)

ในยุคปัจจุบัน เรามีการใช้งานทุกรูปแบบและทุกขนาด ไม่ใช่ทุกโครงการในช่วงสุดสัปดาห์หรือไซต์ธุรกิจขนาดเล็กที่ต้องการแรงม้าของเครื่องจักรหลายเครื่องและจะทำงานได้อย่างมีความสุขในกล่องเดียว สิ่งนี้ทำให้เกิดรายการใหม่ในอาร์เรย์ของโซลูชันโฮสติ้ง โซลูชันบางอย่างจะแต่งงานกับเซิร์ฟเวอร์แอปกับเว็บเซิร์ฟเวอร์ (Apache httpd + mod_wsgi, Nginx + mod_uwsgi เป็นต้น) และไม่ใช่เรื่องแปลกเลยที่จะโฮสต์ฐานข้อมูลบนเครื่องเดียวกันกับหนึ่งในการรวมเซิร์ฟเวอร์เว็บ/แอปเหล่านี้

ในกรณีของ Gunicorn เราได้ตัดสินใจเฉพาะ (คัดลอกจาก Ruby's Unicorn) เพื่อแยกสิ่งต่าง ๆ ออกจาก Nginx ในขณะที่อาศัยพฤติกรรมพร็อกซีของ Nginx โดยเฉพาะอย่างยิ่ง หากเราสามารถสรุปได้ว่า Gunicorn จะไม่อ่านการเชื่อมต่อโดยตรงจากอินเทอร์เน็ต เราก็ไม่ต้องกังวลกับไคลเอนต์ที่ช้า ซึ่งหมายความว่ารูปแบบการประมวลผลของ Gunicorn นั้นเรียบง่ายอย่างน่าอาย

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

สำหรับคำถามที่สองของคุณเกี่ยวกับสิ่งที่จัดการคำขอ HTTP จริง ๆ คำตอบง่ายๆ คือ Gunicorn คำตอบที่สมบูรณ์คือทั้ง Nginx และ Gunicorn จัดการคำขอ โดยพื้นฐานแล้ว Nginx จะได้รับคำขอและหากเป็นคำขอแบบไดนามิก (โดยทั่วไปตามรูปแบบ URL) ก็จะส่งคำขอนั้นไปยัง Gunicorn ซึ่งจะประมวลผลแล้วส่งคืนการตอบกลับไปยัง Nginx ซึ่งจะส่งต่อการตอบกลับกลับไปยังต้นฉบับ ลูกค้า.

ดังนั้นในการปิดใช่ คุณต้องการทั้ง Nginx และ Gunicorn (หรือสิ่งที่คล้ายกัน) สำหรับการปรับใช้ Django ที่เหมาะสม หากคุณต้องการโฮสต์ Django กับ Nginx โดยเฉพาะ ฉันจะตรวจสอบ Gunicorn, mod_uwsgi และบางที CherryPy ในฐานะผู้สมัครสำหรับด้าน Django

ฉันชอบคำอธิบายนี้ในความเรียบง่าย:

Nginx will face the outside world. It will serve media files (images, CSS, etc) directly from the file system. However, it can't talk directly to Django applications; it needs something that will run the application, feed it requests from the web, and return responses.

That's Gunicorn's job. Gunicorn will create a Unix socket, and serve responses to nginx via the wsgi protocol - the socket passes data in both directions:

The outside world <-> Nginx <-> The socket <-> Gunicorn

https://gist.github.com/Atem18/4696071

I'm looking for an overly simplified answer...

Do I need both Nginx and something like Gunicorn to deploy Django apps on Nginx?

If so, what actually handles the HTTP requests?

คำตอบที่ง่ายเกินไป:

ใช่.

ทั้ง Nginx และ Gunicorn

เนื่องจากคุณกำลังปรับใช้บน Nginx แน่นอนคุณต้องมี Nginx

เนื่องจากคุณกำลังปรับใช้ Django ซึ่งเป็นเฟรมเวิร์กของเว็บ คุณจำเป็นต้องมีบางสิ่งที่เชื่อมโยงการพูดคุยระหว่างเว็บเซิร์ฟเวอร์ (Nginx) กับเว็บเฟรมเวิร์ก (Django) ในโลกของ Python สิ่งดังกล่าวเรียกว่าเซิร์ฟเวอร์ WSGI (แต่คิดว่ามันเหมือนเครื่องกลาง) ตัวอย่างซึ่งรวมถึง Gunicorn และ uWSGI เมื่อจัดการคำขอ Nginx จะพร็อกซีคำขอไปยัง Gunicorn หรือ uWSGI ซึ่งจะเรียกรหัส Django และส่งคืนการตอบกลับ

เอกสารนี้และคำตอบของ Paul จะช่วยให้คุณเรียนรู้ได้ดีขึ้น

Gunicorn เป็นการสิ้นเปลืองทรัพยากร คุณสามารถส่งผ่านพร็อกซีไปที่ django ฟังบนพอร์ตแทนการเรียกใช้ gunicorn บน django ด้านบนและอีกครั้ง nginx ที่ด้านบนของทั้งหมดนั้น ในการวัดประสิทธิภาพ ฉันเห็นความเร็วที่เพิ่มขึ้นอย่างเห็นได้ชัด Nginx สามารถจัดการคำขอโดยตรงไปยัง django ได้อย่างง่ายดาย Gunicorn ไม่มีอะไรมากไปกว่าสะพานลอย (อันที่จริงเป็นสะพานลอยที่ช้ากว่า) เหนือถนนปกติ มันแค่นั่งกินทรัพยากรของคุณและพยายามอ้างว่าเป็นผู้ขับเคลื่อนเว็บไซต์ของคุณ

โดยทั่วไปแล้ว nginx จะบัฟเฟอร์คำขอทั้งหมดและจัดการคำขอไฟล์สแตติกด้วยตัวเอง (หากคุณกำหนดค่าไว้เช่นนั้น) และพร็อกซีเนื้อหาไดนามิกทั้งหมดไปยังเซิร์ฟเวอร์อื่น (gunicorn/django)

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

ฉันได้เปรียบเทียบและพบสิ่งนี้ - ด้วย gunicorn: 22k req / s โดยไม่มี gunicorn: 34k req / s

ไซต์ของคุณจำเป็นต้องมี req/s เพิ่มเติมในการโหลดจำนวนมาก