CentOS 上 Apache2 性能优化实战指南
一 基线评估与监控
- 明确瓶颈:用 ab/wrk/siege 做基线压测,配合 top/vmstat/iostat/sar 观察 CPU、内存、I/O、网络 与 连接队列,定位是计算密集、I/O 等待还是连接瓶颈。
- 监控连接状态:用 ss -s 或 netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ 查看 TIME_WAIT/CLOSE_WAIT/ESTABLISHED 分布,指导内核与 KeepAlive 策略。
- 日志与采样:临时开启 mod_status ExtendedStatus,观察 BusyWorkers/IdleWorkers;必要时降低日志级别或异步写入,减少同步 I/O 压力。
二 系统层面优化
- 文件描述符与进程数
- 提升系统上限:在 /etc/sysctl.conf 设置 fs.file-max=6815744;在 /etc/security/limits.conf 设置用户级 nofile 65535 与 nproc 65535,并确认 systemd 服务段包含 LimitNOFILE=65535,随后执行 sysctl -p 生效。
- TCP/IP 栈与端口
- 典型优化(按负载与内核版本谨慎调整):
- net.core.somaxconn=65535
- net.ipv4.tcp_max_syn_backlog=8192
- net.ipv4.tcp_fin_timeout=30
- net.ipv4.tcp_keepalive_time=1200
- net.ipv4.ip_local_port_range=10000 65000
- net.ipv4.tcp_max_tw_buckets=5000
- net.ipv4.tcp_syncookies=1
- 注意:在 NAT/负载均衡 或较新内核上,避免使用已废弃的 tcp_tw_recycle,优先使用 tcp_tw_reuse 并结合业务 RTT 调整 tcp_keepalive_time。
- 虚拟内存与 I/O
- vm.swappiness=10(减少换页,偏向物理内存利用)
- vm.dirty_ratio=40,vm.dirty_background_ratio=10(平滑刷脏,降低抖动)
- 文件系统:选择 ext4/XFS,挂载使用 noatime,nodiratime 减少元数据写入。
- SELinux 与防火墙
- 不建议直接关闭 SELinux;使用 semanage/audit2allow 做最小权限放行。
- 仅开放必要端口(如 80/443),用 firewalld/iptables 精准放行,减少无效连接与扫描。
三 Apache MPM 选择与关键参数
- 选择 MPM
- prefork:基于进程,适合 PHP-FPM/mod_php 或需线程安全的场景,稳健但内存占用高。
- worker/event:基于线程/事件,适合高并发静态资源或反向代理,内存更省、并发更高(需模块与代码线程安全)。
- 典型配置示例(需结合内存与压测微调)
- prefork(示例为 4GB 内存、2 核场景的起点值)
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 128
MaxRequestWorkers 128
MaxConnectionsPerChild 1000
</IfModule>
- event(示例起点)
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
ServerLimit 16
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
- 并发上限估算思路
- 单进程/线程常驻内存 ≈ 应用栈 + 模块开销(例如 10–20MB 量级,视模块而定)。
- 粗略上限:MaxRequestWorkers ≤ 可用内存 / 单进程内存;同时受 ulimit -n 与 somaxconn 约束。
- 连接与长连接
四 模块与内容交付优化
- 压缩与缓存
- 启用压缩(减少传输体积):
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
</IfModule>
- 设置浏览器缓存(降低重复请求):
<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 image/gif "access plus 1 year"
ExpiresByType application/javascript "access plus 30 days"
</IfModule>
- 协议与加速
- 静态资源与 CDN
- 将图片、视频、归档与静态文件交由 CDN 分发,源站只提供动态接口与签名 URL,显著降低跨域与长距离传输时延。
- 日志优化
- 生产环境可异步写日志、降低同步级别,或按时间/大小切分并压缩归档,减少 I/O 抖动与磁盘占满风险。
五 安全加固与上线流程
- 安全与最小化
- 仅启用必要模块,禁用 autoindex/dav 等高风险模块;隐藏版本信息(如 ServerTokens Prod)。
- 使用 TLS 1.2+,优先 ECDHE 套件与 HSTS,证书链完整;必要时开启 OCSP Stapling 降低握手延迟。
- 变更与回滚
- 任何配置变更前备份;遵循“灰度/蓝绿/金丝雀”发布;变更后在相同压测场景下复核 吞吐、P95/P99 延迟、错误率 与资源占用。
- 持续监控与迭代
- 建立 基线指标 与 告警阈值(如 5xx 比例、连接队列溢出、磁盘 I/O 饱和),结合 日志分析 与 性能剖析 持续迭代参数。
以上步骤按“系统→MPM→模块→内容→安全→上线”的顺序实施,配合压测与监控闭环调优,可在 CentOS 上显著提升 Apache2 的吞吐、降低延迟并增强稳定性。