阅读量:5
LNMP中 Nginx 与 PHP 的协同机制
核心架构与角色
- Nginx:高性能的 HTTP 服务器/反向代理,擅长处理静态资源(如 .html/.css/.js/.jpg),对 .php 等动态请求不直接执行,而是通过 FastCGI 协议转发给后端处理器。
- PHP-FPM(FastCGI Process Manager):PHP 的 FastCGI 进程管理器,采用 master/worker 多进程模型,负责接收 Nginx 转发的请求、调用 PHP 解释器执行脚本、回收资源。
- 通信协议:Nginx 的 ngx_fastcgi_module 将 HTTP 请求映射为 FastCGI 请求,与 PHP-FPM 进行交互;动态请求的结果再由 Nginx 封装为 HTTP 响应返回客户端。
- 数据流:浏览器 → Nginx(静态直出;动态转发)→ PHP-FPM(调用 PHP)→(如需)MySQL/MariaDB → PHP-FPM → Nginx → 浏览器。
一次请求的完整流程
- 客户端发起 HTTP 请求 到 Nginx。
- Nginx 按 location 规则匹配:
- 静态资源:直接读取文件并返回。
- .php 动态请求:调用 ngx_fastcgi_module 按 FastCGI 协议转发至 PHP-FPM。
- PHP-FPM master 接收连接并分配给 worker,worker 调用 PHP 解释器执行脚本:
- 若涉及数据:PHP 通过 php-mysql/PDO 等扩展连接 MySQL/MariaDB 执行查询。
- 执行结果沿 PHP-FPM → FastCGI → Nginx 回传,Nginx 再返回给客户端。
- 全流程中:Nginx 专注连接与静态资源,PHP-FPM 专注脚本执行与并发调度。
通信方式与关键配置
-
通信方式对比
方式 典型配置 适用场景 主要特点 TCP Socket php-fpm: listen = 127.0.0.1:9000;Nginx:fastcgi_pass 127.0.0.1:9000;同机或跨机部署 通用、可跨主机;经 loopback/TCP 栈,开销略大 Unix Domain Socket php-fpm: listen = /tmp/php-fpm.sock;Nginx:fastcgi_pass unix:/tmp/php-fpm.sock;仅同机部署 不经过网络栈,开销更小;需正确设置 socket 权限 -
关键 Nginx 配置要点
location ~ \.php$捕获 .php 请求,使用fastcgi_pass指定 PHP-FPM 地址。- 必须设置
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,否则 PHP-FPM 找不到脚本。 - 按需添加
fastcgi_param HTTPS on;(当反向代理或 TLS 终止在 Nginx 时)。
-
最小可用示例
server { listen 80; server_name app.test; root /code/public; index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; # 或 unix:/tmp/php-fpm.sock; } } -
权限与安全(Unix Socket)
- 建议统一 Nginx 与 PHP-FPM 的运行用户/组,并设置 socket 权限为 0660:
- php-fpm:
listen.owner = www; listen.group = www; listen.mode = 0660; - 避免 access denied 导致 502。
- php-fpm:
- 建议统一 Nginx 与 PHP-FPM 的运行用户/组,并设置 socket 权限为 0660:
进程模型与性能调优
- PHP-FPM 进程模型
- pm = static:固定 worker 数(由 pm.max_children 决定),适合稳定高负载。
- pm = dynamic:按需伸缩,受 pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers 控制。
- pm = ondemand:按需启动,空闲超时(pm.process_idle_timeout,默认 10s)后回收,节省内存但冷启动有延迟。
- 超时与错误码
- 502 Bad Gateway:PHP-FPM 未启动、进程崩溃或未能及时回应。
- 504 Gateway Timeout:Nginx 的 fastcgi 超时(如
fastcgi_connect/read/send_timeout)小于 PHP-FPM 脚本执行时间。 - 脚本执行上限:PHP 的 max_execution_time 与 PHP-FPM 的 request_terminate_timeout 共同约束;建议二者协调设置,避免 worker 被长时间占用。
- 平滑重启与配置生效
- 修改 php.ini 后,向 PHP-FPM master 发送 USR2 信号即可平滑重启:新旧 worker 平滑交替,不中断服务。
- 缓冲与临时文件
- fastcgi_buffers/fastcgi_buffer_size 控制响应缓冲;当响应过大时,超出部分会写入 fastcgi_temp 目录,确保大响应也能正确回传。
以上就是关于“LNMP中Nginx与PHP如何协同工作”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm