在 CentOS 上优化 Apache(httpd),可以从系统层面、Apache 配置、模块、缓存、安全与监控几个方面来做。下面是一套比较实用、偏生产环境的优化思路(以 CentOS 7/8 + Apache 2.4 为例)。
getenforce
# 如果是 Enforcing,生产环境建议保持,但需正确配置策略
# 调试时可临时关闭
setenforce 0
ulimit -n
修改 /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
编辑 /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
sysctl -p
Apache 2.4 常见 MPM:
查看当前 MPM:
httpd -V | grep MPM
yum install mod_http2 php-fpm
/etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_event_module modules/mod_mpm_event.so
/etc/httpd/conf.d/mpm.conf
<IfModule mpm_event_module>
StartServers 4
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
</IfModule>
MaxRequestWorkers 一般 ≈ 内存 / 每进程内存
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
systemctl enable php-fpm
systemctl start php-fpm
Apache 配置:
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
/etc/php-fpm.d/www.conf
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
LoadModule deflate_module modules/mod_deflate.so
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 30 days"
ExpiresByType text/css "access plus 7 days"
ExpiresByType application/javascript "access plus 7 days"
</IfModule>
httpd -M
注释掉不需要的 LoadModule
ServerTokens Prod
ServerSignature Off
CustomLog logs/access_log combined env=!dontlog
mod_status<Location /server-status>
SetHandler server-status
Require ip 127.0.0.1
</Location>
yum install httpd-tools
ab -n 10000 -c 500 http://localhost/
| 问题 | 解决 |
|---|---|
| CPU 高 | 换 event + PHP-FPM |
| 内存爆 | 降低 MaxRequestWorkers |
| 并发上不去 | 调整内核 + MPM |
| 响应慢 | 开缓存 + 压缩 |
如果你愿意,可以告诉我:
我可以给你一套针对性配置模板。