ประเด็นของ uWSGI คืออะไร?


97

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

ข้อมูลจำเพาะ WSGI มีสองด้าน ได้แก่ เซิร์ฟเวอร์และเว็บแอป uWSGI อยู่ด้านไหน?

คำตอบ:


131

โอเคฉันคิดว่าฉันเข้าใจแล้ว

เหตุใด nginx จึงไม่สามารถเรียกแอปพลิเคชัน Flask ของฉันได้โดยตรง

เนื่องจากnginxไม่รองรับข้อมูลจำเพาะ WSGI ในทางเทคนิค nginx สามารถใช้WSGIข้อมูลจำเพาะได้หากต้องการ แต่ก็ไม่ได้

ในกรณีนี้เราต้องการเว็บเซิร์ฟเวอร์ที่ใช้ข้อมูลจำเพาะซึ่งเป็นสิ่งที่uWSGIเซิร์ฟเวอร์มีไว้สำหรับ

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

"อะไรนะ?! อีกอย่างที่เรียกว่า uwsgi?!" คุณถาม. ใช่มันสับสน เมื่อคุณอ้างอิงuWSGIคุณกำลังพูดถึงเซิร์ฟเวอร์ http เมื่อคุณพูดคุยเกี่ยวกับuwsgi(ตัวพิมพ์เล็กทั้งหมด) คุณกำลังพูดคุยเกี่ยวกับโปรโตคอลไบนารีว่าuWSGI เซิร์ฟเวอร์ที่ใช้ในการพูดคุยกับเซิร์ฟเวอร์อื่น ๆ nginxเช่น พวกเขาเลือกชื่อที่ไม่ดีในชื่อนี้

สำหรับใครก็ตามที่สนใจฉันเขียนบทความบล็อกเกี่ยวกับเรื่องนี้โดยมีข้อมูลเฉพาะเจาะจงมากขึ้นประวัติเล็กน้อยและตัวอย่างบางส่วน


4
เป็นไปได้ที่จะเรียกใช้แอปพลิเคชัน Flask ด้วย Werkzeug เป็นเซิร์ฟเวอร์ HTTP แต่ไม่ใช่การตั้งค่าพร้อมใช้งานจริง uWSGI แก้ปัญหาหลายประการ: * การแยกวิเคราะห์ HTTP (เร็วกว่าใน C) และการเชื่อมต่อกับแอป WSGI * เปิดตัวแอปในกระบวนการ / เธรดหลายรายการเพื่อการทำงานพร้อมกันที่ดีขึ้น * ทำหน้าที่เป็นผู้ดูแลแอป WSGI
Sergey Panfilov

@SergeyPanfilov ปัญหาคือเราไม่รู้ว่า uwsgi จัดการกับขวดอย่างไรแต่ละกระบวนการ / เธรดสร้างแอปขวดหนึ่งอินสแตนซ์หรือไม่ ฉันเคยเห็นการใช้งานบางอย่างสำหรับงานพื้นหลังในขวดเช่น Flask-Executor และต้องผูกไว้ในคำขอ ไม่สามารถวางไว้นอกบริบทได้
TomSawyer

อ่านคำตอบจาก Hasan .. ใกล้จะได้คำตอบที่ถูกต้องแล้ว ..... เซิร์ฟเวอร์ http ส่วนใหญ่เขียนด้วยภาษา C และไม่สามารถส่งต่อคำขอ http ไปยังแบ็กเอนด์หลามได้ .... คำตอบของคุณแค่พูดถึงกลไก
เปลี่ยนแปลง

25

NGINX ในกรณีนี้ทำงานเป็น reverse proxy เท่านั้นและแสดงไฟล์แบบคงที่ไม่ใช่ไฟล์ไดนามิกโดยจะรับคำขอและมอบฉันทะไปยังแอ็พพลิเคชันเซิร์ฟเวอร์ซึ่งจะเป็น UWSGI

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

จากเอกสาร :

uWSGI สนับสนุนวิธีการต่างๆในการรวมเข้ากับเว็บเซิร์ฟเวอร์ นอกจากนี้ยังสามารถให้บริการคำขอ HTTP ด้วยตัวเอง

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

กล่าวอีกนัยหนึ่ง WSGI เป็นสัญญาระหว่างแอปพลิเคชัน python (Flask, Django ฯลฯ ) และเว็บเซิร์ฟเวอร์ (UWSGI, Gunicorn ฯลฯ ) ประโยชน์คือคุณสามารถเปลี่ยนเว็บเซิร์ฟเวอร์ที่มีความพยายามเล็ก ๆ น้อย ๆ เพราะคุณรู้ว่าพวกเขาปฏิบัติตามข้อกำหนด WSGI ซึ่งเป็นจริงหนึ่งในเป้าหมายที่ระบุไว้ในPEP-333

งูใหญ่ในขณะนี้ภูมิใจนำเสนอความหลากหลายของโปรแกรมประยุกต์เว็บกรอบเช่น Zope, กิโฮเต้ Webware, SkunkWeb, PSO และบิดเว็บ - เพื่อชื่อเพียงไม่กี่1 ตัวเลือกที่หลากหลายนี้อาจเป็นปัญหาสำหรับผู้ใช้ Python รายใหม่เพราะโดยทั่วไปการเลือกเว็บเฟรมเวิร์กจะ จำกัด การเลือกเว็บเซิร์ฟเวอร์ที่ใช้งานได้และในทางกลับกัน


20

เว็บเซิร์ฟเวอร์แบบเดิมไม่เข้าใจหรือมีวิธีเรียกใช้แอปพลิเคชัน Python นั่นเป็นเหตุผลที่เซิร์ฟเวอร์ WSGI เข้ามาในทางกลับกัน Nginx สนับสนุน reverse proxy เพื่อจัดการคำขอและส่งการตอบกลับสำหรับเซิร์ฟเวอร์ Python WSGI

ลิงก์นี้อาจช่วยคุณได้: https://www.fullstackpython.com/wsgi-servers.html


4
มีสามสิ่งที่นี่: nginx, uwsgi และ flask มันเข้ากันได้อย่างไรในบริบทของข้อมูลจำเพาะ WSGI nginx เป็นเซิร์ฟเวอร์และ uwsgi เป็นแอปหรือเป็น uwsgi เซิร์ฟเวอร์และขวดคือแอป?
d512

uWSGI เป็นเซิร์ฟเวอร์และขวดเป็นแอป
Rafiqul Hasan

ถ้าคุณไม่ทราบลองดูคำตอบสำหรับคำถามของฉันและดูว่าคุณคิดอย่างไร
d512

4
เหตุใดเว็บเซิร์ฟเวอร์จึงไม่เข้าใจแอป Python มันเข้าใจ PHP ได้ทำไมไม่ใช้ Python หรือภาษาอื่น ๆ ล่ะ?
jdogg

0

พูดง่ายๆก็คือลองนึกถึงการเปรียบเทียบที่คุณใช้งานแอปพลิเคชัน CGI หรือ PHP กับเว็บเซิร์ฟเวอร์ Nginx คุณจะใช้ตัวจัดการที่เกี่ยวข้องเช่น php-fpm เพื่อเรียกใช้ไฟล์เหล่านี้เนื่องจากเว็บเซิร์ฟเวอร์ในรูปแบบดั้งเดิมไม่แสดงรูปแบบเหล่านี้

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