优化Apache在Ubuntu上的内存使用需从配置调整、模块管理、MPM优化、缓存机制等多方面入手,以下是具体方法:
top或htop查看RES列),计算合理值(如总内存×0.7÷单个进程内存),避免过多并发导致内存耗尽。KeepAlive On减少TCP连接开销,但设置KeepAliveTimeout 5(默认15秒)缩短空闲连接保持时间,避免资源长期占用。MaxRequestsPerChild 5000),防止内存泄漏累积。MinSpareServers 5、MaxSpareServers 10),避免频繁创建/销毁进程的开销。apachectl -M查看已加载模块,禁用未使用的模块(如mod_ssl(若无需HTTPS)、mod_frontpage等),使用a2dismod 模块名命令(如sudo a2dismod status),减少内存占用。prefork(多进程,内存占用高)或worker(多线程),而event(事件驱动)更适合高并发场景,内存消耗更低。修改/etc/apache2/mods-enabled/mpm_*.conf(如sudo a2dismod mpm_prefork && sudo a2enmod mpm_event),并调整以下参数:<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 10000
</IfModule>
注:
MaxRequestWorkers需根据内存重新计算,避免超过系统承载能力。
mod_cache和mod_disk_cache缓存图片、CSS、JS等静态资源,减少硬盘I/O和重复处理。在配置文件中添加:<IfModule mod_cache.c>
CacheQuickHandler off
CacheLock on
CacheLockPath /tmp/mod_cache-lock
CacheLockMaxAge 5
CacheIgnoreHeaders Set-Cookie
<IfModule mod_disk_cache.c>
CacheRoot /var/cache/apache2/mod_disk_cache
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
</IfModule>
</IfModule>
mod_deflate压缩HTML、CSS、JS等文本数据,减少网络传输量和内存占用。添加:<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json
</IfModule>
mod_expires让浏览器缓存静态资源,减少重复请求。添加:<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>
/etc/sysctl.conf优化内存管理:vm.swappiness=10 # 降低交换空间使用倾向(默认60,越低越优先用物理内存)
vm.overcommit_memory=2 # 允许内存超发(避免Apache因内存分配失败崩溃)
vm.dirty_ratio=10 # 控制脏页写入磁盘的阈值(减少I/O压力)
运行sudo sysctl -p使配置生效。sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
top(按M按内存排序)、htop(更直观)或apachetop(专门监控Apache)查看进程内存占用,定位异常进程。sudo systemctl restart apache2),释放累积的内存碎片和泄漏。/var/log/apache2/)和系统临时文件(/tmp/),避免占用过多内存:sudo journalctl --vacuum-time=7d # 清理7天前的日志
sudo apt-get clean # 清理apt缓存
sudo apt-get autoremove # 删除无用依赖
以上方法需根据服务器实际负载(如并发量、静态/动态内容比例)和硬件配置(内存大小、磁盘类型)调整,建议先在测试环境验证效果,再应用到生产环境。