FastCGI是Nginx与PHP-FPM间通信的核心协议,通过长生命周期进程池复用PHP解析环境,避免传统CGI频繁创建进程的开销;PHP-FPM采用master-worker架构,master监听调度,worker内嵌PHP解释器执行脚本;本地部署应优先使用Unix Socket(如/run/php/php8.2-fpm.sock)以降低延迟,且需确保Nginx用户对其有读写权限;关键配置fastcgi_param SCRIPT_FILENAME必须正确传递脚本绝对路径,否则导致404或空白页;进程池宜设为dynamic模式,依据内存合理配置pm.max_children与pm.start_servers,并启用slowlog定位慢脚本。

PHP框架运行在Nginx上,本质不是Nginx直接执行PHP代码,而是通过FastCGI协议把请求转给PHP-FPM处理。这个通信机制决定着响应速度、稳定性甚至是否频繁出现502错误。
FastCGI是连接Nginx和PHP-FPM的协议桥梁
CGI每次请求都新建进程,开销大;FastCGI让PHP进程长期存活,复用环境,显著提升并发能力。PHP-FPM就是FastCGI的一种成熟实现,它自带master-worker架构:master监听套接字,worker真正执行PHP脚本。
- master进程只负责调度和管理,不参与脚本解析
- 每个worker进程内嵌PHP解释器,已加载php.ini、扩展等,省去重复初始化
- Nginx不关心PHP怎么跑,只按FastCGI格式发数据、收响应
通信方式选Unix Socket还是TCP端口?
本地部署优先用Unix Socket(如/run/php/php8.2-fpm.sock),因为它绕过网络协议栈,延迟更低、资源更省。TCP(如127.0.0.1:9000)适合跨容器或调试场景,但多一层系统调用开销。
- Socket路径必须与PHP-FPM实际监听路径严格一致,否则502报错
- 注意文件权限:Nginx worker进程用户(如www-data)需对.sock文件有读写权
- 用ls -l /run/php/检查.sock是否存在、属主是否正确
关键配置项不能漏掉SCRIPT_FILENAME
Nginx转发时只传URI,PHP-FPM不知道该执行哪个物理文件。fastcgi_param SCRIPT_FILENAME这行就是告诉PHP-FPM:“你要跑的是这个绝对路径下的脚本”。漏了它,PHP会返回404或空白页。
立即学习“PHP免费学习笔记(深入)”;
- 推荐写法:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- $document_root确保根目录准确,避免因alias或重写导致路径错乱
- 不要硬编码路径,否则迁移或换域名时容易出问题
PHP-FPM进程池配置直接影响吞吐量
worker数量太少,高并发下请求排队;太多则内存吃紧、上下文切换反拖慢性能。动态模式(pm = dynamic)最常用,需根据服务器内存和平均脚本内存占用来设值。
- 估算公式:max_children ≈ 总内存 × 0.8 ÷ 单个PHP进程平均内存(通常40–80MB)
- start_servers建议设为max_children的20%–30%,避免冷启动延迟
- 启用slowlog可捕获超时脚本,定位框架中阻塞操作(如未加索引的DB查询)



















