在進行 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…