# [基礎系列] WSGI 與 ASGI/Application Server 與 Web Server
# WSGI (Web Server Gateway Interface, 網站伺服器閘道介面)
假設你有使用 Python Web Framework 開發的 Developer 可能會有聽過看過 WSGI 與 ASGI
WSGI 是一個協定定義,Web Server 與 Python Web Application 之間的規範,WSGI 規範讓開發者會比較彈性
WSGI 類似請求者與 Server 之間的 Midderwale 中繼器
# WSGI Server
指符合 WSGI 的 Server Python Web 上可能比較常見的有 uwsgi,gunicorn
# 使用 WSGI 的理由
平常我們可能會用 Nginx,IIS,Apache 去來擔任我們的 Web Server,但是 Web Server 無法去啟動我們的 Python Web Application,也就是說 Nginx 這類 Web Server 無法實現 WSGI 規範,所以需要透過 WSGI Server 來完成 WSGI
延伸議題:我的系統架構中並沒有 WSGI 好像也可以跑?
事實上 Django/Flask 都有自帶 WSGI Server 的功能所以才會產生這種錯覺,不過內建的 WSGI Server 通常部會出現在 Production 環境中,多半為測試用。
延伸議題:那為甚麼我的 Application 也需要 Web Server?
使用 Web Serve 也能提高一些在操作系統上的效能,像靜態的請求事實上 Web Server 處理的效率會比 WSGI Server 好一點大概歸類一下 Web Server 的優點:
- Cache: 可以減少 Response 等待時間,效能感覺上更快
- Static File: 靜態檔案處理
- Load Balance: 負載平衡
- Reverse Proxy (Nginx): 外部請求並不適直接訪問內部而是透過 Proxy 來接收 Request 與發送 Response,像是一個中繼站一樣。
# Web Server 與 Application Server 差異
# Web Server
Web Server: 只能拿來處理靜態資源,負載平衡、代理,所謂動態的資源,是指會把需求轉發到程式語言起的 Application Server,
# Static/Dynamic Web Server
Static Web Server 靜態網頁伺服器:只需要負責簡易的非動態元素與資訊,如不會改變檔案內容的 HTML 檔案。
Dynamic Web Server 動態網頁伺服器:除了擁有靜態網頁伺服器的功能外加上動態改變元素的功能,如在網頁上加入系統資料等等。
# Application Server
Application Server: Application Server 接受從 Web Server 來的請求後處理完,再丟 response 回去,由 Web Server 進行回應,最後才回到 Client 端。
# ASGI (Asynchronous Server Gateway Interface, 異步伺服器閘道介面)
ASGI 是 WSGI 的後者,WSGI Server 可以直接裝在 ASGI Server 上,專門給同步 / 非同步 Application 提供標準,支援的協議有些 WSGI 不支援,支援一些較新的協議,是多種通訊協定如 HTTP,WebSocket 對應到 Python Application 之間的 Interface
流程圖
實際流程