温馨提示×

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 = 65535net.core.netdev_max_backlog = 30000
    • net.ipv4.tcp_max_syn_backlog = 4096net.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_deflatetext/html text/css application/javascript 等压缩传输。
    • 缓存:启用 mod_cache/mod_disk_cachemod_expires 设置强缓存策略(如 CSS/JS 30 天、图片 1 年)。
  • KeepAlive 持久连接(按业务类型微调):
    • 静态资源为主:KeepAlive OnMaxKeepAliveRequests 100KeepAliveTimeout 2–5 秒。
    • 动态为主或长轮询/长连接场景:可关闭或缩短超时,避免连接占用过久。
  • 并发与进程/线程(示例为需调优的起点,务必结合压测与内存计算):
    • prefork(示例):
      • StartServers 5MinSpareServers 5MaxSpareServers 10
      • MaxRequestWorkers 150(需确保 MaxRequestWorkers × 单进程内存 < 可用内存
      • MaxConnectionsPerChild 0(或 1000–10000 用于回收潜在泄漏)
    • event/worker(示例):
      • StartServers 2–4MinSpareThreads 25MaxSpareThreads 75
      • ThreadsPerChild 25–50MaxRequestWorkers 400–800
      • MaxConnectionsPerChild 1000–10000
  • 日志与模块:
    • 减少日志开销:将 LogLevel 调为 warn,必要时采用异步/缓冲日志或拆分访问/错误日志。
    • 精简模块:禁用不需要的模块(如 autoindex、status 等)以降低内存与攻击面。

四 监控 压测 与扩展

  • 监控与告警:
    • 资源与连接:top/vmstat/sarss -snetstat -ant | grep :80 | wc -lcat /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_recycletcp_tw_reuse 更通用。
    • 持续监控与迭代,结合业务峰值与增长趋势调整阈值与容量。

0