温馨提示×

LNMP中Nginx与PHP如何协同工作

小樊
39
2026-01-11 19:17:46
栏目: 编程语言

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/MariaDBPHP-FPMNginx → 浏览器。

一次请求的完整流程

  1. 客户端发起 HTTP 请求Nginx
  2. Nginxlocation 规则匹配:
    • 静态资源:直接读取文件并返回。
    • .php 动态请求:调用 ngx_fastcgi_moduleFastCGI 协议转发至 PHP-FPM
  3. PHP-FPM master 接收连接并分配给 workerworker 调用 PHP 解释器执行脚本:
    • 若涉及数据:PHP 通过 php-mysql/PDO 等扩展连接 MySQL/MariaDB 执行查询。
  4. 执行结果沿 PHP-FPM → FastCGI → Nginx 回传,Nginx 再返回给客户端。
  5. 全流程中: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 进程模型
    • pm = static:固定 worker 数(由 pm.max_children 决定),适合稳定高负载。
    • pm = dynamic:按需伸缩,受 pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers 控制。
    • pm = ondemand:按需启动,空闲超时(pm.process_idle_timeout,默认 10s)后回收,节省内存但冷启动有延迟。
  • 超时与错误码
    • 502 Bad GatewayPHP-FPM 未启动、进程崩溃或未能及时回应。
    • 504 Gateway TimeoutNginx 的 fastcgi 超时(如 fastcgi_connect/read/send_timeout)小于 PHP-FPM 脚本执行时间。
    • 脚本执行上限:PHP 的 max_execution_timePHP-FPM 的 request_terminate_timeout 共同约束;建议二者协调设置,避免 worker 被长时间占用。
  • 平滑重启与配置生效
    • 修改 php.ini 后,向 PHP-FPM master 发送 USR2 信号即可平滑重启:新旧 worker 平滑交替,不中断服务。
  • 缓冲与临时文件
    • fastcgi_buffers/fastcgi_buffer_size 控制响应缓冲;当响应过大时,超出部分会写入 fastcgi_temp 目录,确保大响应也能正确回传。

0