今天将 PHP 从 5.3.28 升级到 5.3.29, 发现网站打不开了, 提示 502 bad gateway, 访问静态资源可以, 但访问任何 PHP 文件都会 502
其实之前也发现这个问题, 只是一直没找到解决办法, 所以我一直将 PHP 保持在 5.3.28 版本
按照我以前的脾气, 我什么软件都得要最新的稳定版, 但 PHP 之类的软件是例外, 因为版本高了, 会导致很多程序不兼容, 相对来说 5.3 兼容性算是最好的版本之一, 当然 5.2 也可以
强迫症实在受不了, 官方说 5.3.29 是 5.3 的最后一个版本, 最后一个版本出现这种问题又一直没解决让我很难受
网上搜索了一下, 没人出现我这种问题, 所有的编译过程, 配置过程, 都是照旧, 之前从 5.3.25 一直到 5.3.28 都是用的我写的同一个升级脚本, 按道理同一个子版本系列, 一样的编译和配置过程, 不应该出现问题的
为何 5.3.25 一直到 5.3.28 都没问题, 到了 5.3.29 就没问题了呢?
今天终于把问题的根源找到了, 我也是醉了
由于我不想占用额外的端口, 所以 Nginx 和 PHP-FPM 之间一直使用的 Unix socket, 而且据说这种方式效率也高一些
PHP 升级到 5.3.29 以后, 出现 502 错误, 而且是一打开网页就报错了, 不像是由于 PHP 执行超时导致的 Nginx 提示 502, 更像是 PHP-FPM 异常终止了, 或者是 Ngxin 根本没有连接上 fastcgi
使用 PHP-FPM 的日志也是郁闷, 我明明开启了日志, 还设置了日志路径, 但还是没有生成日志
好吧, 根据前面的思路推测出来的原因找问题:
1.PHP-FPM 一开始工作就异常终止了;
2.Ngxin 根本没有连接上 fastcgi
第一种可能直接就排除了, 因为出现 502 错误的时候, 后台的 PHP-FPM 进程并没有退出, 还存活得好好的
那么很可能是第二种可能了, 我把 Nginx 和 PHP-FPM 的配置文件修改了一下, 改成了传统的地址: 端口的形式
PHP-FPM 配置文件中:
listen = 127.0.0.1:1234
Nginx 配置文件中:
fastcgi_pass 127.0.0.1:1234
重启服务, 网站竟然顺利打开了
看来就是 Nginx 没有连接上 PHP-FPM 了, 那么问题出在哪里呢? 难道 5.3.29 去掉了 Unix socket 的连接方式? 我觉得不大可能, 查阅更新日志, 也没有看到有关的项目啊
我将 Nginx 和 PHP-FPM 的配置文件改回去
PHP-FPM 配置文件中:
listen = /tmp/php-cgi.sock
Nginx 配置文件中:
fastcgi_pass unix:/tmp/php-cgi.sock;
重启服务, 立马又 502 了
首先想到了检查权限, 反正是测试, 所以我二话不说直接把那个 PHP-FPM 的 sock 文件权限改为 777
chmod 777 /tmp/php-cgi.sock
直接打开网页, 能打开!
好吧, 就是权限问题了, 重启服务, 查看 php-cgi.sock 的权限
-rwx------. 1 root root 663 9 月 18 00:16 php-cgi.sock
这原因已经很明了了, 怪不得 Nginx 连不上 PHP-FPM,php-cgi.sock 的权限竟然是 700,
但问题来了, 为什么同样的编译和配置过程, 5.3.28 之前的版本就没问题呢? 我查看另一台没有升级 5.3.29 的服务器:
srw-rw-rw- 1 root root 0 9 月 16 21:11 php-cgi.sock
发现其权限是 666, 这无法理解了为什么 5.3.28 的默认权限配置是 666, 到了 5.3.29 就变成 700 了呢?
查阅 PHP 文档, 找到解决办法
将 PHP-FPM 里的配置文件加入, 前两项是指定 php-cgi.sock 的拥有者和用户组, 后一项是指定文件权限
- listen.owner = www
- listen.group = www
- listen.mode = 0666
重启服务, 问题解决
来源: https://www.php1.cn/detail/php-a837da0386.html