在調整前,需先了解Apache及系統的內存占用現狀,為后續參數設置提供依據:
ps aux | grep httpd命令,重點關注%MEM(內存占用百分比)和RSS(實際內存使用量,單位KB)列,識別高內存進程。top命令(按M鍵按內存排序)或free -m命令,查看系統總內存、已用內存、剩余內存及Swap使用情況。Apache的內存使用主要由**MPM(多處理模塊)**決定,CentOS默認使用prefork(進程模式,適合兼容性場景),高性能場景建議切換至worker(線程模式)或event(異步線程模式)。需根據模塊類型調整對應參數:
編輯Apache配置文件(/etc/httpd/conf/httpd.conf或/etc/apache2/apache2.conf),注釋prefork模塊,啟用worker或event模塊:
# 注釋prefork模塊(若存在)
# <IfModule mpm_prefork_module>
# ...
# </IfModule>
# 啟用worker模塊(示例配置)
<IfModule mpm_worker_module>
StartServers 2 # 啟動時的工作進程數(每個進程包含多個線程)
MinSpareThreads 25 # 最小空閑線程數
MaxSpareThreads 75 # 最大空閑線程數
ThreadLimit 64 # 單個進程的最大線程數(需≤ThreadsPerChild)
ThreadsPerChild 25 # 每個工作進程創建的線程數
MaxRequestWorkers 150 # 最大并發請求數(=ThreadsPerChild×StartServers)
MaxConnectionsPerChild 0 # 每個進程處理的請求數(0=無限制,建議設為1000~10000防內存泄漏)
</IfModule>
注:
worker模式通過線程處理請求,內存占用遠低于prefork(每個線程共享進程內存)。
若因兼容性需保留prefork模塊,需調整以下參數平衡并發與內存:
<IfModule mpm_prefork_module>
StartServers 5 # 啟動時的進程數(根據負載調整)
MinSpareServers 5 # 最小空閑進程數(避免頻繁創建進程)
MaxSpareServers 10 # 最大空閑進程數(避免內存浪費)
MaxRequestWorkers 150 # 最大并發進程數(關鍵參數,需匹配內存容量)
MaxConnectionsPerChild 1000 # 每個進程處理的請求數(防內存泄漏)
</IfModule>
KeepAlive可減少TCP連接開銷,但會增加內存占用(長連接保持進程/線程活躍)。調整以下參數:
KeepAlive On # 啟用KeepAlive
MaxKeepAliveRequests 100 # 每個連接的最大請求數(避免單個連接占用過久)
KeepAliveTimeout 5 # 連接保持時間(秒,建議5~10秒)
注:若網站靜態資源多(如圖片、CSS),可適當增大
MaxKeepAliveRequests;若動態請求多,建議縮短KeepAliveTimeout。
Apache默認加載大量模塊,禁用未使用的模塊可釋放內存。執行以下命令查看已加載模塊:
httpd -M # 或 apachectl -M
禁用模塊(如status、autoindex):
LoadModule status_module modules/mod_status.so # 注釋掉此行(在配置文件中)
通過緩存靜態資源(HTML、CSS、JS)減少重復請求,降低內存負載:
# 啟用mod_cache和mod_disk_cache
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_disk_cache.so
# 配置緩存路徑和大小
CacheEnable disk /
CacheRoot "/var/cache/apache2"
CacheDirLevels 2
CacheDirLength 1
通過修改內核參數優化內存管理:
# 降低vm.swappiness(減少Swap使用,優先用物理內存)
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
# 允許內存過量使用(避免OOM Killer頻繁終止進程)
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl -p
sudo systemctl restart httpd(CentOS 7/8)或sudo systemctl restart apache2(部分版本)使更改生效。top、htop或apachetop(sudo yum install apachetop)實時查看內存占用,若MaxRequestWorkers設置過高導致內存耗盡,需逐步降低該值至系統穩定。MaxRequestWorkers需根據服務器內存計算(如每進程占用50MB,1GB內存建議設置為1024MB/50MB=20,留足系統預留內存)。/var/log/httpd/error_log(或error.log),關注內存泄漏或配置錯誤提示。