Apa gunanya uWSGI?

97

Saya melihat spesifikasi WSGI dan saya mencoba mencari tahu bagaimana server seperti uWSGI cocok dengan gambaran tersebut. Saya memahami inti dari spesifikasi WSGI adalah untuk memisahkan server web seperti nginx dari aplikasi web seperti sesuatu yang Anda tulis menggunakan Flask . Yang tidak saya mengerti adalah untuk apa uWSGI. Mengapa nginx tidak bisa langsung memanggil aplikasi Flask saya? Tidak bisakah flask berbicara WSGI langsung padanya? Mengapa uWSGI perlu berada di antara keduanya?

Ada dua sisi dalam spesifikasi WSGI: server dan aplikasi web. Di sisi manakah uWSGI berada?

d512
sumber

Jawaban:

131

Oke, saya rasa saya mengerti sekarang.

Mengapa nginx tidak bisa langsung memanggil aplikasi Flask saya?

Karena nginxtidak mendukung spek WSGI. Secara teknis nginx dapat mengimplementasikan WSGIspesifikasi jika mereka mau, mereka belum melakukannya.

Karena itu, kita memerlukan server web yang menerapkan spesifikasi, untuk tujuan uWSGIserver.

Perhatikan bahwa uWSGIserver http lengkap yang dapat dan berfungsi dengan baik sendiri. Saya telah menggunakannya dalam kapasitas ini beberapa kali dan berfungsi dengan baik. Jika Anda membutuhkan throughput super tinggi untuk konten statis, maka Anda memiliki opsi untuk tetap berada nginxdi depan uWSGIserver Anda . Ketika Anda melakukannya, mereka akan berkomunikasi melalui protokol tingkat rendah yang dikenal sebagai uwsgi.

"Apa-apaan ini ?! Hal lain yang disebut uwsgi ?!" Anda bertanya. Ya, itu membingungkan. Ketika Anda mereferensikan uWSGIAnda berbicara tentang server http. Ketika Anda berbicara tentang uwsgi(semua huruf kecil) Anda berbicara tentang protokol biner yang digunakan uWSGI server untuk berbicara dengan server lain seperti nginx. Mereka memilih nama yang buruk untuk yang satu ini.

Bagi siapa saja yang tertarik, saya menulis artikel blog tentang itu dengan lebih spesifik, sedikit sejarah, dan beberapa contoh.

d512
sumber
4
Dimungkinkan untuk menjalankan aplikasi Flask dengan Werkzeug sebagai server HTTP, tetapi ini bukan penyiapan siap produksi. uWSGI memecahkan banyak masalah: * Penguraian HTTP (lebih cepat di C) dan berinteraksi dengan aplikasi WSGI * meluncurkan aplikasi dalam beberapa proses / utas untuk konkurensi yang lebih baik * bertindak sebagai pengawas aplikasi WSGI
Sergey Panfilov
@SergeyPanfilov Masalahnya adalah kita tidak tahu bagaimana uwsgi berurusan dengan flask, setiap proses / thread membuat satu instance dari aplikasi flask? Saya telah melihat beberapa implementasi untuk tugas latar belakang di labu seperti Flask-Executor dan itu harus mengikat di dalam sebuah permintaan. Tidak boleh ditempatkan di luar konteks.
TomSawyer
Baca jawaban dari Hasan .. hampir benar jawaban ..... Server http sebagian besar ditulis dalam C dan mereka tidak dapat meneruskan permintaan http ke backend python .... jawaban Anda hanya berbicara tentang mekanika
pertukaran berlebih
25

NGINX dalam hal ini hanya bekerja sebagai reverse proxy dan merender file statis, bukan file dinamis , ia menerima permintaan dan memproksinya ke server aplikasi, yaitu UWSGI.

Server UWSGI bertanggung jawab untuk memuat aplikasi Flask Anda menggunakan antarmuka WSGI. Anda sebenarnya dapat membuat UWSGI mendengarkan langsung permintaan dari internet dan menghapus NGINX jika Anda mau, meskipun sebagian besar digunakan di belakang proxy terbalik.

Dari dokumen :

uWSGI mendukung beberapa metode integrasi dengan server web. Ia juga mampu melayani permintaan HTTP dengan sendirinya.

WSGI hanyalah spesifikasi antarmuka, dalam istilah sederhana, ini memberi tahu Anda metode apa yang harus diterapkan untuk meneruskan permintaan dan tanggapan antara server dan aplikasi. Saat menggunakan kerangka kerja seperti Flask atau Django, ini ditangani oleh kerangka itu sendiri.

Dengan kata lain, WSGI pada dasarnya adalah kontrak antara aplikasi python (Flask, Django, dll) dan server web (UWSGI, Gunicorn, dll). Manfaatnya adalah Anda dapat mengubah server web dengan sedikit usaha karena Anda tahu bahwa server tersebut sesuai dengan spesifikasi WSGI, yang sebenarnya merupakan salah satu tujuan, sebagaimana dinyatakan dalam PEP-333 .

Python saat ini menawarkan berbagai macam kerangka aplikasi web, seperti Zope, Quixote, Webware, SkunkWeb, PSO, dan Twisted Web - untuk menyebutkan beberapa di antaranya 1 . Berbagai macam pilihan ini dapat menjadi masalah bagi pengguna Python baru, karena secara umum, pilihan kerangka kerja web mereka akan membatasi pilihan server web yang dapat digunakan, dan sebaliknya.

alejandrodnm.dll
sumber
20

Server web tradisional tidak memahami atau memiliki cara apa pun untuk menjalankan aplikasi Python. Itulah mengapa server WSGI masuk Di sisi lain Nginx mendukung proxy balik untuk menangani permintaan dan mengirimkan kembali tanggapan untuk server WSGI Python.

Tautan ini mungkin membantu Anda: https://www.fullstackpython.com/wsgi-servers.html

Rafiqul Hasan
sumber
4
Ada tiga hal di sini: nginx, uwsgi, dan flask. Bagaimana semuanya cocok bersama dalam konteks spesifikasi WSGI? Apakah nginx servernya dan uwsgi adalah aplikasinya atau apakah uwsgi server dan flask adalah aplikasinya?
d512
uWSGI adalah server dan flask adalah aplikasinya.
Rafiqul Hasan
Nah, jika Anda tidak keberatan, lihat jawaban saya untuk pertanyaan saya sendiri dan lihat apa yang Anda pikirkan.
d512
4
Mengapa server web tidak memahami aplikasi Python? Bisa mengerti PHP, kenapa tidak Python atau bahasa lain?
jdogg
0

Secara sederhana, bayangkan analogi di mana Anda menjalankan aplikasi CGI atau PHP dengan server web Nginx. Anda akan menggunakan masing-masing penangan seperti php-fpm untuk menjalankan file ini karena server web, dalam bentuk aslinya tidak membuat format ini.

anrajme
sumber