PHP Web 服务通常由多个组件协作完成。Nginx 接收 HTTP 请求,PHP-FPM 管理 PHP Worker,双方通过 FastCGI 交换请求信息;OPcache 缓存编译后的字节码,减少重复解析与编译。

组件分别负责什么

组件 职责
Nginx 监听 HTTP/HTTPS、静态文件、TLS、反向代理
FastCGI Web 服务器与应用进程交换请求数据的协议
PHP-FPM PHP 的 FastCGI 进程管理器
FPM Master 读取配置、创建监听 Socket、管理 Worker
FPM Worker 一次处理一个 PHP 请求并执行脚本
OPcache 在进程共享内存中缓存 PHP 字节码

FastCGI 是协议,PHP-FPM 是实现这个协议并管理进程的软件,两者不是同一层概念。

启动阶段

1
2
3
4
5
启动 php-fpm
-> Master 读取 php-fpm.conf 与 pool 配置
-> 创建 Unix Socket 或监听 TCP 端口
-> 按进程管理模式准备 Worker
-> Worker 等待 FastCGI 请求

Nginx 不读取 FPM 的 www.conf。它只需要在站点配置中知道 FPM 监听地址,例如 Unix Socket 或 127.0.0.1:9000。

请求阶段

1
2
3
4
5
浏览器 -> Nginx -> FastCGI -> FPM Worker -> PHP 入口文件
-> 框架路由
-> 业务逻辑
-> 数据库/缓存
<- HTTP 响应 <- FastCGI 响应 <-------+

一个请求只会交给一个空闲 Worker。Worker 处理完成后不会立即退出,而是回到进程池等待下一个请求;请求中的普通变量会结束生命周期,但进程级扩展状态和某些静态资源可能继续存在。

Unix Socket 还是 TCP Socket

同一台机器上常用 Unix Socket:

1
fastcgi_pass unix:/run/php/php-fpm.sock;

跨容器、跨主机或配置统一时常用 TCP:

1
fastcgi_pass 127.0.0.1:9000;

Unix Socket 通过文件路径寻址,要注意文件权限;TCP Socket 通过 IP 和端口寻址,要注意监听地址、防火墙和网络隔离。

FPM 进程模式

模式 行为 适用方向
static 固定数量 Worker 流量稳定、容量明确
dynamic 在上下限之间动态调整 大多数常规 Web 服务
ondemand 有请求时创建,空闲后回收 低频站点、节省空闲内存

Worker 数量不能照 CPU 核数直接填写。PHP 请求可能等待数据库和外部接口,应结合单进程内存、请求耗时、下游连接数和机器容量压测。

OPcache 如何工作

首次执行某 PHP 文件时:

1
读取源码 -> 词法/语法分析 -> 编译为 Opcode -> 放入 OPcache -> 执行

后续请求可以直接复用缓存的 Opcode。代码发布后是否立即生效,取决于文件时间戳检查、重新验证间隔和部署方式。生产环境常在发布后显式重载 FPM,避免新旧代码混用。

常见故障

  • 502 Bad Gateway:FPM 未启动、Socket 路径错误、权限不足或 Worker 崩溃。
  • 请求排队:Worker 全忙、慢 SQL、外部接口超时或进程上限过低。
  • 内存持续增长:扩展泄漏、长期驻留状态或单请求峰值过大。
  • 发布后仍是旧代码:OPcache 刷新策略或多实例发布不一致。
  • 数据库连接打满:FPM 并发超过数据库可承受连接数。

延伸阅读

站内搜索

没有找到内容!