[軟體概念入門系列] 瀏覽器與伺服器 — Part 2
此節敘述Client端Request如何送到Server端的服務, 以及IDC與AWS的網路架構範例
Client端與Server端直接溝通, Api使用預設的Http 80 port
反向代理
當同一台Server端有多個Web服務時會使用不同的Port, 中間可用Nginx, Apache, IIS等服務來依據不同domain轉導到正確的服務上, Client端只需要帶不同的domain即可訪問到不同的服務, 但Client端並不會知道實際的服務位置, 此即反向代理的概念
以下圖為例, 在沒有DNS Server的情況下, 需要在Client端的host file設定兩個Domain都指到Nginx上, 由Nginx轉導到後面的兩個不同服務取得回應後再回傳給User
有DNS Server的情況下, 則會先至DNS Server查詢domain的實際IP Address (實際情況也可能會是外部IP Address)
Load Balance與High Availability
Load Balance:
為了分散各服務的負載壓力, 將一樣的服務部署到不同的Server上, 此時前方的Nginx可以做相應的設定, 讓Request可以平均地或依據特定規則分配到對應的服務上
High Availability:
而在上述的情況下Wallet Api即使有其中一台無法服務, 仍不影響功能的運作, 也就是透過了部署Redundant的Wallet Api避免了單點故障, 也達到了高可用性
考慮到Nginx有可能也會發生單點故障, 在前面使用HaProxy作為Nginx的Load Balancer, 而此時HaProxy仍有可能會發生單點故障, 因此實際上HaProxy也會是配置兩台
HaProxy及Nginx都可以做到負載平衡, 而HaProxy在負載平衡上的效能較佳, Nginx則是可以依據Request內的資訊做更多靈活的判斷及邏輯處理
防火牆與正向代理
Client端會透過CDN提供較鄰近用戶的節點來存取服務, F5作為我們地端IDC機房的防火牆僅會讓白名單核可CDN的節點才可進入 (實際上此邏輯目前實作在Forward Nginx而非F5, 但F5是可以做到此功能的)
而在IDC內的服務若要存取Internet也會透過F5出去, 此時會用相同的外部IP Address, 對於網路上的服務而言, 並無法知道是IDC內的哪一個服務來存取, 此即正向代理
Security Zone
IDC內為了安全性, 會將不同屬性的服務切分為不同的Security Zone:
- External Zone: Client端較有機會直接接觸, 安全性較低, 因此需要做相對應的Token驗證, 惡意攻擊防禦等機制
- Internal Zone: 僅有External Zone或Internal Zone內的其他服務可以接觸, 安全性較高
- Data Zone: 僅有Internal Zone或Data Zone內的其他服務可以接觸, 安全性最高, 通常會把資料庫相關的服務放在這個區域