[基礎系列]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的優點:

  1. Cache: 可以減少Response等待時間,效能感覺上更快
  2. Static File: 靜態檔案處理
  3. Load Balance: 負載平衡
  4. 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

流程圖

實際流程

更新於