# 3.6 服務器架構
## 3.6 服務器架構
### 簡單的情況
Web服務器位于整個網站的最前端,它接受客戶端的HTTP請求,并作出應答,如圖所示:

流行的Web服務器有[Apache HTTP Server](https://httpd.apache.org/)、[Nginx](https://nginx.org/),以及微軟的[IIS](http://www.iis.net/)等。另外,有一些Web編程技術依賴于特定的Web服務器,如前面提到的[Java Servlet](java.html)須要運行在Servlet容器,如[Aapche Tomcat](http://tomcat.apache.org/),中;[Node.js](nodejs.html)應用內建Web服務器。
### 負載均衡
對一個請求繁忙的網站來說,一個Web服務器可能是不夠的;它往往有一組Web服務器,通過某種負載均衡技術組合起來,共同對外提供Web服務,如圖所示:

**負載均衡器(Load Balancer)**接受來自用戶的HTTP請求,并把它轉發給內部的Web服務器。
知名的負載均衡器有[HAProxy](http://www.haproxy.org/)等。另外,Apache HTTP Server和Nginx等Web服務器也可以配置為負載均衡器使用。
需要說明的是,負載均衡器實際上是一種Web**反向代理(Reverse Proxy)**。反向代理不僅可以做負載均衡,還可以做[Web緩存](web_cache.html),或稱之為Web加速器(Web Accelerator)——它可以緩存那些動態生成的頁面,用以響應對這些頁面的請求,從而加速網站訪問。知名的Web加速器有[Varnish](https://www.varnish-cache.org/)等。另外,有些負載均衡器也有加速功能,比如Nginx(這是一種多功能的Web服務器)。
### 高可用性
少數網站有**高可用性(High Availability)**的要求,它要求網站在任何一個節點(如Web服務器、負載均衡器等)失效的情況下仍然可以正常工作。這須要對每個節點做冗余(redundency),并且在發生故障時自動切換故障節點,如圖所示:

其中,“DNS解析”部分是這種架構的關鍵:它把一個域名,如www.example.com,指向到多個不同的IP——在本例中對應著不同的負載均衡器。瀏覽器會依次向這些IP發出請求,直到一個有效的節點。這種技術又稱為**Round Robin DNS**[1](#fn_1)。
> 1. Round Robin DNS是一個有爭議的HA技術,由于TTL的存在,故障切換不是“即時”發生的。但是即時性更好的DNS解析技術往往需要更大的代價,或者依賴服務器供應商提供的專有技術,如Digital Ocean的Floating IP。[?](#reffn_1 "Jump back to footnote [1] in the text.")
- 前言
- 1 Web概述
- 1.1 什么是Web
- 1.2 超文本和超鏈接
- 1.3 URL
- 1.4 DNS
- 1.5 HTTP
- 1.5.1 客戶端請求
- 1.5.2 服務器應答
- 1.5.3 進一步了解HTTP
- 1.6 HTTPS
- 2 Web瀏覽器
- 2.1 HTML
- 2.1.1 文檔類型聲明
- 2.1.2 標簽和屬性
- 2.1.3 文檔結構
- 2.1.4 DOM
- 2.1.5 進一步了解HTML
- 2.2 CSS
- 2.2.1 樣式與樣式表
- 2.2.2 樣式表語法
- 2.2.3 級聯樣式表
- 2.2.4 進一步了解CSS
- 2.3 JavaScript
- 2.3.1 script標簽
- 2.3.2 操縱DOM
- 2.3.3 jQuery
- 2.3.4 進一步了解JavaScript
- 2.4 Ajax
- 2.5 移動設備與響應式Web設計
- 3 Web服務器
- 3.1 方法與資源
- 3.2 狀態代碼
- 3.3 靜態內容與動態內容
- 3.4 編程語言與技術
- 3.4.1 CGI
- 3.4.2 PHP
- 3.4.3 Java
- 3.4.4 Python
- 3.4.5 Ruby
- 3.4.6 Node.js
- 3.5 RESTful Web API
- 3.6 服務器架構
- 3.7 Web緩存
- 3.8 服務器推送
- 4 數據庫
- 4.1 關系型數據庫
- 4.2 NoSQL數據庫
- 5 Web服務器的其他組件
- 5.1 Cron
- 5.2 消息隊列
- 5.3 郵件服務器
- 6 開發工具與技術
- 6.1 Git
- 6.1.1 Git基礎操作
- 6.1.2 Git基本原理
- 6.1.3 進一步了解Git
- 6.2 敏捷開發