在 CentOS 上优化 Apache 性能需要从配置调整、资源分配、缓存策略等多方面入手,以下是关键优化方向和具体操作:
Apache 的性能很大程度上取决于 httpd.conf
(主配置)和 mpm.conf
(多处理模块)的参数设置,需根据服务器硬件(CPU、内存)调整。
Apache 有三种 MPM 模式,需根据服务器类型选择:
- prefork:适合单核 / 低内存服务器,进程独立(内存占用高,稳定性好)
- worker:适合多核服务器,混合进程 + 线程(内存占用低,并发高)
- event:worker 的改进版,处理长连接更高效(推荐现代服务器)
查看当前 MPM:
切换 MPM(以 event 为例):
sudo vi /etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_event_module modules/mod_mpm_event.so
根据服务器内存和 CPU 核心数调整(以 event 为例,编辑 /etc/httpd/conf.modules.d/00-mpm.conf
):
<IfModule mpm_event_module>
StartServers 4 # 启动时的子进程数
MinSpareThreads 25 # 最小空闲线程数
MaxSpareThreads 75 # 最大空闲线程数
ThreadLimit 64 # 每个子进程的最大线程限制
ThreadsPerChild 25 # 每个子进程的固定线程数
MaxRequestWorkers 150 # 最大并发连接数(= 子进程数 × 线程数)
MaxConnectionsPerChild 0 # 每个子进程处理的最大请求数(0 表示无限制)
</IfModule>
参数计算参考:
- 假设服务器有 4GB 内存,
MaxRequestWorkers
建议不超过 200(每个连接约占用 10-20MB 内存)
- 若为 prefork 模式,将
MaxRequestWorkers
设为内存(MB)/ 20(如 4GB 内存 → 200)
减少数据传输量和重复请求,提升响应速度。
sudo vi /etc/httpd/conf.modules.d/00-base.conf
LoadModule deflate_module modules/mod_deflate.so
sudo vi /etc/httpd/conf.d/compression.conf
添加内容:
<IfModule mod_deflate.c>
# 压缩类型(HTML、CSS、JS 等)
AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/javascript application/json
# 压缩级别(1-9,建议 5,平衡性能和压缩率)
DeflateCompressionLevel 5
# 不压缩小文件(小于 1KB 可能反而变大)
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>
sudo vi /etc/httpd/conf.modules.d/00-base.conf
LoadModule expires_module modules/mod_expires.so
sudo vi /etc/httpd/conf.d/cache.conf
添加内容:
<IfModule mod_expires.c>
ExpiresActive On
# 图片缓存 30 天
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/gif "access plus 30 days"
# CSS/JS 缓存 7 天
ExpiresByType text/css "access plus 7 days"
ExpiresByType text/javascript "access plus 7 days"
ExpiresByType application/javascript "access plus 7 days"
# HTML 不缓存(或短时间缓存)
ExpiresByType text/html "access plus 10 minutes"
</IfModule>
长连接(KeepAlive)减少握手开销,但过多会占用资源:
# 在 httpd.conf 中修改
KeepAlive On # 启用长连接
MaxKeepAliveRequests 100 # 每个长连接最多处理 100 个请求
KeepAliveTimeout 5 # 连接超时时间(秒,建议 2-5)
使用 mod_ratelimit
限制单个 IP 的请求频率:
LoadModule ratelimit_module modules/mod_ratelimit.so
<Location "/">
SetOutputFilter RATE_LIMIT
RateLimitRequestBody 102400
RateLimitConnection 100
</Location>
Apache 处理大量连接需要足够的文件描述符:
ulimit -n 65535
sudo vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
添加以下内容(提升网络并发能力):
net.core.somaxconn = 1024 # 最大监听队列长度
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_fin_timeout = 15 # 减少 TIME_WAIT 状态时间
net.ipv4.tcp_tw_reuse = 1 # 复用 TIME_WAIT 连接
net.ipv4.tcp_max_tw_buckets = 5000
生效配置:
-
禁用不必要的模块
减少内存占用,编辑 /etc/httpd/conf.modules.d/
下的文件,注释不需要的模块(如 mod_dav
、mod_userdir
等)。
-
启用 FastCGI 或 PHP-FPM(针对 PHP 网站)
替代传统的 mod_php
,减少 Apache 进程阻塞:
-
使用缓存工具(如 Varnish 或 Redis)
对静态资源或动态内容进行缓存,减轻 Apache 压力。
-
定期清理日志
避免日志文件过大占用磁盘 I/O:
cat /etc/logrotate.d/httpd
- 查看并发连接:
netstat -an | grep :80 | wc -l
- 压力测试工具:使用
ab
(Apache Bench)或 wrk
测试性能:
sudo yum install httpd-tools
ab -c 100 -n 1000 http://你的域名/
优化核心思路:匹配服务器硬件资源(调整 MPM 参数)→ 减少数据传输(压缩)→ 减少重复请求(缓存)→ 提升系统网络能力。需根据实际业务场景(静态 / 动态内容比例、并发量)逐步调整,并通过压力测试验证效果。