掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
WSGI 、uWSGI 和 uwsgi 是三個相關(guān)的概念,它們是在 Web 應(yīng)用程序開發(fā)中使用的不同的工具和協(xié)議。下面是它們的詳細(xì)介紹:

東海ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
因此,uWSGI 是一個 Web 服務(wù)器,可以通過 WSGI 協(xié)議與 Python 應(yīng)用程序通信,并使用 uwsgi 協(xié)議進(jìn)行通信。WSGI 是 Python Web 應(yīng)用程序與 Web 服務(wù)器之間的接口規(guī)范,定義了應(yīng)用程序和服務(wù)器之間的標(biāo)準(zhǔn)接口。而 uwsgi 則是 uWSGI 服務(wù)器與應(yīng)用程序之間的二進(jìn)制通信協(xié)議。
uWSGI 是一種 Web 服務(wù)器網(wǎng)關(guān)接口(Web Server Gateway Interface),它可以用于將 Python Web 應(yīng)用程序與 Web 服務(wù)器(如 Nginx 或 Apache)集成在一起。
國內(nèi)源地址:
mkdir ~/.pip/
cat >~/.pip/pip.conf<[global]
index-url = https://repo.huaweicloud.com/repository/pypi/simple
trusted-host = repo.huaweicloud.com
timeout = 120
EOF
# 安裝python3
yum -y install python3
yum -y install gcc-c++ -y
yum -y install python3-devel -y
# 安裝 uwsgi flask 模塊
pip3 install uwsgi flask
# 查看版本
uwsgi --version
yum update -y
yum install epel-release
yum -y install nginx
創(chuàng)建一個名為 app.py 的文件,添加以下代碼:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
創(chuàng)建一個 uWSGI 配置文件,例如 uwsgi.ini,其中包含以下信息:
[uwsgi]
module = app:app
# 相當(dāng)于命令下面兩行
#wsgi-file = app.py # 項目入口文件
#callable = app # flask應(yīng)用對象
# 支持http+socket兩種方式,這里選用socket,也可以選擇http-socket,下面會講解這三種區(qū)別
# http = 127.0.0.1:8000
socket = 0.0.0.0:8000
# 也可以使用socket文件,在nginx配置文件中配置也對應(yīng),僅限本機(jī)通信,一般也很少使用
# socket = /app/myapp.sock
# 注意記得提前創(chuàng)建目錄
chdir = /opt/myapp
pidfile=/opt/myapp/myapp.pid
processes = 4
threads = 2
master = true
vacuum = true
py-autoreload = 1
daemonize = /tmp/uwsgi.log
uwsgi.ini常用配置參數(shù)詳解:
在命令行中啟動 uWSGI:
uwsgi --ini uwsgi.ini
###或者
uwsgi uwsgi.ini
### 重啟
uwsgi --reload /opt/myapp/myapp.pid
###關(guān)閉
uwsgi --stop /opt/myapp/myapp.pid
【溫馨提示】其實也可以通過一條命令帶上對應(yīng)的參數(shù)即可啟動,但是不推薦,測試可以。一般使用配置文件的方式啟動服務(wù)。
使用http協(xié)議啟動uwsgi的命令為:
uwsgi --http :8000 --ini uwsgi_conf.ini -d ./uwsgi.log --pidfile=uwsgi.pid
將 Web 服務(wù)器配置為反向代理 uWSGI,例如,在 Nginx 中,可以使用以下配置文件:
# vi /etc/nginx/conf.d/myapp.conf
server {
listen 8080;
server_name myapp.com;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
}
}
其中,uwsgi_params 文件包含以下內(nèi)容:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
【特別注意】uwsgi_params 在nginx conf文件夾下自帶,uwsgi_pass一定要跟uwsgi_conf.ini中寫的地址完全一致。
重啟 Web 服務(wù)器以使配置生效。
# 重啟
systemctl restart nginx
# 如果是之前nginx服務(wù)已經(jīng)存在,只是修改了配置,可建議使用reload加載
nginx -t && nginx -s reload
# 或者
systemctl reload nginx
訪問(瀏覽器訪問,curl訪問也行)
Nginx上游(upstream)是指一組后端服務(wù)器,Nginx可以與其通信并將客戶端請求轉(zhuǎn)發(fā)到這些服務(wù)器。換句話說,上游服務(wù)器是N?ginx代理請求的后端服務(wù)器。
Nginx的upstream支持5種 分配方式,其中 輪詢(默認(rèn))、權(quán)重、IP散列這三種為Nginx原生支持的分配方式,fair 和 url_hash 為第三方支持的分配方式。
輪詢是upstream的默認(rèn)分配方式,即每個請求按照時間順序輪流分配到不同的后端服務(wù)器,如果某個后端服務(wù)器 down 掉后,能自動剔除。
upstream backend {
server 192.168.182.110:8000;
server 192.168.182.111:8000;
}輪詢的加強(qiáng)版,既可以指定輪詢比率,weight 和訪問幾率成正比,主要應(yīng)用于后端服務(wù)器異質(zhì)的場景下。
upstream backend {
server 192.168.182.110:8000 weight=1;
server 192.168.182.111:8000 weight=2;
}每個請求按照訪問 Ip(即Nginx的前置服務(wù)器或客戶端IP)的 hash結(jié)果分配,這樣每個訪客會固定訪問一個后端服務(wù)器,可以解決 session 一致問題。
upstream backend {
ip_hash;
server 192.168.182.110:8000 weight=1;
server 192.168.182.111:8000 weight=2;
}先在另外一個節(jié)點上再起一個uWSGI服務(wù),將上面示例配置修改:
# vi /etc/nginx/conf.d/myapp.conf
upstream backend {
server 192.168.182.110:8000;
server 192.168.182.111:8000;
}
server {
listen 8080;
server_name myapp.com;
location / {
include uwsgi_params;
uwsgi_pass backend;
}
}
192.168.182.110 節(jié)點 app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World 192.168.182.110!\n'
if __name__ == '__main__':
app.run()
192.168.182.111 節(jié)點 app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World 192.168.182.111!\n'
if __name__ == '__main__':
app.run()
驗證
curl 127.0.0.1:8080
從上圖可知,請求輪詢調(diào)度,這才是企業(yè)一般想要的效果,負(fù)載均衡。
【1】socket 示例(uwsgi.ini):
[uwsgi]
module = app:app
#socket = 127.0.0.1:8000
socket = 0.0.0.0:8000
chdir = /opt/myapp
pidfile=/opt/myapp/myapp.pid
processes = 4
threads = 2
master = true
vacuum = true
py-autoreload = 1
daemonize = /tmp/uwsgi.log
nginx配置
upstream backend {
server 192.168.182.110:8000;
server 192.168.182.111:8000;
}
server {
listen 8080;
server_name myapp.com;
location / {
include uwsgi_params;
uwsgi_pass backend;
}
}【2】http 示例(uwsgi.ini):
[uwsgi]
module = app:app
socket = 0.0.0.0:8000
chdir = /opt/myapp
pidfile=/opt/myapp/myapp.pid
processes = 4
threads = 2
master = true
vacuum = true
py-autoreload = 1
daemonize = /tmp/uwsgi.log
nginx配置
upstream backend {
server 192.168.182.110:8000;
server 192.168.182.111:8000;
}
server {
listen 8080;
server_name myapp.com;
location / {
include uwsgi_params;
proxy_pass http://backend;
}
}【3】http-socket 示例(uwsgi.ini):
[uwsgi]
module = app:app
http = 0.0.0.0:8000
chdir = /opt/myapp
pidfile=/opt/myapp/myapp.pid
processes = 4
threads = 2
master = true
vacuum = true
py-autoreload = 1
daemonize = /tmp/uwsgi.log
nginx配置
upstream backend {
server 192.168.182.110:8000;
server 192.168.182.111:8000;
}
server {
listen 8080;
server_name myapp.com;
location / {
include uwsgi_params;
proxy_pass http://backend;
}
}TCP和Unix套接字(Unix domain socket)是兩種不同類型的套接字。
因此,TCP套接字用于在網(wǎng)絡(luò)上進(jìn)行通信,而Unix套接字用于在同一臺計算機(jī)上進(jìn)行通信。雖然TCP套接字可以通過網(wǎng)絡(luò)連接到不同的計算機(jī),但是Unix套接字提供了更高效的進(jìn)程間通信機(jī)制,并且更適合于需要在同一臺計算機(jī)上運行的進(jìn)程間通信。
【TCP 示例】常用uwsgi.ini:
[uwsgi]
module = app:app
socket = 127.0.0.1:8000
chdir = /opt/myapp
pidfile=/opt/myapp/myapp.pid
processes = 4
threads = 2
master = true
vacuum = true
py-autoreload = 1
daemonize = /tmp/uwsgi.log
【unix 示例】僅限于本機(jī)通信,很少使用。uwsgi.ini:
[uwsgi]
module = app:app
socket = /opt/myapp/myapp.socket
chdir = /opt/myapp
pidfile=/opt/myapp/myapp.pid
processes = 4
threads = 2
master = true
vacuum = true
py-autoreload = 1
daemonize = /tmp/uwsgi.log
nginx配置
server {
listen 8080;
server_name myapp.com;
location / {
include uwsgi_params;
proxy_pass unix:///opt/myapp/myapp.sock;
}
}Python 中 web開發(fā)中的 WSGI、uWSGI 和 uwsgi 三者介紹就先到這里了

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流