Nginx 與 Apache 對比
前面兩個小節(jié)我們講述了 Nginx 的一些優(yōu)點,這一節(jié)我們來與 Web 服務器領域的另一個霸主 Apache 做一下比較。如果說 Nginx 是新生代霸主的話,那么 Apache 就是當之無愧的老霸主。至少在前幾年 Nginx 在 Web 服務器領域只是占據(jù)老二的位置。
但是隨著互聯(lián)網的發(fā)展,越來越多的人和企業(yè)開始轉向 Nginx 的懷抱,從而使得 Nginx 的市場占有率逐年上升,直到牢牢占據(jù)第一的寶座。那么這一對新老技術的代表之間,究竟有著怎樣的差別呢?
1. 進程模型
Nginx 的進程模型前面已經提到過,它是通過異步的、非阻塞的、事件驅動的方式實現(xiàn)的。 Nginx 的工作進程是多進程的,每個 Worker 進程可以異步處理大量的用戶請求,因此在高并發(fā)下 Nginx 能保持低資源低消耗高性能。
Apache 有一共有三種穩(wěn)定的 MPM(Multi-Processing Module,多進程處理模塊)模式,其中最常用和默認的是 prefork 模式。prefork 是一個非線程型的、預派生的 MPM,使用多個進程,每個進程在某個確定的時間只單獨處理一個連接,效率高,但內存使用比較大。一個進程相對占用更多的系統(tǒng)資源,消耗更多的內存。
因此,Apache 并不擅長處理高并發(fā)請求。 在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。因此 Apache 是阻塞型的。當用戶請求過多時,開啟的進程較多,占用內存大,每秒最多的并發(fā)連接請求最多不超過 3000 個,而 Nginx 則可以每秒并發(fā)連接超過 10 萬請求。
2. 配置文件
Nginx 的配置簡潔,且支持正則表達式,使用起來非常方便。在啟動或者熱加載時都會優(yōu)先檢查配置文件是否存在語法錯誤。Apache 的配置則略顯復雜,而且只有啟動時候才知道配置是否存在問題,如果是重啟出錯則會導致服務中斷,進而影響業(yè)務。
3. 性能對比
根據(jù)前面的進程模型對比,我們可以看出:Nginx 是輕量級、支持高并發(fā)、海量請求的 web 服務器,而 Apache 是重量級、不支持高并發(fā)的 web 服務器。
Nginx 在處理靜態(tài)文件方面的性能要遠超于Apache,而且支持壓縮、緩存等配置。 Nginx 最擅長的是靜態(tài)資源訪問和反向代理。其反向代理模塊也同時支持 4 層協(xié)議(主要是 TCP 協(xié)議/ UDP 協(xié)議)和七層協(xié)議(HTTP 協(xié)議、WebSocket 協(xié)議、WSGI 協(xié)議等)的反向代理。同時也可以作為負載均衡服務器,也支持 4 層和 7 層的負載均衡,這些優(yōu)勢是 Apache 無法比擬的。但是 Apache 在處理動態(tài)請求方面有較大優(yōu)勢,比如 rewrite(對 url 重寫)功能。如果網站使用 rewrite 頻繁的情況下,建議用 Apache。
此外,根據(jù) Nginx 和 Apache 的進程模型,可以看到,Apache 一個進程對應一個連接請求,而 Nginx 的一個 worker 進程可能對應很多個連接請求,這樣如果 Nginx 的一個進程死掉,會影響比較多的用戶請求,所以 Apache 相比 Nginx 會更穩(wěn)定一些。
4.部署方面
Nginx 安裝和啟動都特別容易, 并且?guī)缀蹩梢宰龅?7*24 不間斷運行,即使運行數(shù)個月也不需要重新啟動,支持熱部署,實現(xiàn)不間斷服務的情況下進行軟件版本的升級與版本的回退。而 Apache 在修改配置后,只能手工重啟服務或者使用第三方插件實現(xiàn)熱部署,期間服務會出現(xiàn)短暫的不可用。
5. 社區(qū)情況
Apache 出現(xiàn)時間比較早,仍然是主流的 Web 服務器,擁有豐富的特性,成熟的技術和開發(fā)社區(qū),還有數(shù)不甚數(shù)的第三方插件。而 Nginx 作為后起之秀,社區(qū)同樣非?;钴S,版本迭代更新快,各種高性能的第三方模塊層出不窮。使用 Apache 和 Nginx 中出現(xiàn)的大部分問題都能在社區(qū)和網上找到相應的解決方案。