前言 最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。 uWSGI 簡介 uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Pytho ...
前言
最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。
uWSGI 簡介
uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Python 包
Difference between WSGI , uWSGI and UWSGI
在 Flask 和 nginx 之間使用 uWSGI 的必要性:nginx 並不能直接與 Python 中的 WSGI 通信。WSGI 是 Python 中網路服務的標準。What is the point of uWSGI?
uWSGI 安裝
pip 安裝,如果失敗則用 conda 安裝。Error installing uwsgi in virtualenv
Flask 註意
既然看到這篇內容 Flask 程式編寫肯定已經不是問題了,不過多介紹。Flask 官網中 Quickstart 的代碼為
# app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
通過 flask --app hello run
啟動。
要提的是代碼中如果有 app.run()
,要將其放在 if __name__ == "__main__":
中,即:
# app.py
if __name__ == "__main__":
app.run()
快速上手 uWSGI
文件目錄下運行:uwsgi --http 0.0.0.0:5001 -w app:app
。第一個 app
是 Flask 代碼文件名,第一個 app
是代碼中 Flask 對象變數名,即賦值為 Flask(__name__)
的變數名。
打開瀏覽器訪問對應埠測試
部署
部署上伺服器需要添加名為 uwsgi.ini 的 uwsgi 配置文件,放在項目根目錄下。
基本配置:
; uwsgi.ini
[uwsgi]
module = app:app
; http 和 socket 二選一
; socket 用的是 uwsgi 協議通信
; http = 127.0.0.1:3031
socket = 127.0.0.1:3031
daemonize = ./uwsgi/uwsgi.log ; 後臺運行
pidfile = ./uwsgi/uwsgi.pid ; 保存 pid 方便後臺運行時的程式管理
併在根目錄下創建 uwsgi 文件夾,就能運行最基礎的伺服器了。
- 啟動:
uwsgi --ini uwsgi.ini
- 關閉:
uwsgi --stop ./uwsgi/uwsgi.pid
- 配置文件更改後:
uwsgi --reload ./uwsgi/uwsgi.pid
配置文件中的變數名就是命令行中參數名的全稱。
還建議配置:
master = 1
processes = 4
; 上面兩個參數配置併發,根據伺服器性能配置
enable-threads = 1 ; 開啟多線程
stats = 0.0.0.0:9191 ; 開啟監控埠,以 json 格式返回當下 uwsgi 運行狀態
stats-http = 1 ; 開啟 http 訪問監控埠
奇怪的是在本地測試時可以在瀏覽器直接訪問 9191 埠,而在服務員上部署成功後卻無法訪問,但是有返回的內容,可以用 curl
獲取內容。
除此之外,要監控 uwsgi 的運行狀態,還可以通過 pip 安裝 uwsgitop,而後在 shell 中輸入 uwsgitop 就能查看監控,就像 linux 中的 top 一樣。
nginx 配置
nginx 基礎不多介紹,直入正題配合使用 uwsgi 時該如何配置。
location
中照如下設置:
# 如果是用 socket:
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3031; # 埠號和前述配置文件一樣
}
# 如果是用 http:
location / {
proxy_pass http://127.0.0.1:3031; # 埠號和前述配置文件一樣
}
現在可以通過瀏覽器訪問了。