WEB服务器如何选择 Apache or Nginx?
本篇目錄
Web服務器是直接影響網站性能的關鍵因素,也是每個站長選擇網站運營環境時必然考慮的問題。目前 Web服务器市场産品众多,最为主流和代表性的当属 Apache、 Nginx以及微軟的 IIS。本文目的是通過 Apache和 Nginx進行對比,從而幫助廣大用戶們能夠選擇適合自己的 Web服務器。
一、簡介
Apache:
Apache創建于 1995年,並從 1999 年開始在 Apache 軟件基金會旗下進行開發。 Apache靈活、高效,擁有豐富的擴展模塊,以及活躍的社區支持,成爲目前世界上最爲主流的開源免費的 Web服務器軟件。
Nginx:
Nginx是由俄羅斯軟件工程師 Igor Sysoev編寫的免費開源 Web服務器。自从 2004年上市以來, nginx專注于高性能,高並發性和低內存使用。並且其在負載均衡,緩存,訪問和帶寬控制以及與各種應用程序高效集成等方面的特性,都使得它逐步深受廣大用戶青睐。
下面是2017年9月11日更新的最新web服務器市場份額對比圖:
數據來源: https://news.netcraft.com/archives/2017/09/11/september-2017-web-server-survey.html
二、對比
雖然 Apache和 Nginx各自的背景不同,但他們的作用目的是一致的,簡單說就是接收用戶請求,然後處理請求,最後將處理結果返回給用戶。
1. 鏈接處理
Apache和 Nginx最大的不同在于它們對連接的處理方式。 Apache提供一系列多重處理模塊,通過這些多重處理模塊來使用操作系統的資源,對進程和線程池進行管理,控制處理用戶請求。
Apache提供了三種多重處理模塊: mpm_prefork、 mpm_worker、 mpm_envent,下面我們做簡要說明對比。
mpm_prefork :模塊産生衆多子進程,每個子進程是單線程的,每個線程鏈接一個請求,如此一對一的關系。所以如果請求數大于進程數時,服務器的性能就表現得差強人意了。
mpm_worker :與 prefork不同, worker中子進程是多線程的,每個線程管理一個用戶連接。線程數要多于進程數量,這也就意味著新的連接能立刻得到一個空閑的線程,而不用等待進程空閑。

mpm_event :该模块與 worker相似,區別在于 event可以處理長連接 (keep-alive ),以避免線程被請求長期占用而造成資源浪費,同時也增強了高並發場景下的請求處理能力。

與 Apache不同, Nginx是通過異步的、非阻塞的、事件驅動的方式在實現的。 Nginx的工作進程是單線程的,每個線程可以異步的處理大量的用戶請求。下面是 Nginx的工作原理圖:

圖片來源: http://www.aosabook.org/en/nginx.html
2. 静态與動態内容的处理
无论是静态还是動態内容, Apache都可以處理, Apache具有内置的解析和执行各种動態脚本语言(包括 PHP, Python和 Perl)的功能,無需借助外部處理器。
毫无疑问,動態内容处理恐怕是 Nginx的痛點。 Nginx处理動態内容的效率并不高 ,且需借助外部的处理器。所以如果您的站点具有很多動態功能, Apache的表现可能会更切合你意。不过雖然與 Apache相比 Nginx的動態内容处理能力不佳,但其静态内容处理还是很高效的。
三、總結
Apache 擁有豐富的模塊組件支持,穩定性強, BUG 少,動態内容处理强。
Nginx 輕量級,占用資源少,負載均衡,高並發處理強,靜態內容處理高效。
存在即有道理, Apache和 Nginx作爲 WEB服务各有所长,个人认为二者并不存在将来谁会完全替代谁。关键在于用户要认真考虑清楚自己的应用场景,根据自己的需求和情况来斟酌选择哪个産品,适合自己的才是最好的。

