全能型 uWSGI 配置

昊羲發表於2019-01-13

在進行 Python web 開發時,使用 Django、Flask 等框架開發完畢後,部署時通常需要選擇一個支援 wsgi 協議的 Web 伺服器程式。目前比較通用的選擇是 nginx + uWSGI,使用 nginx 來處理靜態檔案請求,其餘動態內容再轉發給 uWSGI 交給 web 後臺處理,網上這樣的配置教程也是最多的。

作為兩款大名鼎鼎的伺服器程式 nginx 負責靜態檔案,uWSGI 負責動態內容,各種在自己擅長的領域各施其職,的確效率很高,是高效能的 Python web 系統部署時的首選。

不過有時用 Python 寫了個小站點,效能需求並不高時。部署服務還要安裝 nginx 和 uWSGI 兩個伺服器程式就顯得有點麻煩了。能否把這些工作都交給一個伺服器程式呢。

全能型 uWSGI 配置

其實 uWSGI 也可以用來直接提供靜態檔案,雖然相比 nginx 效率要低一些,但部署時配置起來更為方便。只需在 uWSGI 的配置檔案中新增 static-map 配置項。

uWSGI 配置靜態檔案掛載點

通過 --static-map mountpoint=path 選項,uWSGI 即可將指定請求字首對映到檔案系統上的對應物理目錄。

--static-map /images=/var/www/img
複製程式碼

通過以上配置,如接收到一個對 /images/logo.png 的請求,並且 /var/www/img/logo.png 存在,那麼 uWSGI 將會提供它。否則,uWSGI 託管的應用會管理這個請求。

uWSGI 配置路由

nginx 有時另外一個重要作用便是路由, uWSGI 在 1.9 版本後也提供了一個可程式設計的內部路由子系統,可以通過這個內部路由子系統來動態改變處理請求的方式。

例如將所有的 http 連結轉到 https 地址下:

route-uri = ^/$ redirect:https://your.website.com
複製程式碼

完整配置

通過以上的選項,一個小站便可僅通過 uWSGI 部署起來了,順便也分享下我的站點配置。

[uwsgi]
; 特權埠只能通過 shared socket 來開啟
shared-socket = 0.0.0.0:80
shared-socket = 0.0.0.0:443

; 開啟 https 強制轉換, 安全協議設定為 HIGH
http-to-https = =0
https = =1,214391966620557.pem,214391966620557.key,HIGH

; 在繫結埠後切換執行使用者
uid = ubuntu
gid = ubuntu

; 配置執行虛擬環境及程式路徑
virtualenv = /home/ubuntu/.virtualenvs/web/
chdir = /var/web/backend
wsgi-file = backend/wsgi.py
master = true
processes = 2
threads = 4
touch-reload=/var/web/backend/mcenter.reload

; 靜態檔案和路由配置
static-map = /static=/var/web/backend/static
route-uri = ^/$ redirect:https://your.website.com

; 開啟狀態監控
stats = 127.0.0.1:9191

複製程式碼

參考資料

使用uWSGI提供靜態檔案 uwsgi-docs-zh.readthedocs.io/zh_CN/lates…

uWSGI內部路由 uwsgi-docs-zh.readthedocs.io/zh_CN/lates…

相關文章