温馨提示×

php-fpm在ubuntu上遇到错误怎么办

小樊
40
2025-11-24 19:44:44
栏目: 编程语言

快速定位与修复流程

  • 确认服务状态与版本:将下方命令中的7.x替换为你的实际版本(如7.4、8.1、8.2、8.3
    • 查看状态:sudo systemctl status php7.x-fpm
    • 启动/重启:sudo systemctl start|restart php7.x-fpm
    • 设置开机自启:sudo systemctl enable php7.x-fpm
  • 先做配置语法检查:sudo php-fpm7.x -t(语法错误会直接指出文件与行号)
  • 查看错误日志:优先看 /var/log/php/7.x-fpm.log/var/log/php-fpm.log;若日志目录不存在或不可写,创建并赋权:
    • sudo mkdir -p /var/log/php7.x-fpm
    • sudo chown www-data:www-data /var/log/php7.x-fpm
    • sudo chmod 0755 /var/log/php7.x-fpm
  • 确认监听地址与端口/套接字:在 /etc/php/7.x/fpm/pool.d/www.conf 检查 listen;用 ss -lntp | grep phpnetstat -plnt | grep php 查看是否监听;若为套接字,检查文件是否存在:ls -l /run/php/php7.x-fpm.sock。确保与 Nginx/Apache 的 FastCGI 配置一致。

常见错误对照与修复

症状 可能原因 快速修复
502 Bad Gateway PHP-FPM 未启动、崩溃或与 Web 服务器通信不一致 启动/重启服务;核对 listen=127.0.0.1:9000listen=/run/php/php7.x-fpm.sock 与 Nginx/Apache 配置一致
504 Gateway Timeout 脚本执行超时、进程不足 调整 request_terminate_timeout(或 pool 的 request_timeout);增加 pm.max_children;优化慢脚本
Permission denied(13) 连接 Unix 套接字 套接字权限/属主不匹配 www.conf 设置 listen.owner=www-data、listen.group=www-data、listen.mode=0660;确保目录可访问
Primary script unknown Nginx 未正确传递脚本路径 在 Nginx 配置加入:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 并核对 root 路径
进程池耗尽 pm.max_children 太小或慢请求占满 提升 pm.max_children;开启慢日志定位问题;必要时改用 ondemand/dynamic
Allowed memory exhausted 脚本内存超限 提升 memory_limit(php.ini);优化代码与查询
端口冲突(9000 被占用) 其他进程占用 9000 更换 listen 端口或停止占用进程
空白页/无输出 错误未显示、语法错误 临时开启 display_errors=On;查看 php-fpm.log;用 php -l file.php 检查语法

配置与性能优化要点

  • 进程池关键参数(/etc/php/7.x/fpm/pool.d/www.conf):
    • 模式与规模:pm=dynamic;示例 pm.max_children=15、pm.start_servers=5、pm.min_spare_servers=5、pm.max_spare_servers=10、pm.max_requests=500
    • 超时控制:根据业务设置 request_terminate_timeout(或 request_timeout),避免长请求阻塞
    • 慢日志:开启 slowlogrequest_slowlog_timeout,定位耗时逻辑
  • 监听与权限:
    • 套接字方案:listen=/run/php/php7.x-fpm.sock,并设置 listen.owner/listen.group=www-data、listen.mode=0660
    • TCP 方案:listen=127.0.0.1:9000,与 Web 服务器一致
  • 基础性能:
    • 启用 OPcache(php.ini):opcache.enable=1、opcache.memory_consumption=64、opcache.max_accelerated_files=4000、opcache.revalidate_freq=2
  • 日志与调试:
    • 提升日志级别至 notice/debug 便于排错;配置 logrotate 做日志切割,避免过大。

Nginx 与防火墙的关键配置

  • Nginx 典型 FastCGI 片段(与 FPM 的 listen 保持一致):
    • 套接字示例:
      • fastcgi_pass unix:/run/php/php7.4-fpm.sock;
      • fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      • include fastcgi_params;
    • TCP 示例:fastcgi_pass 127.0.0.1:9000;
  • 防火墙放行:
    • UFW:sudo ufw allow ‘Nginx Full’sudo ufw allow 9000(如走 TCP)
    • 如为 Apache + mod_proxy_fcgi,确保启用相应模块与代理配置

仍未解决时的进阶排查

  • 查看进程与监听:pgrep php7.x-fpmss -lntp | grep php;检查套接字:ls -l /run/php/php7.x-fpm.sock
  • 启用并访问状态页:在 www.conf 配置 pm.status_path=/status,并在 Nginx 中放行;访问 http://localhost/status 查看进程与排队情况
  • 动态跟踪:用 strace 跟踪 FPM 进程定位系统调用失败点(如权限、文件不存在等)
  • 配置语法复核:sudo php-fpm7.x -t;必要时回滚最近修改并逐步加回。

0