目錄
一、概述​​
二、安裝uwsgi 模組
1)設定pip來源
2)安裝uwsgi 模組
三、範例示範(uWSGI Nginx 設定)
1)安裝nginx
2)建立app. py 檔案
3)創建uWSGI 設定檔
4)启动 uWSGI
5)配置 Web 服务器
6)重启 Web 服务器
7)Nginx upstream 负载均衡
1、轮询(默认)
2、权重(weight)
3、IP散列(ip_hash)
8)http、http-socket 和 socket 区别
9)TCP 与 uinx 区别
首頁 後端開發 Python教學 Python 之 WSGI、uWSGI 和 uwsgi 介紹

Python 之 WSGI、uWSGI 和 uwsgi 介紹

Apr 12, 2023 am 09:25 AM
web 工具 開發

一、概述​​

WSGI 、uWSGI 和 uwsgi 是三個相關的概念,它們是在 Web 應用程式開發中使用的不同的工具和協定。以下是它們的詳細介紹:

  • WSGI(Web Server Gateway Interface):WSGI 是一個Python Web 應用程式與Web 伺服器之間的接口規範,它定義了應用程式和伺服器之間的標準接口,使得應用程式可以在不同的Web 伺服器上運行。 WSGI 規範規定了應用程式必須實作的介面方法和伺服器需要支援的方法。 WSGI 協定使得不同的 Python Web 框架(例如 Flask、Django 等)能夠在不同的 Web 伺服器上運行,這些伺服器可以是 Apache、Nginx 等。
  • uWSGI:uWSGI 是一個 Web 伺服器,它是一個用C 語言寫的Web 應用程式容器,支援運行Python、Ruby 、Perl 等多種程式語言。 uWSGI 伺服器可以作為一個獨立的應用伺服器,也可以與其他 Web 伺服器(如 Nginx、Apache)一起使用,透過 WSGI 協定與 Python 應用程式通訊。
  • uwsgiuwsgi 是與 uWSGI 伺服器相關的協定。 uwsgi 協定是一種二進位協議,它定義了 uWSGI 伺服器與應用程式之間的通訊協定。使用 uwsgi 協議,uWSGI 伺服器可以與 Python 應用程式通信,而不需要像 CGI 那樣啟動一個新的進程來處理每個請求。 uwsgi 協定允許 uWSGI 伺服器與應用程式之間進行雙向通信,從而提高了效能。

因此,uWSGI 是一個 Web 伺服器,可以透過 WSGI 協定與 Python 應用程式通信,並使用 uwsgi 協定進行通訊。 WSGI 是 Python Web 應用程式與 Web 伺服器之間的介面規範,定義了應用程式和伺服器之間的標準介面。而 uwsgi 則是 uWSGI 伺服器與應用程式之間的二進位通訊協定。

Python 之 WSGI、uWSGI 和 uwsgi 介紹

二、安裝uwsgi 模組

uWSGI 是一種Web 伺服器閘道介面(Web Server Gateway Interface),它可以用於將Python Web 應用程式與Web 伺服器(如Nginx 或Apache)整合在一起。

  • 在使用uWSGI模組時,需要安裝#uwsgi模組,並在Python Web應用程式中導入uwsgi模組,並使用uwsgi模組提供的函數來設定和管理網路應用程式的運作。常見的uwsgi模組函數包括uwsgi.optin()、uwsgi.route()、uwsgi.applications()等。
  • 另外,uWSGI模組也提供了一些進階特性,如Master/Worker模式、行程管理、負載平衡、自動擴充等,讓Web應用程式可以更好地適應高並發和大流量的情況。

1)設定pip來源

國內來源位址:

  • pypi 清華大學來源: https://pypi.tuna.tsinghua.edu.cn/simple
  • pypi 騰訊來源:http://mirrors.cloud.tencent.com/pypi/simple
  • pypi 阿里源:https://mirrors.aliyun.com/pypi/simple/
mkdir~/.pip/
cat >~/.pip/pip.conf<<EOF
[global]
index-url = https://repo.huaweicloud.com/repository/pypi/simple
trusted-host = repo.huaweicloud.com
timeout = 120
EOF
登入後複製

2)安裝uwsgi 模組

# 安装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
登入後複製

Python 之 WSGI、uWSGI 和 uwsgi 介紹

三、範例示範(uWSGI Nginx 設定)

Python 之 WSGI、uWSGI 和 uwsgi 介紹

1)安裝nginx

yum update -y
yum install epel-release
yum -y install nginx
登入後複製

2)建立app. py 檔案

建立一個名為 app.py 的文件,新增以下程式碼:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
return 'Hello, World!'

if __name__ == '__main__':
app.run()
登入後複製

3)創建uWSGI 設定檔

建立一個uWSGI 設定文件,例如 uwsgi.ini##,其中包含以下資訊:

[uwsgi]
module = app:app 
# 相当于命令下面两行
#wsgi-file = app.py # 项目入口文件
#callable = app #flask应用对象
# 支持http+socket两种方式,这里选用socket,也可以选择http-socket,下面会讲解这三种区别
# http = 127.0.0.1:8000
socket = 0.0.0.0:8000
# 也可以使用socket文件,在nginx配置文件中配置也对应,仅限本机通信,一般也很少使用
# socket = /app/myapp.sock

# 注意记得提前创建目录
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常用設定參數詳解:

  • chdir=/xxx/xxx # 指定项目目录, 这里写上程序根目录(即app.py文件所在目录)对应上述目录结构为src
  • home=/xxx/xxx # 指定虚拟环境变量
  • wsgi-file=xxx # 指定加载WSGI文件
  • socket=xxx # 指定uwsgi的客户端将要连接的socket的路径(使用UNIX socket的情况)或者地址(使用网络地址的情况)。#socket协议,用于和nginx通讯,端口可配置成别的端口;如果有nginx在uwsgi之前作为代理的话应该配socket 如:socket=0.0.0.0:5000。当然也可以使用http-socket #而如果客户端请求不经过(不搭建)Nginx代理服务器,服务请求直接到uwsgi服务器的话那么就配http。如:http=0.0.0.0:5000;IP和端口与项目启动文件app.py中一致; 127.0.0.1虽然是表示本地IP,但想要在网络上访问必须设置host=0.0.0.0才不受IP限制。
  • callable=app # 这个 app 指的是 flask 项目启动程序中定义的 flask name 的名字,我的启动程序是 app.py , 里面定义的 flask 的名字是 app 。
  • module = mysite.wsgi # 加载一个WSGI模块,这里加载mysite/wsgi.py这个模块
  • `master=true # 指定启动主进程
  • `processes=4 # 设置工作进程的数量
  • threads=2 # 设置每个工作进程的线程数
  • vacuum=true # 当服务器退出时自动删除unix socket文件和pid文件
  • logfile-chmod=644 # 指定日志文件的权限
  • daemonize=%(chdir)/xxx.log # 进程在后台运行,并将日志打印到指定文件
  • pidfile=%(chdir)/xxx.pid # 在失去权限前,将主进程pid写到指定的文件
  • uid=xxx # uWSGI服务器运行时的用户id
  • gid=xxx # uWSGI服务器运行时的用户组id
  • procname-prefix-spaced=xxx # 指定工作进程名称的前缀
  • chdir=/xxx/xxx # 指定项目目录, 这里写上程序根目录(即app.py文件所在目录)对应上述目录结构为/opt/uwsgi/
  • listen = 120 # 设置socket的监听队列大小(默认:100)

4)启动 uWSGI

在命令行中启动 uWSGI:

uwsgi --ini uwsgi.ini
###或者
uwsgi uwsgi.ini

### 重启
uwsgi --reload /opt/myapp/myapp.pid
###关闭
uwsgi --stop /opt/myapp/myapp.pid
登入後複製

Python 之 WSGI、uWSGI 和 uwsgi 介紹

【温馨提示】其实也可以通过一条命令带上对应的参数即可启动,但是不推荐,测试可以。一般使用配置文件的方式启动服务。

使用http协议启动uwsgi的命令为:

uwsgi --http :8000 --ini uwsgi_conf.ini -d ./uwsgi.log --pidfile=uwsgi.pid
登入後複製
  • --http 指定用5800端口启动http协议
  • --ini 指定上述的启动配置文件
  • -d 指定uwsgi的log,方便我们调试
  • --pidfile 将启动的进程号写到uwsgi.pid文件中,方便我们在需要停止服务器时kill掉。

5)配置 Web 服务器

将 Web 服务器配置为反向代理 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 文件包含以下内容:

uwsgi_paramQUERY_STRING $query_string;
uwsgi_paramREQUEST_METHOD $request_method;
uwsgi_paramCONTENT_TYPE $content_type;
uwsgi_paramCONTENT_LENGTH $content_length;

uwsgi_paramREQUEST_URI$request_uri;
uwsgi_paramPATH_INFO$document_uri;
uwsgi_paramDOCUMENT_ROOT$document_root;
uwsgi_paramSERVER_PROTOCOL$server_protocol;
uwsgi_paramREQUEST_SCHEME $scheme;
uwsgi_paramHTTPS$https if_not_empty;

uwsgi_paramREMOTE_ADDR$remote_addr;
uwsgi_paramREMOTE_PORT$remote_port;
uwsgi_paramSERVER_PORT$server_port;
uwsgi_paramSERVER_NAME$server_name;
登入後複製

Python 之 WSGI、uWSGI 和 uwsgi 介紹

【特别注意】uwsgi_params 在nginx conf文件夹下自带,uwsgi_pass一定要跟uwsgi_conf.ini中写的地址完全一致。

6)重启 Web 服务器

重启 Web 服务器以使配置生效。

# 重启
systemctl restart nginx

# 如果是之前nginx服务已经存在,只是修改了配置,可建议使用reload加载
nginx -t && nginx -s reload
# 或者
systemctl reload nginx
登入後複製

访问(浏览器访问,curl访问也行)

Python 之 WSGI、uWSGI 和 uwsgi 介紹

7)Nginx upstream 负载均衡

Nginx上游(upstream)是指一组后端服务器,Nginx可以与其通信并将客户端请求转发到这些服务器。换句话说,上游服务器是N​ginx代理请求的后端服务器。

Nginx的upstream支持5种 分配方式,其中 轮询(默认)、权重、IP散列这三种为Nginx原生支持的分配方式,fair 和 url_hash 为第三方支持的分配方式。

1、轮询(默认)

轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器 down 掉后,能自动剔除。

upstream backend {
server 192.168.182.110:8000;
server 192.168.182.111:8000;
}
登入後複製

2、权重(weight)

轮询的加强版,既可以指定轮询比率,weight 和访问几率成正比,主要应用于后端服务器异质的场景下。

upstream backend {
server 192.168.182.110:8000 weight=1;
server 192.168.182.111:8000 weight=2;
}
登入後複製

3、IP散列(ip_hash)

每个请求按照访问 Ip(即Nginx的前置服务器或客户端IP)的 hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决 session 一致问题。

upstream backend {
ip_hash;
server 192.168.182.110:8000 weight=1;
server 192.168.182.111:8000 weight=2;
}
登入後複製

先在另外一个节点上再起一个uWSGI服务,将上面示例配置修改:

# 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 节点 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 节点 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()
登入後複製

验证

curl127.0.0.1:8080
登入後複製

Python 之 WSGI、uWSGI 和 uwsgi 介紹

从上图可知,请求轮询调度,这才是企业一般想要的效果,负载均衡。

8)http、http-socket 和 socket 区别

  • httphttp-socket的区别在于,如果我们想直接将uwsgi用作服务器(例如Apache和nginx那样)直接暴露在公网那么就使用http
  • 如果有单独的服务器(例如Apache或者nginx),由服务器将请求转发给uwsgi处理,并且使用http协议,那么此时使用http-socket
  • http: 自己会产生一个http进程(可以认为与nginx同一层)负责路由http请求给worker, http进程和worker之间使用的是uwsgi协议。
  • http-socket: 不会产生http进程, 一般用于在前端webserver不支持uwsgi而仅支持http时使用, 他产生的worker使用的是http协议。
  • 因此, http 一般是作为独立部署的选项; http-socket 在前端webserver不支持uwsgi时使用, 如果前端webserver支持uwsgi, 则直接使用socket即可(tcp or unix)。

【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;
}
}
登入後複製
登入後複製

9)TCP 与 uinx 区别

TCP和Unix套接字(Unix domain socket)是两种不同类型的套接字。

  • TCP套接字是基于TCP/IP协议的网络套接字,用于在网络上进行进程间通信。TCP套接字需要指定IP地址和端口号,以便其他进程可以连接到该套接字进行通信。TCP套接字是一种跨网络边界的套接字,可以在不同的计算机之间进行通信。TCP套接字常用于客户端/服务器架构中,如Web服务器、数据库服务器等。
  • Unix套接字是基于Unix域套接字(Unix domain socket)的本地套接字,用于在同一台计算机上进行进程间通信。Unix套接字只需要指定一个文件路径,而不需要使用IP地址和端口号。Unix套接字是一种进程间通信(IPC)机制,它提供了高效、可靠和安全的进程间通信方式。Unix套接字通常用于本地服务器和本地客户端之间的通信,例如X Window系统中的客户端和服务器。

因此,TCP套接字用于在网络上进行通信,而Unix套接字用于在同一台计算机上进行通信。虽然TCP套接字可以通过网络连接到不同的计算机,但是Unix套接字提供了更高效的进程间通信机制,并且更适合于需要在同一台计算机上运行的进程间通信。

【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 示例】仅限于本机通信,很少使用。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开发中的 WSGI、uWSGI 和 uwsgi 三者介绍就先到这里了

以上是Python 之 WSGI、uWSGI 和 uwsgi 介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

十大數字貨幣交易所app推薦 幣圈虛擬幣交易所排名前十 十大數字貨幣交易所app推薦 幣圈虛擬幣交易所排名前十 Apr 22, 2025 pm 03:03 PM

十大數字貨幣交易所app推薦:1. OKX,2. Binance,3. gate.io,4. Huobi,5. Coinbase,6. KuCoin,7. Kraken,8. Bitfinex,9. Bybit,10. Bitstamp,這些app均提供實時行情、技術分析和價格提醒功能,幫助用戶實時監控市場動態並做出明智的投資決策。

靠譜好用的虛擬幣交易所app推薦 幣圈十大交易所排行榜最新 靠譜好用的虛擬幣交易所app推薦 幣圈十大交易所排行榜最新 Apr 22, 2025 pm 01:21 PM

靠譜好用的虛擬幣交易所app是:1. Binance,2. OKX,3. Gate.io,4. Coinbase,5. Kraken,6. Huobi Global,7. Bitfinex,8. KuCoin,9. Bittrex,10. Poloniex。這些平台因其交易量、用戶體驗和安全性等因素被評選為最佳,均提供註冊、驗證、存款、提款和交易操作功能。

十大數字虛擬貨幣app排行榜 幣圈交易數字貨幣交易所排名前十 十大數字虛擬貨幣app排行榜 幣圈交易數字貨幣交易所排名前十 Apr 22, 2025 pm 03:00 PM

十大數字虛擬貨幣app排行榜分別是:1. OKX,2. Binance,3. gate.io,4. Coinbase,5. Kraken,6. Huobi,7. KuCoin,8. Bitfinex,9. Bitstamp,10. Poloniex。這些交易所根據交易量、用戶體驗和安全性等因素評選,均提供多種數字貨幣交易服務和高效的交易體驗。

meme幣交易所排行榜 meme幣主流交易所top10盤點 meme幣交易所排行榜 meme幣主流交易所top10盤點 Apr 22, 2025 am 09:57 AM

最適合交易Meme幣的平台包括:1. 幣安(Binance),全球最大,流動性高,低手續費;2. 歐意(OKX),高效交易引擎,支持多種Meme幣;3. XBIT,去中心化,支持跨鏈交易;4. 雷迪姆(Solana DEX),低成本,結合Serum訂單簿;5. PancakeSwap(BSC DEX),交易費用低,速度快;6. Orca(Solana DEX),用戶體驗優化;7. Coinbase,安全性高,適合新手;8. 火幣(Huobi),亞洲知名,交易對豐富;9. DEXRabbit,智能

2025數字貨幣交易平台有哪些 十大數字貨幣app最新排行榜 2025數字貨幣交易平台有哪些 十大數字貨幣app最新排行榜 Apr 22, 2025 pm 03:09 PM

十大虛擬幣看盤平台app推薦:1. OKX,2. Binance,3. Gate.io,4. Huobi,5. Coinbase,6. Kraken,7. Bitfinex,8. KuCoin,9. Bybit,10. Bitstamp,這些平台提供實時行情、技術分析工具和用戶友好的界面,幫助投資者進行有效的市場分析和交易決策。

適合新手的數字貨幣交易App有哪些?一文了解幣圈 適合新手的數字貨幣交易App有哪些?一文了解幣圈 Apr 22, 2025 am 08:45 AM

選擇適合新手的數字貨幣交易平台需考慮安全性、易用性、教育資源和費用透明度:1. 優先選擇提供冷存儲、雙重驗證和資產保險的平台;2. 界面簡潔、操作清晰的App更適合新手;3. 平台應提供教程和市場分析等學習工具;4. 注意交易手續費和提現費等隱性成本。

免費的看盤軟件網站有哪些 幣圈十大免費看行情軟件排名 免費的看盤軟件網站有哪些 幣圈十大免費看行情軟件排名 Apr 22, 2025 am 10:57 AM

币圈十大免费看行情软件排名前三分别是OKX、Binance和gate.io。1. OKX提供简洁界面和实时数据,支持多种图表和市场分析。2. Binance功能强大,数据准确,适合各种交易者。3. gate.io以稳定性和全面性著称,适合长期和短线投资者。

幣圈行情實時數據免費平台推薦前十名發布 幣圈行情實時數據免費平台推薦前十名發布 Apr 22, 2025 am 08:12 AM

適合新手的加密貨幣數據平台有CoinMarketCap和非小號。 1. CoinMarketCap提供全球加密貨幣實時價格、市值、交易量排名,適合新手與基礎分析需求。 2. 非小號提供中文友好界面,適合中文用戶快速篩選低風險潛力項目。

See all articles