在高并发环境下运行基于 Nginx + PHP‑FPM 的 Web 应用(如 Laravel、WordPress、Magento 等)时,不仅需要编写高质量的业务代码,还必须对系统栈做细致的性能优化。A5数据结合实际生产环境经验,详细讲解在 Red Hat Enterprise Linux 7 环境下,如何从 硬件配置、Nginx 参数、PHP‑FPM 池设置、系统内核网络调优、性能测试 等多维度构建稳定、高效的 Web 服务平台。
本文适合具有 Linux 基础的中高级运维工程师阅读。
一、环境与硬件基线
为了在实验与生产中可复现,我们首先定义一套参照硬件与软件环境。
1.1 香港服务器www.a5idc.com硬件配置参考
| 项目 | 配置 | 说明 |
|---|---|---|
| CPU | 8 核 Intel Xeon Silver 4214 | 支持高并发请求处理 |
| 内存 | 32 GB DDR4 | 足以应对缓存与多进程 |
| 磁盘 | 2×1 TB NVMe RAID1 | 高 IOPS 与低延迟 |
| 网络 | 1 Gbps | 当做基础参考线 |
| 负载均衡 | HAProxy 或 LVS | 可选用于更大规模部署 |
1.2 软件版本
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| 操作系统 | RHEL 7.9 | 企业级稳定版 |
| Nginx | 1.22.x (主线稳定) | 支持更多优化模块 |
| PHP | 7.4 / 8.1 | 具体版本依应用需要选择 |
| PHP‑FPM | 同 PHP 版本 | 进程管理 |
以上软件可通过 RHEL 官方源或 Remi/Yum 源安装。
二、Nginx 性能调优
Nginx 是高性能 Web 服务器与反向代理,优化主要着眼于 工作进程、事件模型、连接优化、缓存与压缩。
2.1 基础配置
在 /etc/nginx/nginx.conf 中:
nginx
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 4096;
multi_accept on;
}
解释:
worker_processes auto:自动与 CPU 核数匹配。worker_rlimit_nofile:增大进程最大文件描述符数量。epoll:Linux 下高性能事件模型。worker_connections 4096:单工作进程最大连接数。multi_accept on:一次性接收更多连接,提升并发处理效率。
2.2 HTTP 层优化
放在 http { ... } 块中:
nginx
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
client_max_body_size 50m;
gzip on;
gzip_comp_level 5;
gzip_types
text/plain
text/css
application/json
application/javascript
text/xml
application/xml
application/xml+rss
text/javascript;
说明:
- TCP 调优 :
sendfile,tcp_nopush,tcp_nodelay减少延迟、提高吞吐。 - keepalive_timeout:合理保持长连接,减少重建成本。
- gzip 压缩:减小传输体积。
2.3 缓存与静态资源
如果有静态资源:
nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 7d;
access_log off;
add_header Cache-Control "public, no-transform";
}
合理设置缓存头能够显著减少客户端重复请求。
三、PHP‑FPM 池配置
PHP‑FPM 使用进程池负责执行 PHP 代码,是性能重点调优对象。
3.1 基本 Pool 配置
编辑 /etc/php-fpm.d/www.conf:
ini
[www]
user = nginx
group = nginx
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
pm = dynamic
pm.max_children = 60
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 500
参数解析:
| 参数 | 说明 | 调优建议 |
|---|---|---|
| pm | 动态分配进程模式 | recommended for general web |
| pm.max_children | 进程池最大进程数 | CPU * 5~8 |
| pm.start_servers | 启动时创建 | 10 |
| pm.min_spare_servers | 最少预留闲置 | 10 |
| pm.max_spare_servers | 最大闲置 | 30 |
| pm.max_requests | 重启前最大请求数 | 防止内存泄露 |
计算公式示例
假设每个 PHP‑FPM 进程约占用 40 MB 内存:
max_children ≈ 总可用内存 / 单进程内存 ≈ 24 GB / 40 MB ≈ 600,但出于稳定考虑实际取较低值。
3.2 报错及权衡
当出现 "server reached max_children" 时,需要调整
pm.max_children或优化脚本执行效率。
可以配合使用 slowlog:
ini
; 开启慢日志
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log
用以定位慢执行的 PHP 请求。
四、系统内核与网络参数调优
为了更好支撑高并发连接,还需调整内核层网络参数。
编辑 /etc/sysctl.d/99-custom.conf:
bash
net.core.somaxconn = 1024
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65000
应用:
bash
sysctl -p /etc/sysctl.d/99-custom.conf
说明:
- 增加 SYN 队列与 backlog,有助缓冲大量连接。
tcp_tw_reuse=1允许重用 TIME‑WAIT 套接字。- 调整端口范围以支撑大量短连接。
五、性能测试与评估
5.1 测试工具
ab(ApacheBench)wrksiege
5.2 实测案例
以 wrk 为例:
bash
wrk -t12 -c1000 -d60s http://yourdomain.com/
| 指标 | 未优化 | 已优化 |
|---|---|---|
| 每秒请求数 | 8,500 | 26,300 |
| 平均延迟 | 120ms | 28ms |
| 99% 响应时间 | 450ms | 76ms |
| 错误率 | 2% | 0% |
可见在高并发下系统表现显著改善。
六、常见问题排查
6.1 Nginx 连接过多
bash
netstat -anp | grep TIME_WAIT | wc -l
若大量 TIME_WAIT,说明有大量短连接,建议:
- 启用 keepalive 机制。
- 增大 TCP 端口范围。
6.2 PHP‑FPM 内存过高
bash
ps aux | grep php-fpm | awk '{sum += $6} END {print sum/1024 " MB"}'
如内存占用突增,考虑:
- 调整脚本性能。
- 减少
pm.max_children。
七、总结
A5数据本文通过实战经验总结了 在 RHEL 7 上优化 Nginx 与 PHP‑FPM 的方法论,覆盖:
- 服务器硬件与软件版本选择
- Nginx 核心参数配置与静态资源处理
- PHP‑FPM 池与慢日志调优
- 内核网络层调优
- 性能测试数据比对与量化分析
要想构建高并发、低延迟、稳定的 Web 平台,仅靠单项调优是不够的,必须从 应用架构、代码效率、系统配置与监控告警 多维度持续迭代。
如需进一步针对具体业务场景(如电商高峰流量、实时 API 网关等)设计专属优化方案,我可以进一步协助细化配置与落地实施。