Web Server 異軍

從前架網站,Web Server 的選擇,不是 Windows 平台的 IIS ,就通常是 *nix 平台上的 Apache。這差不多是 IT 界多年來的金科玉律,根據 NetCraft 2014 年3月的 Web Server Survey ,Apache 跟 IIS 仍然名列前芧,市佔率各佔 38.22% 和 32.80%,成績也不俗。但如果您細心留意那一份報告,您會發現有一款名不見經傳的 Nginx,竟然名列第三名 (市佔率 15.00%),在 Active Site 和 Busiest Site 的統計上,竟然還超前老二 IIS,究竟這個後起之秀有何獨特之處?

C10K Problem

傳統一個程序要進行 concurrent processing,我們只好 fork 一個新 process 或建立一條新 thread 來實行 concurrent processing,雖然這樣做可能要處理 Data Synchronization 或出現 Race Condition 的問題,但由於 HTTP requests 通常都好獨立的 ( independent ),彼此間沒有甚麼聯繫,所以一些 Web Server 如老大 Apache ,就是 pre-fork 幾個 httpd process daemon 出來應付前來的 HTTP request。

但這個簡單的多工處理手法,很快就會遇上 Scalability 的問題。網上留傳一個 C10K 的問題,大概的意思是說,現今互聯網愈來愈普及,連帶智能手機和平板電腦的數量以幾何級數上昇,現在有很多網上應用都會跟 server 保持一個 keep-alive 的 connection ,一台 Web Server 要同時維持超過10,000 個 keep-alive connections 是一件尋常的事情。但這10,000 個 connections 的特徵是,大部份情況下都是 idle connection (等候 web client 下一步指示),及只是傳送相對比較小型的資料,例如一個 AJAX JSON call,一個 Facebook Like 或一個 Tweet 。( C10K 正是英文 10,000 個 Connections 的簡稱 )

試想像,現今那麼多網站利用 web 2.0 AJAX 技術來提昇網站互動,那麼多手機應用都是 one page html,要同時支持 10,000 個這樣特徵的 connections 真是不足為奇。

老大 Apache 要應付 C10K 很吃力
老大 Apache 要應付 C10K 很吃力

以 Apache 為例,建立一個 httpd process / thread 至少要用上幾 MB 記憶體,要應付 10,000 個 connections 就相當於要幾十 GB 的記憶體,而它是用 blocking I/O 來做socket read / write,等候的時間根本浪費系統資源,而傳送又是那麼小型的資料量,當中還未計算中間要建立 process / thread 的 overhead 和 CPU 要做的 Context Switching ,Apache要應付 C10K 方面,看來十分吃力。

Nginx Server

Nginx
Nginx

Nginx ( 英文發音 engine-x ),就是針對 C10K 問題而設計的,它採用了大量現代 OS 支持的 event-driven 和 non-blocking 的 system call,起動後只需要一個 master process 跟幾個 worker process,就可以輕鬆應付數以千計的 connections。原因是nginx 只會在收到需要工作的 event-notification 才會把工作分配給 worker process 執行,而每一個 worker process 又只會專門做一件簡單的工作,省卻了很多 conditional check、looping 等開銷,所以可以有效地使用系統資源,執行效能上亦比傳統 process / thread-based 的 Web Server 優勝。

根據一些官方網站的資訊,每10,000個 keep-alive connections,nginx 只需佔用大約 2.5 MB 的記憶體,比 apache 動輒要數十 GB 省卻很多。一些國外的網站的 performance test,更發現在同一個 stressful 的環境下,nginx 可以比 apache 處理多近十倍的 requests。

參考:How is nginx different from apache

Web server performance comparison

nginx 採用 BSD-like 的開源 license 發放,所以很快就得到 open source community 所接受並普及起來,它驚人的 concurrency connections 的效能但卻是那麼 light-weight,迅速地得到國外大型網站的垂青,如 Facebook 和 WorkPress.com。

雖然 nginx 本來設計出來是作為一個 HTTP reverse proxy,作為後台的 Cache Server,但現在已有支持 fastcgi、php 的 module,還支援 SSL,所以已不再是單純 serve static content 的 Web Server,是一個足以應付 HTTPS 和 dynamic content ,一般網站所需的主流 server。

Nginx 與 Amazon EC2

由於 Amazon EC2 的免費蚊型 t1.micro 只有 613MB 記憶體且原生不包括虛擬記憶體 (Swap space) ,很多利用 Amazon EC2 架設 blog 的網友都會棄 apache 而選 nginx,原因也是貪圖它的 less memory footprint 和 higher transfer rate,blog 的特性又多是傳送文字和圖片且多是 readonly 的 request,正合 nginx 的 use case。

Nginx – Web Server 異軍突起
Tagged on:                     

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

zh_HKChinese (Hong Kong)