# [基礎系列]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
流程圖

實際流程

{"metaMigratedAt":"2023-06-17T18:23:52.251Z","metaMigratedFrom":"YAML","title":"[基礎系列]WSGI與ASGI/Application Server與Web Server","breaks":true,"contributors":"[{\"id\":\"4c8f8799-9dcd-430b-b7bc-8a5156d39d0b\",\"add\":1703,\"del\":19}]"}