在 CentOS 上,一般使用的是 Apache HTTP Server(httpd),而不是 Debian/Ubuntu 中的 apache2 包名。下面从 系统层面 + Apache 配置层面 给你一套实用的优化方案。
httpd -v
# 或
apachectl -v
CentOS 常见版本:
event MPM(高并发)httpd -M | grep mpm
如果不是 event:
vim /etc/httpd/conf.modules.d/00-mpm.conf
改为:
LoadModule mpm_event_module modules/mod_mpm_event.so
⚠️
event不支持mod_php,PHP 要用 PHP-FPM
/etc/httpd/conf.d/mpm.conf)<IfModule mpm_event_module>
ServerLimit 16
StartServers 4
MinSpareThreads 64
MaxSpareThreads 128
ThreadsPerChild 64
MaxRequestWorkers 1024
MaxConnectionsPerChild 10000
</IfModule>
说明
MaxRequestWorkers ≈ 并发连接数ThreadsPerChild × ServerLimit = MaxRequestWorkersMaxConnectionsPerChild 防止内存泄漏KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
太大 → 占用连接
太小 → 频繁握手
httpd -M
常见可禁用:
# 注释掉
# LoadModule status_module
# LoadModule autoindex_module
# LoadModule userdir_module
LoadModule deflate_module modules/mod_deflate.so
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript
</IfModule>
LoadModule expires_module modules/mod_expires.so
<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>
yum install php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
ulimit -n 65535
/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
CustomLog logs/access_log combined env=!dontlog
SetEnvIf Request_URI "\.(css|js|png)$" dontlog
或关闭详细日志(测试环境)
apachectl configtest
top
htop
ss -ant | wc -l
ab -n 1000 -c 100 http://localhost/
✅ CentOS + Apache(event)
✅ PHP-FPM
✅ deflate + expires
✅ 关闭无用模块
✅ 系统参数调优
如果你愿意,可以告诉我:
我可以给你 定制化优化配置。