提升 Linux 上 PHP-FPM 并发量的实用方案
一 进程管理与池配置
- 选择进程管理模式:稳定高负载优先用 static(减少创建/销毁开销);流量波动用 dynamic(按需伸缩);极低流量可用 ondemand(按需启停,节省内存)。在 pool 配置中设置 pm = static|dynamic|ondemand。
- 计算并发上限:核心依据是内存与单进程内存占用。公式:pm.max_children ≤ 可用内存 / 单进程平均内存,并建议预留 20%–30% 给系统与其他服务。示例:可用 4GB、单进程 64MB,则 max_children 约 64。
- dynamic 模式常用参数建议:
- pm.start_servers:设为 CPU 核心数 × 2(如 4 核 → 8)以快速承接启动流量;
- pm.min_spare_servers / pm.max_spare_servers:维持突发流量的空闲缓冲,常见区间 5–10 起步,视负载上调;
- pm.max_requests:进程处理一定请求后重启,抑制内存泄漏,建议 500–1000。
- 示例配置片段(dynamic):
- pm = dynamic
- pm.max_children = 50
- pm.start_servers = 8
- pm.min_spare_servers = 5
- pm.max_spare_servers = 20
- pm.max_requests = 500
- 可按业务拆分多个 pool(不同应用/租户/权重),实现资源隔离与差异化调优。
二 监听队列与网络内核参数
- 增大监听队列:在 pool 配置中提升 listen.backlog(如 511 或 -1 使用系统默认最大值),让突发连接能在队列中暂候,避免立即拒绝。
- 提升系统队列与端口范围:编辑 /etc/sysctl.conf,示例:
- net.core.somaxconn = 65535
- net.ipv4.tcp_max_syn_backlog = 65535
- net.ipv4.ip_local_port_range = 1024 65535
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_fin_timeout = 30
执行 sysctl -p 使生效。
- 文件描述符限制:提升进程可打开文件数,避免 “Too many open files”。临时:ulimit -n 65535;永久:在 /etc/security/limits.conf 增加
- 说明:队列只是“缓冲”,真正提升并发仍依赖 max_children 与后端处理能力(如数据库、缓存)。
三 Web 服务器与 FPM 协同
- 使用 Unix Domain Socket 通常较 TCP 开销更低:
- listen = /run/php/php8.1-fpm.sock(权限与属主需与 Web 服务一致,如 www-data)。
- 在 Nginx 中匹配 PHP 处理并合理设置超时:
- fastcgi_pass unix:/run/php/php8.1-fpm.sock;
- fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout 结合业务 RTT 与脚本时长设置,避免过早超时造成 504。
- 启用 HTTP/2 与 Gzip(Nginx 层)可降低连接开销与传输体积,提升整体吞吐。
四 运行时监控与持续优化
- 暴露并观察 PHP-FPM 状态页:
- 在 pool 配置启用:pm.status_path = /status;
- 在 Nginx 配置 location /fpm-status(仅内网访问),访问查看 active processes、idle processes、queue 等关键指标;若 active 长期接近 max_children,需上调上限或优化应用。
- 启用 慢日志 定位瓶颈:
- slowlog = /var/log/php-fpm/slow.log
- request_slowlog_timeout = 5s(记录执行超过 5 秒的请求栈)。
- 启用 OPcache 减少脚本编译开销(php.ini):
- [opcache]
- opcache.enable=1
- opcache.memory_consumption=128(MB)
- opcache.interned_strings_buffer=8
- opcache.max_accelerated_files=10000
- opcache.revalidate_freq=60
- 压测与迭代:使用 ab/wrk/ghz 等工具在预发环境压测,观察 CPU、内存、队列、响应时延、错误率,按结果微调 max_children、spare、backlog、超时 等参数。
五 数据库与缓存侧优化
- 数据库通常是瓶颈:为高频查询加索引、优化慢 SQL、减少 N+1、合理使用分页与缓存。
- 使用 Redis/Memcached 做页面/数据缓存,降低数据库压力。
- 考虑数据库连接复用/连接池(如 PDO 持久连接 或专用连接池方案),减少频繁建连开销。