前言
Apache HTTP Server(httpd)與 Nginx 是全球前兩大 Web 伺服器,合併市佔率超過 60%。兩者架構哲學迥異:Apache 採用多進程/多執行緒模塊化,Nginx 採用事件驅動非同步單執行緒。本文從核心組件、生命週期、工作模式(MPM vs Reactor)、請求處理流程、效能特徵五個維度深度剖析。
一、核心架構對比
| 維度 | Apache (httpd) | Nginx |
| 架構風格 | 模塊化、進程/執行緒池 | 事件驅動、單主進程+多 Worker 進程 |
| 核心組件 | Core + MPM + APR + Modules | Core + Event Loop + Modules (Handler/Filter/Proxy) |
| 可移植層 | APR (Apache Portable Runtime) | 自行封裝 OS 介面(極薄) |
| 配置風格 | 指令式、分散式 .htaccess | 聲明式、集中式 nginx.conf |
| 動態模組載入 | DSO (LoadModule) 原生支援 | 靜態編譯為主,動態模組較少用 |
二、Apache 深度剖析
1. MPM(Multi-Processing Module)三大模式
| MPM | 模型 | 適用場景 | 優/缺點 |
| Prefork | 多進程(單執行緒),預派生子進程池 | 非執行緒安全模組(如舊版 mod_php)、相容性優先 | 穩定、相容好;記憶體佔用大、並發受限 |
| Worker | 多進程+多執行緒,每進程固定執行緒數 | 高並發、執行緒安全模組 | 記憶體效率高;需確保所有模組執行緒安全 |
| Event | Worker 改良,專用 Listener 執行緒處理 Keep-Alive | 高並發長連線(HTTP/1.1 Keep-Alive、HTTP/2) | 解決 Worker 阻塞於 Keep-Alive 問題;2.4+ 穩定 |
2. 請求處理生命週期(11 階段 Hook)
- Post-Read-Request:請求讀取後,最早介入點
- URI Translation:URL → 檔案系統路徑(
mod_alias、mod_rewrite)
- Header Parsing:解析請求頭(
mod_setenvif)
- Access Control:允許/拒絕存取(
mod_authz_host)
- Authentication:用戶認證(
mod_auth_basic、mod_authn_file)
- Authorization:權限授權(
mod_authz_user)
- MIME Type Checking:判斷 Content-Type/Handler(
mod_mime)
- FixUp:內容生成前最後修飾(最常用 Hook)
- Response:核心內容生成(
mod_php、mod_proxy_fcgi、靜態檔)
- Logging:記錄存取/錯誤日誌
- CleanUp:資源釋放、連線關閉
3. PHP 整合方式演進
mod_php(Prefork 專用):嵌入 Apache 進程,效能最好但佔記憶體、不支援執行緒安全。
mod_proxy_fcgi + PHP-FPM(Event/Worker):Apache 僅代理,PHP-FPM 獨立進程池管理,架構解耦、支援多版本共存。
三、Nginx 深度剖析
1. Master-Worker 進程模型
- Master 進程:讀取配置、管理 Worker、平滑重載(舊 Worker 自然消亡、新 Worker 接管)。
- Worker 進程:單執行緒事件循環,處理數萬並發連線,非阻塞 I/O(epoll/kqueue/IOCP)。
- 快取區:共享記憶體區(Shared Memory Zones)存儲快取、限流、Session 等跨 Worker 數據。
2. 模組分類與處理流程
Client Request
│
▼
+---------------------+
| Nginx Core | → 依 location 匹配選擇 Handler
| (配置解析、路由) |
+---------------------+
│
▼
+---------------------+
| Handler (唯一) | → 產生響應內容
| e.g. ngx_http_static_module, ngx_http_fastcgi_module, ngx_http_proxy_module
+---------------------+
│
▼
+---------------------+
| Filters (鏈式) | → 修改響應(gzip, chunked, SSI, headers)
| header filter → body filter
+---------------------+
│
▼
Client Response
3. 關鍵模組類型
- Handler:內容生成器(靜態檔、FastCGI 代理、uWSGI、gRPC、Proxy)。
- Filter:響應後處理(
gzip、headers_more、sub_filter、chunked)。
- Upstream/Proxy:負載均衡、健康檢查、Session 親和性(
upstream 區塊)。
四、效能與並發特徵對比
| 指標 | Apache (Event MPM) | Nginx | 說明 |
| 靜態檔案吞吐 | 高 | 極高 | Nginx 零拷貝 + sendfile + 事件模型優勢 |
| 動態應用代理 | 高 (mod_proxy_fcgi) | 高 | 兩者皆為反向代理模式,差異微小 |
| 記憶體佔用 (10k 閒置連線) | ~400-600 MB | ~10-20 MB | Nginx 單執行緒事件循環極省記憶體 |
| CPU 密集型處理 | 多核擴展佳 | 需多 Worker 進程擴展 | Apache 執行緒池天然多核;Nginx 需 worker_processes auto |
| 配置熱重載 | graceful restart (秒級) | 極快 (毫秒級) | Nginx Master-Worker 設計天然支援 |
| .htaccess 分散式配置 | 支援 | 不支援 | Apache 適合虛擬主機多租戶;Nginx 需集中管理 |
五、選型決策矩陣
| 場景 | 推薦 | 理由 |
| 高並發靜態資源/CDN 邊緣節點 | Nginx | 記憶體效率、零拷貝、事件模型 |
| PHP 應用(Laravel/Symfony/WordPress) | Nginx + PHP-FPM | 生態標準、配置簡潔、效能最佳 |
| Java/Python/Go 微服務網關 | Nginx / OpenResty | Upstream 模組、Lua 腳本擴充、gRPC 代理 |
| 共享虛擬主機(多用戶 .htaccess) | Apache | 分散式配置、模組豐富、相容性 |
| 企業內部舊系統(mod_perl/mod_python/mod_auth_kerb) | Apache | 模組生態、不想重寫認證邏輯 |
| HTTP/2 + TLS 1.3 終結點 | Nginx / Apache 2.4+ | 兩者均完善支援,Nginx 配置更簡潔 |
六、總結
Apache 贏在模組生態廣度、分散式配置彈性、執行緒模型多核擴展;Nginx 贏在高並發記憶體效率、事件驅動架構、反向代理/負載均衡原生支援、配置熱重載速度。現代雲原生架構中,Nginx/OpenResty 作為邊緣網關 + 後端微服務、Apache 專注相容性場景,雙棲部署最常見。