1. 诊断内存占用根源
首先确认Apache是否为内存占用高的主因,使用top -p $(pgrep apache2 | paste -s -d,)(Ubuntu/Debian)或top -p $(pgrep httpd | paste -s -d,)(CentOS/RHEL)查看Apache进程的**RES(常驻内存)**列,判断单个进程内存消耗;通过ps aux | grep apache | grep -v grep | wc -l统计活跃进程数量,若进程数过多(如数百个),则需调整进程管理配置。同时,使用apache2ctl -V | grep 'MPM'(Ubuntu/Debian)或httpd -V | grep 'MPM'(CentOS/RHEL)确认当前MPM(多处理模块),Prefork模式(每请求一个进程)内存占用远高于Event/Worker模式(多线程),需优先考虑切换。
2. 切换至低内存MPM模式
若当前使用Prefork MPM(常见于传统PHP环境),建议升级至Event或Worker模式(需确保PHP使用PHP-FPM而非mod_php)。修改配置文件(路径取决于发行版,如Ubuntu的/etc/apache2/mods-enabled/mpm_event.conf、CentOS的/etc/httpd/conf.d/mpm_event.conf),调整Event MPM参数(以1GB内存为例):
<IfModule mpm_event_module>
StartServers 3 # 启动时的子进程数
MinSpareThreads 25 # 最小空闲线程数
MaxSpareThreads 75 # 最大空闲线程数
ThreadLimit 64 # 线程数上限
ThreadsPerChild 25 # 每个子进程创建的线程数
MaxRequestWorkers 150 # 最大并发请求数(关键参数,需根据内存计算)
MaxConnectionsPerChild 5000 # 每个子进程处理的请求数(防内存泄漏)
</IfModule>
Event模式通过异步处理提升并发能力,内存占用较Prefork降低50%-80%。
3. 调整Apache核心配置参数
根据服务器内存计算MaxRequestWorkers(关键参数):
MaxRequestWorkers = (总内存 - 系统及其他应用占用) / 单个Apache进程平均内存(如1GB内存,系统占用200MB,单个进程平均20MB,则MaxRequestWorkers = (1024-200)/20 ≈ 41)。MaxConnectionsPerChild(如5000),避免单个进程长期运行导致内存泄漏(尤其适用于PHP应用)。KeepAlive On(启用持久连接)、KeepAliveTimeout 5(超时时间,减少TCP握手开销)、MaxKeepAliveRequests 100(每个连接最大请求数,避免单个连接占用过久)。4. 禁用不必要的Apache模块
通过apachectl -M(Ubuntu/Debian)或httpd -M(CentOS/RHEL)列出已加载模块,禁用未使用的模块(如mod_info、mod_status(若无需状态页)、mod_autoindex(若无需目录列表)、mod_negotiation(若无需内容协商))。使用a2dismod 模块名(Ubuntu/Debian)或注释配置文件中的LoadModule行(CentOS/RHEL)禁用模块,减少内存开销。
5. 启用缓存机制降低动态内容开销
mod_cache和mod_cache_disk,配置缓存目录(如/var/cache/apache2),将静态文件(HTML、CSS、JS、图片)缓存到磁盘,减少重复读取开销。示例配置:LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
CacheEnable disk / # 缓存根目录
CacheRoot /var/cache/apache2
CacheDirLevels 2 # 缓存目录层级
CacheDirLength 1 # 目录名长度
mod_expires设置静态资源过期时间(如CSS/JS/图片缓存1周),减少客户端重复请求;或通过反向代理(如Nginx)缓存动态内容,降低Apache负载。6. 优化PHP处理(若使用PHP)
mod_php(模块方式),通过mod_proxy_fcgi将PHP请求转发给PHP-FPM处理,减少Apache内存占用。配置示例(Ubuntu/Debian):<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
</FilesMatch>
php.ini中的memory_limit(如128M),避免单个PHP脚本占用过多内存;启用opcache.enable=1(OPcache),缓存编译后的PHP脚本,减少重复解析开销。7. 监控与持续优化
htop(可视化进程监控)、apachetop(Apache请求监控)、sar -r 1 5(系统内存趋势)等工具,定期检查内存使用情况。mod_status(路径如/server-status),通过ExtendedStatus On查看实时请求状态,排查慢请求或异常流量(如DDoS攻击)。systemctl restart apache2),释放内存。8. 系统级优化(辅助手段)
sync && echo 1 | sudo tee /proc/sys/vm/drop_caches(清理PageCache)、echo 3 | sudo tee /proc/sys/vm/drop_caches(清理PageCache+目录项+inodes)。/etc/sysctl.conf,降低vm.swappiness(如vm.swappiness=10,减少交换分区使用)、开启vm.overcommit_memory=2(允许内存超发,提高利用率),然后运行sudo sysctl -p生效。