介紹 Uvicorn:高效能 ASGI 伺服器
更新日期: 2025 年 2 月 13 日
本文為 AI 描述優化 api 設計 系列文,第 4 篇:
- 如何設計一個商品描述優化 API?—— 完整指南
- 設計 AI 優化商品描述的 Prompt
- FastAPI:高效且易用的 Python Web 框架
- 介紹 Uvicorn:高效能 ASGI 伺服器 👈進度
- Uvicorn 監聽 0.0.0.0,但為何 API 只能用 127.0.0.1 訪問?
- Tenacity:強大的 Python 重試機制庫
- FastAPI 建立商品描述優化 API
- 介紹 pytest:Python 測試框架的強大選擇
- Python httpx 完整指南:高效的 HTTP 客戶端
- Pytest-Benchmark:高效能測試的基準分析工具
- 深入解析 monkeypatch:Python 測試中的強大工具
- API 自動化測試與效能優化
建議閱讀本文前,先具備 聊天機器人-建議回復 相關系列文的概念。
在 Python Web 開發的領域,傳統的 WSGI(Web Server Gateway Interface)伺服器:如 Gunicorn 和 uWSGI 已經被廣泛應用。
然而,隨著異步編程(Asynchronous Programming)的興起,ASGI(Asynchronous Server Gateway Interface)成為了一種更靈活、更高效的標準。
而 Uvicorn 就是其中最受歡迎的 ASGI 伺服器之一。
Uvicorn 以其高效能、輕量級、基於 UVLoop 和 httptools 的架構受到許多開發者青睞,特別適合搭配 FastAPI 或 Starlette 等現代 Web 框架。
本篇文章將深入探討 Uvicorn 的特色、優勢,以及如何在專案中使用它。
什麼是 Uvicorn?
Uvicorn 是一款高效能的 Web 伺服器,專門用來執行基於 ASGI(Asynchronous Server Gateway Interface) 架構的應用程式。
它使用 Python 編寫,並運用兩個強大的技術:UVLoop 和 httptools,來確保網頁應用程式的運行速度極快。
在傳統的 Web 伺服器架構中,Django、Flask 等框架通常使用 WSGI(Web Server Gateway Interface) 來處理 HTTP 請求。
然而,WSGI 是一種「同步」(synchronous)架構,這意味著它一次只能處理一個請求,必須等當前的請求處理完成後才能繼續處理下一個請求。
這在高併發(大量用戶同時訪問)時,可能會導致延遲或效能問題。
ASGI 是 WSGI 的進化版本,支援「非同步」(asynchronous)處理,允許 Web 應用程式同時處理多個請求,並且支援 WebSockets、HTTP/2、長連線 等現代技術。
Uvicorn 作為 ASGI 伺服器,能夠幫助開發者建構更快速、更具擴展性的 Web 應用。
Uvicorn 的核心技術解析
Uvicorn 能夠如此快速的原因,在於它使用了兩個關鍵技術:
UVLoop(極速事件迴圈)
UVLoop 是一個高效能的「事件迴圈」(event loop),它建立在 libuv 之上。
libuv 是一個 C 語言編寫的高效能函式庫,被廣泛應用於 Node.js,負責非同步 I/O 處理。
在 Python 的標準異步處理庫 asyncio 中,內建的事件迴圈雖然功能完整,但效能相對較低。
而 UVLoop 能讓 Python 的 asyncio 運行速度提升 2 倍以上,大幅提高伺服器處理請求的效率。
簡單來說,UVLoop 能讓 Uvicorn 比傳統的同步伺服器 更快、更流暢地處理大量請求,特別適合高併發的應用場景,例如 API 服務、即時聊天應用等。
httptools(高效 HTTP 解析器)
httptools 是一個快速的 HTTP 解析器(HTTP parser),基於 llhttp,這是一個用 C 語言編寫的高效能函式庫,被 Node.js 用來解析 HTTP 請求。
當用戶透過瀏覽器或 API 客戶端發送 HTTP 請求時,伺服器需要解析這些請求,才能回應適當的內容。
httptools 讓 Uvicorn 在這個過程中更快、更有效地處理請求,減少延遲,提高伺服器的整體效能。
ASGI 支援(異步架構的基礎)
Uvicorn 完全支援 ASGI 3.0 標準,這讓它能夠運行各種基於 ASGI 的 Web 框架,例如:
- FastAPI(現代化的高效能 API 框架)
- Django Channels(讓 Django 支援 WebSockets 和即時通訊)
- Starlette(輕量級的 ASGI Web 框架,適合構建 API 服務)
由於 ASGI 支援非同步處理,這意味著 Uvicorn 伺服器能夠同時處理多個請求,不會因為單一請求而阻塞其他請求,這對於高併發應用來說非常重要。
為什麼選擇 Uvicorn?
高效能(極速處理請求)
Uvicorn 採用了「非同步」(async)架構,加上 UVLoop 和 httptools 的支援,使它能夠比傳統的同步 WSGI 伺服器更快地處理請求。
這對於需要處理大量 API 請求的應用來說,是一個極大的優勢。
例如,傳統的 Flask + Gunicorn 伺服器在高流量時,可能會因為同步架構而變慢,而 Uvicorn 搭配 FastAPI 則可以流暢地處理數千個並發請求。
原生支援 ASGI(更靈活的應用場景)
與傳統的 WSGI 伺服器不同,ASGI 允許 Web 應用程式使用 WebSockets、HTTP/2 和長輪詢(Long Polling)等技術,這讓開發者可以建構更豐富的應用,例如:
- 即時聊天應用(透過 WebSockets 即時傳遞訊息)
- 即時通知系統(例如即時推播或即時數據更新)
- 串流服務(如影音串流或直播數據)
如果你正在開發這類應用,Uvicorn 是一個非常適合的選擇。
輕量且易於部署(安裝簡單、依賴少)
Uvicorn 只有少量的核心依賴,這使它比其他 Web 伺服器(如 uWSGI)更輕量。
Uvicorn 也能輕鬆與 Docker、Kubernetes 等容器技術整合,讓開發者可以快速部署應用到雲端或分散式系統中。
例如,在 Docker 環境中,你只需要幾行命令就能啟動一個 Uvicorn 應用:
uvicorn app:app --host 0.0.0.0 --port 8000
這對於需要快速部署的開發團隊來說,是一個很大的優勢。
內建熱重載(reload)與多工作者模式(workers)
Uvicorn 提供了開發者友好的功能,例如:
✅ 熱重載(reload)
在開發階段,使用 --reload
參數,當程式碼變更時,Uvicorn 會自動重新啟動伺服器,無需手動重啟,提高開發效率。
uvicorn app:app --reload
✅ 多工作者模式(workers)
在正式環境中,可以使用 --workers
參數,根據伺服器的 CPU 核心數,啟動多個工作者進程,提升效能。
uvicorn app:app --workers 4
這樣可以讓 Uvicorn 在多核 CPU 的伺服器上發揮更好的效能,適用於高流量的 Web 應用。
如何使用 Uvicorn?
安裝 Uvicorn
可以使用 pip 安裝 Uvicorn:
pip install uvicorn
若要獲得更高效能,建議安裝完整版本(包含 uvloop 和 httptools):
pip install uvicorn[standard]
建立簡單的 ASGI 應用
以下是一個最簡單的 ASGI 應用:
async def app(scope, receive, send):
assert scope["type"] == "http"
response = b"Hello, Uvicorn!"
await send({
"type": "http.response.start",
"status": 200,
"headers": [(b"content-type", b"text/plain")],
})
await send({
"type": "http.response.body",
"body": response,
})
儲存為 app.py
,然後使用 Uvicorn 啟動:
uvicorn app:app --host 0.0.0.0 --port 8000
這樣就能透過 http://localhost:8000
訪問這個簡單的 ASGI 應用。
搭配 FastAPI 使用
Uvicorn 與 FastAPI 是完美的組合,以下是一個 FastAPI 應用範例:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello, FastAPI with Uvicorn!"}
使用 Uvicorn 啟動 FastAPI 應用:
uvicorn main:app --reload
這樣就能啟動一個具備 API 能力的 FastAPI 應用,並透過 http://127.0.0.1:8000
存取。
進階設定與部署 Uvicorn
使用多工作者模式(Workers)
在生產環境中,Uvicorn 可以透過 --workers
參數開啟多個進程,提高效能。例如:
uvicorn app:app --host 0.0.0.0 --port 8000 --workers 4
這將根據可用 CPU 核心數啟動 4 個工作者進程。
反向代理搭配 Nginx
Uvicorn 通常搭配 Nginx 或 Caddy 作為反向代理,提升安全性與效能。以下是一個基本的 Nginx 設定:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
這樣可以讓 Nginx 處理靜態檔案與 SSL,而 Uvicorn 專注於處理應用邏輯。
Docker 化 Uvicorn 應用
可以使用 Docker 部署 Uvicorn 應用,建立 Dockerfile
:
FROM python:3.10
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
然後構建與運行容器:
docker build -t my-uvicorn-app .
docker run -d -p 8000:8000 my-uvicorn-app
這樣就能在 Docker 環境中執行 Uvicorn 伺服器。
結論
Uvicorn 是 Python 界最強大的 ASGI 伺服器之一,憑藉其輕量、高效能的特點,已成為現代 Web 開發不可或缺的工具。
它不僅能夠提升 API 伺服器的處理能力,還能與 FastAPI、Starlette、Django Channels 等框架無縫整合。
如果你的專案需要高併發、低延遲的 API 服務,那麼 Uvicorn 絕對是最佳選擇之一!