ลดความซับซ้อนลงมากเกินไป: คุณต้องการสิ่งที่ดำเนินการ 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 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