---
# System prepended metadata

title: '[基礎系列]WSGI與ASGI/Application Server與Web Server'
tags: [Web]

---

---
tags: GDSC
---

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

流程圖
![](https://i.imgur.com/7NsxbvS.png)
實際流程
![](https://i.imgur.com/zlpKtnr.png)
