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 | 启动 php-fpm |
Nginx 不读取 FPM 的 www.conf。它只需要在站点配置中知道 FPM 监听地址,例如 Unix Socket 或 127.0.0.1:9000。
请求阶段
1 | 浏览器 -> Nginx -> FastCGI -> FPM Worker -> PHP 入口文件 |
一个请求只会交给一个空闲 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 并发超过数据库可承受连接数。