Linux Apache如何优化性能
小樊
44
2025-12-16 20:20:44
Linux Apache性能优化实战指南
一 操作系统与内核优化
- 保持系统与内核、Apache版本为最新稳定版,及时获取性能修复与安全补丁。
- 提升文件描述符上限:编辑 /etc/security/limits.conf 增加如
* soft nofile 65535、* hard nofile 65535,并在 systemd 服务单元中设置 LimitNOFILE=65535,避免“Too many open files”。
- 优化网络栈与连接参数(/etc/sysctl.conf):
net.core.somaxconn = 65535、net.core.netdev_max_backlog = 30000
net.ipv4.tcp_max_syn_backlog = 4096、net.ipv4.tcp_syncookies = 1
- 在高并发短连接场景可开启
net.ipv4.tcp_tw_reuse = 1;谨慎使用 net.ipv4.tcp_tw_recycle(在 NAT/负载均衡环境可能有害);net.ipv4.tcp_fin_timeout = 30
- 启用
net.ipv4.tcp_fastopen = 3 加速握手(需客户端支持)。
- 文件系统与I/O:优先使用 SSD;挂载选项加 noatime 减少元数据写入;选择 EXT4/XFS 等成熟文件系统。
- 内存与交换:合理设置
vm.swappiness(如 10–30),避免频繁换页;监控并规划交换分区大小。
- 基础加固与维护:仅启用必要服务与端口,定期更新与巡检。
二 Apache MPM选择与切换
- 三种常用 MPM:
- prefork:多进程、非线程,适合 mod_php 等非线程安全模块;并发受内存限制。
- worker:多进程多线程,内存占用更低、并发更高。
- event:基于 worker,针对 KeepAlive/长连接 更高效,是 Apache 2.4 的常用默认。
- 查看与切换:
- 查看:
httpd -V | grep MPM(RHEL/CentOS),apache2 -V | grep MPM(Debian/Ubuntu)。
- 切换:在 /etc/httpd/conf.modules.d/00-mpm.conf(RHEL/CentOS)或 /etc/apache2/mods-available/mpm_*.load(Debian/Ubuntu)启用目标模块并重启。
- 与 PHP 的搭配:
- 使用 event/worker 时,PHP 应通过 PHP-FPM(FastCGI) 运行;若必须用 mod_php,请选择 prefork。
- 重启示例:
- RHEL/CentOS:
systemctl restart httpd php-fpm
- Debian/Ubuntu:
systemctl restart apache2 php-fpm
- 提示:不同虚拟主机不能混用不同 MPM。
三 关键配置参数建议
- 启用压缩与缓存:
- 压缩:启用 mod_deflate 对
text/html text/css application/javascript 等压缩传输。
- 缓存:启用 mod_cache/mod_disk_cache 或 mod_expires 设置强缓存策略(如 CSS/JS 30 天、图片 1 年)。
- KeepAlive 持久连接(按业务类型微调):
- 静态资源为主:
KeepAlive On,MaxKeepAliveRequests 100,KeepAliveTimeout 2–5 秒。
- 动态为主或长轮询/长连接场景:可关闭或缩短超时,避免连接占用过久。
- 并发与进程/线程(示例为需调优的起点,务必结合压测与内存计算):
- prefork(示例):
StartServers 5、MinSpareServers 5、MaxSpareServers 10
MaxRequestWorkers 150(需确保 MaxRequestWorkers × 单进程内存 < 可用内存)
MaxConnectionsPerChild 0(或 1000–10000 用于回收潜在泄漏)
- event/worker(示例):
StartServers 2–4、MinSpareThreads 25、MaxSpareThreads 75
ThreadsPerChild 25–50、MaxRequestWorkers 400–800
MaxConnectionsPerChild 1000–10000
- 日志与模块:
- 减少日志开销:将
LogLevel 调为 warn,必要时采用异步/缓冲日志或拆分访问/错误日志。
- 精简模块:禁用不需要的模块(如 autoindex、status 等)以降低内存与攻击面。
四 监控 压测 与扩展
- 监控与告警:
- 资源与连接:
top/vmstat/sar、ss -s、netstat -ant | grep :80 | wc -l、cat /proc/loadavg
- 可视化:使用 Prometheus + Grafana 采集 Apache(如 mod_status)、系统与应用指标,设置阈值告警。
- 日志分析:集中化日志(如 ELK)与慢请求分析,定位瓶颈与异常。
- 压测与容量规划:以真实流量模型进行压测(如 ab/wrk/自定义脚本),逐步调整 MPM 与 KeepAlive 等参数,观察 P95/P99 延迟、吞吐、错误率与内存占用。
- 扩展架构:
- 水平扩展:前置 Nginx/HAProxy 做反向代理与负载均衡,多台 Apache/PHP-FPM 实例分摊流量。
- 缓存与CDN:对静态资源启用 CDN;动态层引入 Redis/Memcached 降低数据库压力。
- 存储与高可用:使用 SSD、合理 RAID;数据库与应用层配置主从/集群与故障转移。
五 快速检查清单与注意事项
- 快速检查清单:
- 已升级到最新稳定版 Apache 与系统内核。
- 文件描述符与内核网络参数已按并发目标调高。
- 选择了合适的 MPM,PHP 以 PHP-FPM 运行(若非 prefork)。
- 已启用 压缩、缓存、KeepAlive(按业务类型调参)。
- 并发参数与内存匹配,且设置了进程/线程回收策略。
- 精简模块、优化日志、接入监控与告警、完成压测与容量评估。
- 注意事项:
- 任何重大变更先在测试环境验证,再灰度/滚动发布。
- 修改 MPM 或核心参数后重启服务使其生效。
- 在 NAT/负载均衡 环境谨慎启用
tcp_tw_recycle;tcp_tw_reuse 更通用。
- 持续监控与迭代,结合业务峰值与增长趋势调整阈值与容量。