iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
Security

跨出第一步:D 從0到0.1的Web security 系列 第 12

Day 11: 網站的心臟:常見網站伺服器 Apache vs. Nginx 大對決

  • 分享至 

  • xImage
  •  

今天我們要來聊聊這兩位老大哥 Apache 與 Nginx

Apache 和 Nginx 是當今世界上最主流的兩款開源網站伺服器 (Web Server),我們今天從核心架構、效能表現、設定方式以及應用場景等多個角度,為你深入解析這兩者之間的特色與關鍵差異。

我們需要了解一件事情,這兩個伺服器的核心架構是根本性的不同

Apache HTTP Server
Apache 的歷史非常久,他傳統架構是「每個連線一個進程/執行緒 (Process/Thread per Connection)」。為了應對不同需求,它發展出了多種處理模組 (MPM, Multi-Processing Modules):

1.Prefork MPM (Process-based):

這是最古老、最穩定的模式。伺服器會預先產生 (fork) 數個子進程 (child processes)。
每個子進程在同一時間只能處理一個請求。當一個請求進來時,會被分配給一個閒置的子進程,直到請求處理完畢。

優點: 非常穩定,進程之間完全獨立,一個進程崩潰不會影響其他進程。對於不支援執行緒安全 (thread-safe) 的第三方模組(例如早期的 PHP)相容性極佳。
缺點: 非常消耗記憶體。每個進程都佔用獨立的記憶體空間,當並行連線數增多時,記憶體消耗會急遽上升,容易達到系統上限,這就是所謂的 C10K 問題 (無法處理超過一萬個並行連線)。

2.Worker MPM (Hybrid Process-Thread):

為了解決 Prefork 的效能問題而生。伺服器會啟動數個子進程,但每個子進程內部會再建立多個執行緒 threads(不是你剛剛在滑的)。
每個執行緒負責處理一個請求。因此,一個進程可以同時處理多個請求。

優點: 相比 Prefork,記憶體佔用顯著減少,能夠處理更高的並行連線數。
缺點: 需要模組支援執行緒安全。單一進程下的某個執行緒崩潰可能影響該進程下的所有其他請求。

Nginx (Engine-X)
Nginx 從一開始就是為了解決 C10K 問題而設計的,它的核心是「事件驅動、非同步、非阻塞架構 (Event-driven, Asynchronous, Non-blocking)」。

運作方式:

Nginx 使用少量的、固定的工作進程 (Worker Processes),通常設定為與 CPU 核心數相同。

每個工作進程都是單執行緒的,並且能夠透過高效的事件通知機制 (如 epoll on Linux, kqueue on FreeBSD) 同時處理成千上萬個連線。

當一個請求進來時,工作進程不會為它阻塞等待 (例如等待磁碟 I/O 或後端回應),而是將這個請求註冊一個事件,然後立即去處理下一個請求。當之前的 I/O 操作完成後,事件機制會通知工作進程,工作進程再回過頭來處理這個請求的後續步驟。

優點:
極低的記憶體消耗:不會因為連線數增加而線性增加記憶體用量。
極高的並行處理能力:非常擅長處理大量靜態檔案的請求和高併發的 TCP 連線。

缺點:
由於其事件驅動模型,不適合嵌入需要在內部執行大量阻塞式操作的第三方模組。


上一篇
Day 10:為何我的網站不能隨便抓取別人的資料?聊聊同源政策 (Same-Origin Policy)
系列文
跨出第一步:D 從0到0.1的Web security 12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言