Apache在CentOS上的性能瓶颈破解方法
MPM是Apache处理并发的核心组件,CentOS默认使用prefork(适合兼容性但内存消耗高),可根据负载切换为event(高性能,支持高并发)。需修改/etc/httpd/conf.modules.d/00-mpm.conf(CentOS 7+),例如:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 256 # 根据服务器内存调整(每进程约消耗5-10MB)
MaxConnectionsPerChild 1000 # 防止内存泄漏
</IfModule>
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
修改后需重启Apache(systemctl restart httpd)使配置生效。
KeepAlive可减少TCP连接建立/关闭的开销,但设置不当会导致连接占用过多。在httpd.conf中调整:
KeepAlive On
MaxKeepAliveRequests 100 # 单个连接最大请求数(避免单个连接占用过久)
KeepAliveTimeout 5 # 连接保持时间(秒,建议5-10秒)
平衡连接复用与资源占用,高并发场景下可适当降低KeepAliveTimeout。
静态文件(CSS、JS、图片)的频繁读取会增加磁盘I/O。使用mod_expires模块设置缓存策略,在httpd.conf中添加:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 30 days"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType application/javascript "access plus 30 days"
</IfModule>
减少客户端对服务器的重复请求,提升响应速度。
使用mod_deflate模块压缩文本类内容(HTML、CSS、JS),减小传输数据量。在httpd.conf中添加:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
</IfModule>
注意:避免压缩图片(已压缩格式),防止CPU消耗过大。
加载过多模块会增加内存消耗。通过httpd -M命令查看已加载模块,注释掉不需要的模块(如mod_php(若用PHP-FPM替代)、mod_authz_core(若不需要细粒度权限)),例如:
# LoadModule authz_core_module modules/mod_authz_core.so
# LoadModule authz_host_module modules/mod_authz_host.so
减少不必要的资源占用。
优化内核参数提升网络与文件系统性能,编辑/etc/sysctl.conf:
net.core.somaxconn = 65535 # 监听队列最大长度
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列最大长度
net.ipv4.tcp_tw_reuse = 1 # 复用TIME_WAIT连接
net.ipv4.tcp_fin_timeout = 30 # TIME_WAIT超时时间(秒)
net.core.rmem_max = 16777216 # 接收缓冲区最大值
net.core.wmem_max = 16777216 # 发送缓冲区最大值
执行sysctl -p使配置生效。
高并发下,默认文件描述符限制(通常1024)会导致连接失败。修改/etc/security/limits.conf:
* soft nofile 65535
* hard nofile 65535
同时编辑/etc/systemd/system/httpd.service.d/override.conf(若使用systemd):
[Service]
LimitNOFILE=65535
重启Apache使配置生效。
通过mod_cache和mod_cache_disk模块缓存动态/静态内容,减少后端请求。在httpd.conf中添加:
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheRoot "/var/cache/apache2/mod_cache_disk"
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
</IfModule>
</IfModule>
缓存静态资源或动态页面(如PHP输出),提升响应速度。
top(查看CPU/内存)、htop(更直观)、vmstat 1(查看I/O、进程状态)、netstat -antp(查看网络连接)等工具定位瓶颈。LogLevel warn,减少详细日志)、使用cronolog进行日志轮询(避免单个日志文件过大),例如:CustomLog "|/usr/sbin/cronolog /var/log/httpd/access_%Y%m%d.log" combined
减少日志对磁盘I/O和性能的影响。若单台服务器无法满足需求,可使用mod_proxy和mod_proxy_balancer模块配置负载均衡,将请求分发到多台Apache服务器。示例配置:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.101:80
BalancerMember http://192.168.1.102:80
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
提升整体并发处理能力。