Apache HTTP Server 作為全球部署最廣泛的 Web 服務器,其默認配置往往面向通用場景。針對高併發、大流量、特定業務 (靜態資源/動態應用/代理/下載) 進行精細化調優,能顯著提升吞吐量、降低延遲、增強穩定性。本文深度解析四大核心調優維度:**最大連接數控制、單連接請求限制、超時時間策略、KeepAlive 權衡**,並給出參數計算公式、監控指標、避坑指南與實戰配置模板。
MaxClients (Prefork) / MaxClients (Worker/Event)MaxRequestWorkers,MaxClients 保留為別名ServerLimit (上限)、ThreadLimit (Worker/Event 線程上限)# 核心公式
MaxRequestWorkers = (Total_RAM - OS_Reserved - Other_Services_RAM) / Avg_Process_RSS
# 實測步驟
1. 啟動 Apache 運行一段時間 (含業務高峰)
2. 采樣單進程 RSS (Resident Set Size)
ps -ylC httpd --sort:rss | awk '{sum+=$8; count++} END {print sum/count/1024 " MB"}'
# 或使用 pmap -x | tail -1
3. 預留內存:OS 1-2GB、數據庫/緩存/監控 Agent 等
4. 設置 ServerLimit ≥ MaxRequestWorkers (Prefork) 或 ServerLimit × ThreadLimit ≥ MaxRequestWorkers (Worker/Event)
若 Apache 由 xinetd 管理 (罕見,通常獨立運行),instances 限制生效優先級高於 MaxRequestWorkers。現代部署多為 Systemd 直接管理或容器化,**忽略 xinetd 交互**。
| 場景 | MPM | MaxRequestWorkers 參考 | 關鍵考量 |
|---|---|---|---|
| 靜態資源/CDN/高併發下載 | Event | 500-2000+ | 低內存/進程、高並發、長連接、啟用 sendfile |
| PHP/Python/Ruby 動態應用 (mod_php/mod_wsgi) | Prefork | 50-300 | 高內存/進程、非線程安全模塊、避免線程爭用 |
| Java/Go/Node 反向代理 | Event | 200-800 | 後端為瓶頸、Apache 僅作代理/SSL 卸載 |
| 內網管理/低併發 | Prefork/Event | 50-100 | 資源充裕、無需極限壓榨 |
MaxConnectionsPerChild (保留舊名別名)1000-10000 (視洩漏嚴重程度),PHP 建議 1000-50000 (無限,無洩漏風險)watch -n 1 'ps -ylC httpd --sort:rss' 觀察 RSS 增長趨勢| 參數 | 默認值 | 含義 | 調優方向 |
|---|---|---|---|
Timeout | 60s | 請求讀寫、握手、空閒的總超時 | API/靜態資源降至 10-30s;大文件上傳/長輪詢需放大至 300s+ |
KeepAliveTimeout | 5s | KeepAlive 連接空閒等待下一請求 | 高併發短連接 1-2s;長連接業務 5-15s |
SetEnvIf + RequestHeader + 不同虛擬主機/Location 設置差異化超時| 維度 | KeepAlive On | KeepAlive Off |
|---|---|---|
| 頁面加載性能 | ✅ 減少 TCP 三次握手/SSL 握手開銷、瀏覽器並行下載資源 | ❌ 每資源新建連接、延遲疊加 |
| 服務器併發容量 | ❌ 佔用工作進程/線程槽位 (即使空閒) | ✅ 快速釋放槽位、支援更多並發用戶 |
| 內存佔用 | ❌ 進程/線程常駐內存 | ✅ 按需創建銷毀 |
| 適用場景 | 瀏覽器訪問、靜態資源多、延遲敏感、前端未做資源合併 | API 服務、高併發短連接、後端為瓶頸、負載均衡器後端 |
# 推薦基線配置 (Apache 2.4 Event MPM)
StartServers 4
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
ServerLimit 16
MaxConnectionsPerChild 10000
KeepAlive On
KeepAliveTimeout 2
MaxKeepAliveRequests 100
Timeout 30
# 針對 API 關閉 KeepAlive
KeepAlive Off
Timeout 10
net.core.somaxconn = 65535 (監聽隊列)net.ipv4.tcp_tw_reuse = 1、net.ipv4.tcp_fin_timeout = 15 (TIME_WAIT 復用)net.ipv4.tcp_max_syn_backlog = 65535fs.file-max = 1000000、ulimit -n 65535 (文件描述符)sendfile、tcp_nopush、tcp_nodelay (Nginx 同名指令,Apache 依賴內核)# 實時連接狀態
watch -n 1 'ss -ant | grep :80 | awk "{print \$1}" | sort | uniq -c'
# Apache 狀態頁 (需開啟 mod_status + ExtendedStatus On)
curl https://localhost/server-status?auto
# 關鍵指標
# BusyWorkers / IdleWorkers / MaxRequestWorkers
# ReqPerSec / BytesPerSec / BytesPerReq
# CPULoad / Uptime
Apache 調優沒有銀彈,只有基於業務模式、硬體資源、監控數據的持續迭代。掌握四大核心策略的底層機制、參數交互關係、計算方法,建立「修改配置 → 壓測 (ab/wrk/locust) → 觀測指標 → 分析瓶頸 → 調整參數」的閉環,才能將 Apache 從「能跑」推向「跑滿、穩住、省資源」。