确认php-fpm服务是否运行需执行systemctl status php-fpm,若显示inactive (dead)或未找到服务,则未启动;多版本环境下应使用systemctl list-units | grep fpm确认目标版本(如php7.4-fpm)处于active (running)状态,再sudo systemctl start php7.4-fpm启动。

确认PHP-FPM服务是否运行
执行 systemctl status php-fpm 查看服务状态,若显示 inactive (dead) 或未找到服务,则PHP-FPM根本未启动。
常见错误是系统存在多个PHP版本(如php7.4、php8.1、php8.2),但只有其中一个版本的fpm服务被启用。运行 systemctl list-units | grep fpm 列出所有PHP-FPM服务单元,确认你实际要用的版本(例如 php7.4-fpm.service)处于 active (running) 状态。
若目标服务未运行,执行 sudo systemctl start php7.4-fpm 启动它。注意:不要直接运行 php-fpm 命令,这会以当前用户前台启动,无法被Nginx稳定连接。
检查Nginx与PHP-FPM通信通道
Nginx必须通过正确的地址连接到PHP-FPM进程,这个地址由 fastcgi_pass 指令指定。
打开你的站点Nginx配置文件(通常在 /etc/nginx/sites-enabled/your-site),定位到 location ~ \.php$ 块,检查 fastcgi_pass 的值:
方法一:使用 Unix Socket(推荐)
确保路径与PHP-FPM实际监听路径完全一致。查看PHP-FPM池配置(如 /etc/php/7.4/fpm/pool.d/www.conf)中 listen = /run/php/php7.4-fpm.sock 这一行,然后在Nginx中写成:fastcgi_pass unix:/run/php/php7.4-fpm.sock;
方法二:使用TCP端口
若PHP-FPM配置为 listen = 127.0.0.1:9000,则Nginx中必须写成:fastcgi_pass 127.0.0.1:9000;。不能写成 localhost:9000——DNS解析可能引入延迟或失败,【必须用 127.0.0.1】。
改完后执行 sudo nginx -t 测试语法,再 sudo systemctl reload nginx 生效。
验证root与try_files配置是否正确
第一步:确认Nginx的 root 指令是否指向Laravel项目的 public/ 目录,而不是项目根目录。错误示例:root /var/www/myapp; → 这会导致CSS、JS请求404,更严重的是暴露 /vendor/autoload.php 源码。
第二步:在 location / 块中,必须包含且仅包含这一行:try_files $uri $uri/ /index.php?$query_string;
关键细节:
• 必须用 $query_string,不是 $args,也不是空着;
• 不能写成 return 301 /index.php?$query_string,这是外部重定向,会把 index.php 暴露在URL里;
• 如果你用Docker部署,root 路径要匹配容器内挂载的真实路径,例如 - ./src/:/var/www/html,那么 root 就该是 /var/www/html/public,而非 /var/www/public。
排查PHP-FPM内部错误
如果前几步都正确,但依然502,极大概率是PHP-FPM子进程崩溃。查看PHP-FPM错误日志(路径通常在 /var/log/php7.4-fpm.log 或 /var/log/php-fpm/www-error.log)。
若日志中出现类似 WARNING: [pool www] child 12345 exited on signal 11 (SIGSEGV),说明PHP进程发生了段错误,常见原因有:
① PHP扩展冲突:特别是新安装的 pdo_sqlsrv、sqlsrv、redis 或 opcache 扩展与当前PHP版本不兼容;
② 内存溢出:Laravel分页时数据量过大,或Blade模板中存在无限递归渲染;
③ PHP版本bug:某些PHP小版本(如7.3.x后期)对特定字符(中文顿号、书名号)处理异常,导致502;
临时验证方式:注释掉控制器中所有业务逻辑,只留 return response('OK');,若页面能打开,说明问题出在代码或扩展层。
调整Nginx缓冲区与超时参数
当Laravel返回较大响应(如含大量分页数据的JSON API、导出Excel的流式响应)时,Nginx默认缓冲区可能不足,触发502。
在Nginx配置的 http 或 server 块中添加以下三行:
fastcgi_buffers 16 16k;fastcgi_buffer_size 32k;fastcgi_read_timeout 300;
其中 fastcgi_read_timeout 是Nginx等待PHP-FPM响应的最长时间(秒),Laravel队列任务、大文件上传、复杂报表生成常需调高此值。改完后务必执行 sudo nginx -t && sudo systemctl reload nginx。











