优化Apache在Ubuntu上的内存使用需从配置调整、模块管理、进程模型、缓存机制等多方面入手,以下是具体方法:
top或htop查看,如RES列),计算合理值。公式参考:MaxRequestWorkers = (总内存 - 系统预留内存) / 单个进程内存占用。例如,服务器有8GB内存,单个进程占用50MB,则可设置为MaxRequestWorkers 120(需预留内存给系统和其他服务)。KeepAlive On以减少TCP连接建立/关闭的开销,但需合理设置MaxKeepAliveRequests(如50-100,避免单个连接占用过多请求)和KeepAliveTimeout(如2-5秒,超时后关闭闲置连接),防止进程长期占用内存。Apache默认加载大量模块(如mod_ssl、mod_php),但并非所有模块都需要。通过a2dismod命令禁用不需要的模块(如sudo a2dismod ssl禁用SSL,若无需HTTPS;sudo a2dismod php7.x若使用PHP-FPM替代mod_php),然后重启Apache(sudo systemctl restart apache2)。仅保留核心模块(如mod_authz_host、mod_log_config、mod_expires)和业务必需模块,可显著减少内存占用。
Apache的MPM(Multi-Processing Module)决定进程/线程模型,不同MPM的内存占用差异大:
sudo a2dismod mpm_prefork && sudo a2enmod mpm_event切换至Event MPM,然后修改/etc/apache2/mods-enabled/mpm_event.conf中的参数(如StartServers 2、MinSpareThreads 25、MaxSpareThreads 75),优化线程池配置。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模块为静态资源设置过期时间(如图片缓存1个月),减少客户端重复请求。示例:<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
</IfModule>
vm.swappiness控制系统使用交换分区的倾向(默认60),设置为10-30可减少内存不足时对交换分区的依赖(交换分区速度慢,会拖慢性能)。编辑/etc/sysctl.conf,添加vm.swappiness=10,然后执行sudo sysctl -p生效。vm.overcommit_memory设置为2(禁止内存超发),避免系统过度分配内存导致OOM(Out of Memory)。添加vm.overcommit_memory=2到/etc/sysctl.conf并生效。transparent_hugepage=never到GRUB配置(/etc/default/grub的GRUB_CMDLINE_LINUX行),然后更新GRUB(sudo update-grub)并重启。sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
(sync将缓存数据写入磁盘,echo 3清理PageCache、dentries和inodes)。top(按M键按内存排序)、htop(更直观)或apache2ctl status(查看Apache进程状态)监控内存占用,重点关注RES(常驻内存)列。cron任务自动化:0 3 * * 0 sudo systemctl restart apache2
/var/log/apache2/error.log和access.log,查找异常请求(如大量404、500错误)或恶意流量(如高频请求),针对性优化或屏蔽。通过以上方法综合调整,可有效降低Apache在Ubuntu上的内存使用,提升服务器性能和稳定性。优化过程中需在测试环境验证配置,避免直接影响生产环境。