You are currently viewing nginx-vs-apache-網頁伺服器到底該用哪個好

nginx-vs-apache-網頁伺服器到底該用哪個好

簡介

Apache vs Nginxnginx vs apache 網頁伺服器到底該用哪個好 ?

許多人在剛接觸網頁伺服器架設時應該都會遇到這個問題吧,

並且在查詢一些資料後可能大多數的人都會選擇使用 Nginx 來架設,因為 NGINX 更輕巧更快速 !!

但是真正是這樣嗎 ? 又或是應該要如何正確的選擇呢?

這裡會依照測試出來的數據,配合上我自己測試以及維運的心得來進行說明。


效能測試

這裡是使用 VPS 虛擬機規格如下 :

  • System : CentOS Linux release 7.5.1804
  • CPU : 1 x QEMU Virtual CPU version 2.5+
  • Memory : 2G + 1 G swap

網頁伺服器使用 Openresty 1.13.6.2 以及 Apache 2.4.33

因為 Openresty ( nginx ) 僅能使用 php-fpm , 皆使用 proxy to php-fpm Unix socket 的方式,以避免因為執行模式不同而形成的誤差,並且 Openresty、Apache 以及 php 皆是使用手動編譯的方式安裝,編譯安裝的方式,以及設定方式會在另一篇中另外詳述,此篇僅針對效能間的差異進行比較。

Openresty 編譯安裝請見此篇 : https://blog.beck-yeh.idv.tw/linux/web-server/openresty-php-fpm/

Apache 編譯安裝請參考此篇 : https://blog.beck-yeh.idv.tw/linux/web-server/apache-php-install/

至於測試工具部分,則是使用 Apache ab 並使用此指令進行測試 : abs -c 10 -n 500 https://nginx.beck-yeh.idv.tw/

測試結果 :

Openresty ( nginx ) :

12345
CPU Loading4.913.384.904.454.15
Memory Usage121Mb129Mb128Mb126Mb128Mb
Requests per second15.7615.5815.9016.2616.13

Apache :

12345
CPU Loading3.214.584.904.794.58
Memory Usage144Mb128Mb128Mb133Mb145Mb
Requests per second14.4115.1414.4115.1314.33

結論及心得分享 :

從以上的數據來說,Openresty ( nginx ) 在速度上大約領先了 10% 左右,CPU Loading 差不多,而記憶體方面 Apache 多使用了大約 8% ,Openresty ( nginx ) 並未有大幅度的速度領先,那為何大部分的文章都又說 Openresty ( nginx ) 更快呢 ? Openresty ( nginx ) 到底又到底快在哪呢?

我個人的見解是,其實針對 PHP 網站的執行上,最大影響速度的原因是出於 PHP 執行速度 ,而並非是 網頁伺服器的回應速度,也因此這 2 種網頁伺服器在對比上就不會有顯著的差異,那麼 Openresty ( nginx ) 與 Apache 相比,差異又或是優劣到底是什麼呢 ?

Openresty ( nginx ) 相比 Apache 優勢地方,歸納出以下 2 點 :

  1. 靜態頁面的處理速度
  2. 資源消耗更少

對於純靜態頁面的處理速度上 Openresty ( nginx ) 與 Apache 的差異可不只是這 10% ,尤其是在這 2 個網頁伺服器都開啟快取的情形下差異會來的更加的明顯,此時又會有人說了,既然 Openresty ( nginx ) 這麼好,為何Apache 還是這麼多人在使用呢 ? 那麼 Apache 優勢又是什麼呢 ?

我個人的理解是,Apache 作為老牌的網頁伺服器,雖然有著肥大,以及消耗更多資源的缺點,但是它更好的兼容各種 CGI 程式,例如 perl、php、python 等,以及用戶可以使用上的彈性 ( .htaccess 可以針對 gzip、rewrite、expire 等 module 自訂義 ) 。

優點說完了,接下來說說各自的缺點 :

Openresty ( nginx ) 在串連後端程式時,只能使用 php-fpm / fastcgi 模式,php-fpm 雖然執行速度快,但是 pool 的設計,在多用戶多網站的情形下,反而會因為每一個 pool 的最小空閒程序 ( pm.min_spare_servers ),導致大量的資源占用,而如果為避免此情形將 pm 模式從 dynamic 變更為 ondemand 則又會有速度降低的情形反倒不如使用 Apache with suEXEC + mod_fastcgid 來的快速,並且 mod_fastcgi 可以讓 Apache 統籌處理避免此狀況。

以下表格為 Openresty + PHP-FPM ondemand mode :

12345
Requests per second7.427.867.627.717.42

Apache 的 mod_fastcgid 的問題則是在 Apache graceful restart 時資源不會正常釋放的問題,以及在空閒時,突然皆收到大量要求時,必須等待 worker 建立後才能正常進行回應 ( 反應緩慢 ),以及大量 worker 被建立後資源占用的情形。當然,以上兩點都是可以透過調校 Apache 來改善 ( 無法完全避免 ) , 也因此 Apache 除了配置困難外還需要資深的工程師調校才能穩定的運行,上手困難也算是 Apache 的缺點之一。

因此我個人推薦的使用方式是 :

在少網站少用戶的情形下使用 Nginx 得到更好的速度,以及更少的資源消耗;

而中量網站中量用戶的情形可以開始考慮使用 Apache 來讓用戶獲得自訂的彈性;

而大量網站大量用戶的情形則是使用 Nginx proxy to Apache 的架構,讓 Nginx 處理大量靜態頁面的要求,後端程式則是使用 Apache 來運行,讓用戶可以享受 Apache 的彈性,並且可以消除 php-fpm 所帶來的問題。

最後針對 Nginx、Apache thread、proccess 的部分,這裡在引述高人的解釋,有興趣的可以再自行觀看 :


Apache

Apache是如何工作的,為什麽會有極限

Apache 通過創建進程和線程來處理其他的連接。管理員可以通過設置來控制服務器所能允許的最大進程數量。這個配置因機器的可用內存而異。過多的進程會耗盡內存從而使得機器使用磁盤上的交換內存,這嚴重的降低了性能。而且,當達到進程的上限之後,Apache 會拒絕新的連接。

Apache可以通過設置來運行在 pre-forked 模式或 worker multi-process 模式 ( MPM )。當其他的用戶連接時,兩種方式都會創建新的進程。區別在於,pre-forked 模式為每一個進程創建一個線程,用來處理一個用戶的請求。worker 模式也創建新的進程,但是每一個進程至少有一個線程,每一個線程用來處理單個用戶的單個請求。所以,一個 worker mode 的進程處理至少一個連接,而一個 per-fork 模式的進程只處理一個連接。

相比於 forked 模式,worker 模式使用更少的內存,原因是進程比線程消耗更多的內存,線程只是運行在進程中的代碼。

此外,worker 模式不是線程安全的。這意味著如果你使用像 mod_php 這樣的非線程安全的模塊來服務 php 頁面時,你需要使用 pre-forked 模式,因此要消耗更多的內存。所以,當選擇模塊和配置服務器時,你必須要面對是線程還是進程更優的問題以及一些約束的問題。

在調整 Apache 時的一個限制因素是內存以及當爭奪同一個 CPU 和內存時潛在的線程死鎖問題。如果一個線程停止了,用戶會一直處於等待頁面出現的狀態,直到進程將該線程回收,以便可以發回頁面。如果一個線程發生了死鎖,它不知道如何重啟,因此會一直處於卡住狀態。

Openresty

和 Apache 相比,Nginx 的工作方式有很大不同,主要是在於它如何處理線程。

Nginx 並不會為每一個的 web 請求創建新的進程,相反,管理員可以配置 Nginx 主進程的工作進程的數量(一個常見的做法是為每一個 CPU 配置一個工作進程)。所有這些進程都是單線程的。每一個工作進程可以處理數千個並發的請求。它通過一個線程來異步的完成了這些工作,而沒有使用多線程的編程模型。

Nginx 還拆分了緩存加載器 ( cache loader ) 和緩存管理器 ( cache manager ) 進程用來從磁盤中讀取數據並將其加載到緩存中,當緩存直接讀取的時候緩存過期。

Nginx 有一系列的模塊組成,這些模塊在編譯的時候就被包含進去了。這意味著,用戶下載源碼並選擇他們要編譯的模塊。這些模塊中包括連接後端應用服務器,負載均衡,代理服務器以及其他。並沒有 PHP 的模塊,因為 Nginx 可以自己編譯 PHP 代碼。

Beck Yeh

熱愛學習於 Linux 與 程式設計 在網站中分享各式各樣學習到的新知識

This Post Has One Comment

  1. vax-r

    好文 感謝大大的分享

發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料