将PHP从5.3.28升级到5.3.29时Nginx出现502错误


Posted in PHP onMay 09, 2015

今天将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
重启服务,问题解决。

PHP 相关文章推荐
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
PHP中对数据库操作的封装
Oct 09 PHP
Windows2003 下 MySQL 数据库每天自动备份
Dec 21 PHP
探讨:使用XMLSerialize 序列化与反序列化
Jun 08 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
PHP清除数组中所有字符串两端空格的方法
Oct 20 PHP
PHP数据库连接mysql与mysqli对比分析
Jan 04 PHP
PHP微信分享开发详解
Jan 14 PHP
php实现socket推送技术的示例
Dec 20 PHP
Ajax请求PHP后台接口返回信息的实例代码
Aug 21 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
Aug 05 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
May 08 #PHP
php中header跳转使用include包含解决参数丢失问题
May 08 #PHP
PHP中is_file()函数使用指南
May 08 #PHP
PHP5.2下preg_replace函数的问题
May 08 #PHP
PHP中is_dir()函数使用指南
May 08 #PHP
php中file_exists函数使用详解
May 08 #PHP
PHP时间和日期函数详解
May 08 #PHP
You might like
一个ftp类(ini.php)
2006/10/09 PHP
截获网站title标签之家内容的例子
2006/10/09 PHP
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
php将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
jquery解决客户端跨域访问问题
2015/01/06 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
JS动画定时器知识总结
2018/03/23 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
canvas像素画板的实现代码
2018/11/21 HTML / CSS
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
百丽国际旗下购物网站:优购
2017/02/28 全球购物
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
财务部岗位职责范本
2015/04/14 职场文书
2016新年晚会开场白
2015/12/03 职场文书
Django框架中表单的用法
2022/06/10 Python