Python模塊Uvicorn實(shí)戰(zhàn)
Uvicorn 是一個(gè)高性能的 ASGI 實(shí)現(xiàn)。它是構(gòu)建和運(yùn)行 Python 基于 ASGI 的 Web 和實(shí)時(shí)服務(wù)器應(yīng)用的理想選擇。它特別適合于構(gòu)建高性能、實(shí)時(shí)的應(yīng)用,如 WebSocket、HTTP/2、GraphQL API等。本文將通過一些實(shí)戰(zhàn)例子,教你如何使用 Uvicorn 構(gòu)建和運(yùn)行應(yīng)用。
1. 介紹和安裝
1.1 介紹
Uvicorn 是一個(gè)基于 Python 的輕量級(jí) ASGI 服務(wù)器,以 uvloop 和 httptools 為核心,以提供極速和高效。
1.2 安裝
使用 pip 安裝:
pip install uvicorn
如果需要最高性能,建議安裝以下選項(xiàng):
pip install uvicorn[standard]
該包含 uvloop 和 httptools,并提供完善的日志和進(jìn)程以及完整的處理能力。
2. 創(chuàng)建基礎(chǔ)應(yīng)用
2.1 簡(jiǎn)單的 HTTP 應(yīng)用
創(chuàng)建一個(gè)文件,名為 app.py
:
from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"message": "Hello, World!"}
使用 Uvicorn 運(yùn)行該應(yīng)用:
uvicorn app:app --host 0.0.0.0 --port 8000 --reload
2.2 添加日志
實(shí)際應(yīng)用中,日志很重要。使用 --log-level
可以控制日志輸出:
uvicorn app:app --log-level debug
定制日志格式:
uvicorn app:app --log-config logging.yaml
一個(gè)例子 logging.yaml
:
version: 1 formatters: default: format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s" handlers: console: class: logging.StreamHandler formatter: default loggers: uvicorn: handlers: [console] level: INFO root: handlers: [console] level: INFO
3. 實(shí)現(xiàn)高級(jí)功能
3.1 支持 WebSocket
在添加 WebSocket 支持時(shí),可以使用 FastAPI 的高性能功能。
from fastapi import FastAPI, WebSocket app = FastAPI() @app.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: data = await websocket.receive_text() await websocket.send_text(f"Message text was: {data}")
運(yùn)行該應(yīng)用,并使用瀏覽器接入 WebSocket。
3.2 優(yōu)化運(yùn)行性能
在高流量場(chǎng)景中,使用 --workers
可以超現(xiàn)行處理。
uvicorn app:app --host 0.0.0.0 --port 8000 --workers 4
舉例:指定服務(wù)器使用 uvloop :
uvicorn app:app --loop uvloop
4. Nginx 配置反向代理
在生產(chǎn)環(huán)境中,使用 Nginx 作為反向代理,可以提供以下優(yōu)勢(shì):
- SSL 支持
- 更好的負(fù)載均衡能力
- 請(qǐng)求過濾與緩存
以下是具體配置步驟:
4.1 安裝與配置 Nginx
- 安裝 Nginx
在基于 Debian 的系統(tǒng)中:
sudo apt update sudo apt install nginx
在基于 Red Hat 的系統(tǒng)中:
sudo yum install nginx
- 編輯 Nginx 配置文件
創(chuàng)建或修改一個(gè) Nginx 站點(diǎn)配置文件,例如 /etc/nginx/sites-available/uvicorn
:
server { listen 80; server_name example.com; location / { proxy_pass http://127.0.0.1:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } error_log /var/log/nginx/uvicorn_error.log; access_log /var/log/nginx/uvicorn_access.log; }
- 啟用站點(diǎn)配置
在基于 Debian 的系統(tǒng)中:
sudo ln -s /etc/nginx/sites-available/uvicorn /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
在基于 Red Hat 的系統(tǒng)中,直接編輯 /etc/nginx/nginx.conf
添加上述配置,然后重新加載 Nginx:
sudo nginx -t sudo systemctl reload nginx
4.2 啟用 SSL 支持
使用 Let’s Encrypt 為域名啟用 HTTPS 支持:
- 安裝 Certbot:
sudo apt install certbot python3-certbot-nginx
- 自動(dòng)配置 HTTPS:
sudo certbot --nginx -d example.com
完成后,Nginx 將自動(dòng)更新為支持 HTTPS 的配置。
- 定期更新證書:
Certbot 會(huì)自動(dòng)添加定期更新任務(wù)。如果需要手動(dòng)測(cè)試:
sudo certbot renew --dry-run
4.3 性能優(yōu)化建議
- 啟用 HTTP/2 支持:
在 listen
指令中添加 http2
:
listen 443 ssl http2;
- 啟用 Gzip 壓縮:
在 Nginx 配置中啟用 Gzip 壓縮:
gzip on; gzip_types text/plain application/json application/javascript text/css;
- 優(yōu)化緩沖設(shè)置:
調(diào)整 proxy_buffer_size
和 proxy_buffers
:
proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k;
5. 常見問題與解決方案
5.1 高并發(fā)問題
在高并發(fā)場(chǎng)景下,Uvicorn 可能會(huì)因?yàn)?CPU 飽和而表現(xiàn)出瓶頸。解決方案包括:
- 增加
--workers
參數(shù)以啟用多進(jìn)程。 - 使用負(fù)載均衡器(如 Nginx 或 HAProxy)分配請(qǐng)求。
5.2 WebSocket 超時(shí)
WebSocket 可能在高流量時(shí)出現(xiàn)超時(shí)問題。可以通過調(diào)整 Uvicorn 的 --timeout-keep-alive
參數(shù)增加連接存活時(shí)間:
uvicorn app:app --timeout-keep-alive 120
5.3 日志不完整
日志在高負(fù)載時(shí)可能出現(xiàn)丟失情況。解決方法是使用獨(dú)立日志管理器(如 ELK 或 Fluentd)集中處理日志。
6. 總結(jié)
Uvicorn 是構(gòu)建現(xiàn)代高性能 Python 應(yīng)用的利器。通過靈活的配置和良好的性能優(yōu)化,它可以輕松應(yīng)對(duì)從開發(fā)到生產(chǎn)的各種場(chǎng)景。在這篇文章中,我們涵蓋了 Uvicorn 的安裝、基礎(chǔ)功能、性能優(yōu)化以及部署技巧。希望這些內(nèi)容能幫助你更高效地使用 Uvicorn。
到此這篇關(guān)于Python模塊Uvicorn實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Python Uvicorn內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python pyttsx3庫實(shí)現(xiàn)文本轉(zhuǎn)語音功能的示例
- Python調(diào)用JAR包的類和方法詳細(xì)指南
- Python實(shí)現(xiàn)文件/文件夾復(fù)制功能
- Python實(shí)現(xiàn)無痛修改第三方庫源碼的方法詳解
- Python如何使用__slots__實(shí)現(xiàn)節(jié)省內(nèi)存和性能優(yōu)化
- Python+PyQt5實(shí)現(xiàn)多屏幕協(xié)同播放功能
- Python中隨機(jī)休眠技術(shù)原理與應(yīng)用詳解
- 基于Python開發(fā)高效文件搜索與內(nèi)容匹配工具
相關(guān)文章
簡(jiǎn)單易懂Pytorch實(shí)戰(zhàn)實(shí)例VGG深度網(wǎng)絡(luò)
這篇文章主要介紹了簡(jiǎn)單易懂Pytorch實(shí)戰(zhàn)實(shí)例VGG深度網(wǎng)絡(luò),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python使用redis pool的一種單例實(shí)現(xiàn)方式
這篇文章主要介紹了Python使用redis pool的一種單例實(shí)現(xiàn)方式,結(jié)合實(shí)例形式分析了Python操作redis模塊實(shí)現(xiàn)共享同一個(gè)連接池的相關(guān)技巧,需要的朋友可以參考下2016-04-04Python批量加密Excel文件的實(shí)現(xiàn)示例
在日常工作中,保護(hù)敏感數(shù)據(jù)是至關(guān)重要的,本文主要介紹了Python批量加密Excel文件的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12Python爬蟲進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn)
這篇文章主要介紹了Python爬蟲進(jìn)階之爬取某視頻并下載的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python實(shí)現(xiàn)發(fā)送聲情并茂的郵件內(nèi)容和附件
Python是一種高級(jí)編程語言,它可以用于編寫各種類型的應(yīng)用程序,包括發(fā)送電子郵件。本文就來演示如何使用Python發(fā)送HTML格式的電子郵件,感興趣的可以了解一下2023-04-04