温馨提示×

LNMP中Nginx与PHP-FPM协同工作

小樊
45
2025-12-06 03:54:29
栏目: 编程语言

LNMP中 Nginx 与 PHP-FPM 的协同机制

核心原理与角色分工

  • Nginx:高性能 HTTP/反向代理 服务器,擅长处理静态资源(如 .html/.css/.js/.jpg),遇到 .php 等动态请求时,通过 FastCGI 协议转发给后端 PHP-FPM
  • PHP-FPM(FastCGI Process Manager):PHP 的 FastCGI 进程管理器,采用 master/worker 模型;master 负责监听与进程调度,worker 内嵌 PHP 解释器 执行脚本。
  • FastCGI/CGICGI 为每个请求 fork/销毁进程,开销大;FastCGI 持久化进程,可处理多个请求,显著提升性能。
  • 处理链路:浏览器 → Nginx(静态直出;动态转发)→ PHP-FPM(worker 执行)→ 数据库(如 MySQL)→ 结果沿原路返回浏览器。

通信方式与选择

  • TCP Socket:如 127.0.0.1:9000,可跨主机,网络可达性好,适合分离部署或容器化。
  • Unix Domain Socket:如 /tmp/php-fpm.sock/var/run/php/phpX.Y-fpm.sock,仅限同一主机,省去网络栈开销、延迟更低、资源占用更少。
  • 选择建议:单机优先 Unix Socket;跨机或跨容器使用 TCP;两者在功能上等价,关键是 Nginx 与 PHP-FPM 配置保持一致

关键配置示例

  • Nginx 转发到 PHP-FPM(TCP 示例)
    server {
        listen 80;
        server_name localhost;
        root  /srv/www/htdocs;
        index index.php index.html;
    
        location / {
            try_files $uri $uri/ =404;
        }
    
        location ~ \.php$ {
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_pass   127.0.0.1:9000;   # 与 PHP-FPM 的 listen 一致
        }
    
        error_page 500 502 503 504 /50x.html;
        location = /50x.html { root /srv/www/htdocs; }
    }
    
  • PHP-FPM 监听配置(两种等价方式,二选一)
    • TCP:listen = 127.0.0.1:9000
    • Unix Socket:listen = /var/run/php/php7.4-fpm.sock
  • 权限要点(Unix Socket)
    • 常见做法:将 PHP-FPM 运行用户/group 设为 www-data,并将 listen.owner/listen.group 也设为 www-data,同时确保 Nginx worker 也以 www-data 运行,避免 13: Permission denied
  • 测试
    • 创建探针:/srv/www/htdocs/info.php
      <?php
      phpinfo();
      ?>
      
    • 访问 http://服务器IP/info.php 验证解析是否正常。

常见故障排查与优化

  • 常见错误
    • 502 Bad Gateway:Nginx 无法连接 PHP-FPM(服务未启动、端口/socket 不对、权限不足、防火墙阻断)。
    • 504 Gateway Timeout:PHP 执行超时PHP-FPM 进程不足/过载
    • File not foundSCRIPT_FILENAME 路径错误或文件不存在,需确保 $document_root$fastcgi_script_name 指向真实文件。
  • 排查步骤
    • 检查服务状态:systemctl status php-fpm nginx;查看 Nginx error.logPHP-FPM error.log
    • 验证监听:ss -lntp | grep :9000ls -l /var/run/php/php*.sock;核对 Nginx fastcgi_passPHP-FPM listen 一致。
    • 权限与属主:ls -l 核对 socket 文件Nginx/PHP-FPM 用户 匹配;必要时调整 listen.owner/listen.groupNginx worker 用户。
  • 性能与安全要点
    • 进程与队列:在 PHP-FPM 进程池 中合理设置 pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers,并配置 request_terminate_timeoutslowlog 定位慢请求。
    • 传输选择:单机优先 Unix Socket;跨机使用 TCP 并做好访问控制。
    • 安全加固:限制 .php 执行路径、禁用危险函数、隐藏 PHP 版本信息、为 socket 文件 设置合适的权限与所属用户组。

0