Nginx / uWSGI / Python 之關聯#2 : uWSGI篇

Simon Chu
Bucketing
Published in
4 min readFeb 20, 2021

甚麼是uWSGI ?

Wsgi (Web Server Gateway Interface) 是同步通信服務規範,它是 Python應用程序(application)或框架(如 Django)和 Web服務之間的一種接口,它是一種協議/規範,是在 PEP 333提出的,并在 PEP 3333 進行補充。

協議內容概述:

WSGI 接口有服務端和應用端兩部分,服務端也可以叫網關端,應用端也叫框架端。服務端調用一個由應用端提供的可調用對象。如何提供這個對象,由服務端決定。例如某些服務器或者網關需要應用的部署者寫一段腳本,以創建服務器或者網關的實例,並且為這個實例提供一個應用實例。另一些服務器或者網關則可能使用配置文件或其他方法以指定應用實例應該從哪裡導入或獲取。

uWSGI安裝:

pip install uwsgi[官方說明]

uWSGI作為中間件,它用到了uwsgi協議(與nginx通信),wsgi協議(調用Flask app)。當有客戶端發來請求,nginx先做處理(靜態資源是nginx的強項),無法處理的請求(uWSGI),最後的相應也是nginx回覆客戶端。

設定uwsgi檔:

:~ $ vim /home/flask_example/uwsgi.ini[uwsgi]
# deploy it on HTTP port 9090
http = :9090
module = webapp
logto = /var/log/flask_example.log
callable = app
chmod-socket = 660
# master with 2 worker process (based on CPU number)
master = true
processes = 2
threads = 4
# python env
home = /home/flask_example/flask_example_env
# use unix socket for integration with nginx
socket = /srv/flask.sock
# enable socket cleanup when process stop
vacuum = true

詳細設定可查看[官方網站]說明

執行方法:

uwsgi --ini uwsgi.ini

結構介紹:

本文使用的是三級結構

兩級結構(右)

uWSGI 作為伺服器,用到了 HTTP 協議以及 wsgi 協議,flask 作為application,實現了 wsgi 協議。當有請求發來,uWSGI 接受請求,調用 flask app 得到相應,之後相應給客戶端。
通常 Flask 等 web 框架會包含 wsgi 伺服器(這就是 flask 可直接啟動的原因),但是這只是在開發階段用到的(因效能相較不佳),所以使用 uwsgi 這個性能高的 wsgi 伺服器。

三級結構(左)

uWSGI 作為中間件,它用到了 uwsgi 協議(用 socket 與 nginx 互動),wsgi 協議(調用 Flask app )。當有客戶端發來請求,nginx 先做處理靜態資源,剩餘請求給予 uWSGI。

多了一層反向代理的好處?(如上篇所述)

  1. 提高web server性能(uWSGI處理靜態資源不如nginx,nginx會在收到一個完整的http請求後再轉發給wWSGI)
  2. nginx可以做負載均衡
  3. 保護了實際的web伺服器(客戶端是和nginx互動而不直接與uWSGI互動)

參考:

wsgi

--

--