解决phpMyAdmin在nginx+php-fpm模式下无法使用的问题

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1684839

昨天接到一个网友的问题,说yum安装nginx+php-fpm+mysql+phpMyAdmin后,发现phpMyAdmin无法打开,一直报502错误已经抓狂半天了,本着帮助别人快乐自己的原则,远程帮他看了一下, 现记录和总结如下,问题解决思路的总结放在文章最后,问题解决思路总结也是本文的重点。

问题环境:CentOS6通过yum安装的nginx+php-fpm+mysql+phpMyAdmin

问题描述:安装完成后发现nginx没有问题,而phpMyAdmin无法打开,提示502错误

问题解决过程

查看问题环境的安装包:

nginx-filesystem-1.0.15-12.el6.noarch
nginx-1.0.15-12.el6.x86_64
rrdtool-php-1.3.8-7.el6.x86_64
php-pear-1.9.4-4.el6.noarch
php-devel-5.3.3-46.el6_6.x86_64
php-mbstring-5.3.3-46.el6_6.x86_64
php-mcrypt-5.3.3-3.el6.x86_64
php-5.3.3-46.el6_6.x86_64
php-tidy-5.3.3-46.el6_6.x86_64
php-pecl-memcache-3.0.5-4.el6.x86_64
php-xmlrpc-5.3.3-46.el6_6.x86_64
php-xmlseclibs-1.3.1-3.el6.noarch
php-common-5.3.3-46.el6_6.x86_64
php-pdo-5.3.3-46.el6_6.x86_64
php-xml-5.3.3-46.el6_6.x86_64
php-fpm-5.3.3-46.el6_6.x86_64
php-cli-5.3.3-46.el6_6.x86_64
php-mysql-5.3.3-46.el6_6.x86_64
php-eaccelerator-0.9.6.1-1.el6.x86_64
php-gd-5.3.3-46.el6_6.x86_64

根据nginx报的502错误,可以初步判断是upstream出现了问题,再提到upstream之前,先列一下nginx的配置文件(去掉注释,我已经将nginx记录错误日志的级别从默认级别提升到info)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
user              nginx;   
worker_processes  1;
error_log  /var/log/nginx/error.log info;
pid        /var/run/nginx.pid;
events {   
    worker_connections  1024;    
}
http {   
    include       /etc/nginx/mime.types;    
    default_type  application/octet-stream;
    client_max_body_size 10M;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   
                      '$status $body_bytes_sent "$http_referer" '    
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;   
    keepalive_timeout  65;  
    include /etc/nginx/conf.d/*.conf;
}

由于此配置文件中没有显式写明任何server,因此需要查看一下include /etc/nginx/conf.d/*.conf; 所包含的默认server文件,即/etc/nginx/conf.d/default.conf,去掉注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cat /etc/nginx/conf.d/default.conf    
server {    
    listen       80 default_server;    
    server_name  _;  
    include /etc/nginx/default.d/*.conf;
    location / {   
        root   /usr/share/nginx/html;    
        index  index.php index.html index.htm;    
    }
    error_page  404              /404.html;   
    location = /404.html {    
        root   /usr/share/nginx/html;    
    }  
    error_page   500 502 503 504  /50x.html;    
    location = /50x.html {    
        root   /usr/share/nginx/html;    
    }
     location ~ [^/]\.php(/|$) {   
                fastcgi_split_path_info ^(.+?\.php)(/.*)$;    
                if (!-f $document_root$fastcgi_script_name) {    
                        return 404;    
                }    
                fastcgi_pass 127.0.0.1:9000;    
                fastcgi_index index.php;    
                include fastcgi_params;    
     }    
}

初步判断,此nginx的配置确实没有问题,应该是php-fpm或者php本身的问题(缩小问题范围)。

查阅nginx日志文件(/var/log/nginx/error.log),发现如下提示,确定是php-fpm的问题,fastcgi也算是对upstream的一种代理

1
2
3
4
5
6
7
8
9
10
11
2015/08/14 17:05:32 [notice] 9645#0: using the "epoll" event method   
2015/08/14 17:05:32 [notice] 9645#0: nginx/1.0.15    
2015/08/14 17:05:32 [notice] 9645#0: built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)     
2015/08/14 17:05:32 [notice] 9645#0: OS: Linux 2.6.32-504.el6.x86_64    
2015/08/14 17:05:32 [notice] 9645#0: getrlimit(RLIMIT_NOFILE): 65535:65535    
2015/08/14 17:05:32 [notice] 9646#0: start worker processes    
2015/08/14 17:05:32 [notice] 9646#0: start worker process 9648    
2015/08/14 17:05:36 [error] 9648#0: *1 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.1.228, server: 192.168.1.101, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "192.168.1.101"    
2015/08/14 17:09:22 [error] 9648#0: *4 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.1.228, server: 192.168.1.101, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "192.168.1.101"    
2015/08/14 17:11:23 [error] 9648#0: *7 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.1.228, server: 192.168.1.101, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "192.168.1.101"    
2015/08/14 17:11:33 [info] 9648#0: *9 client closed prematurely connection while reading client request line, client: 192.168.1.228, server: 192.168.1.101

创建一个能打开phpinfo的文件,查看php文件能否正确解析(进一步缩小问题范围)

发现php-fpm能正常解析php文件,里面的各个php组件都显示正常

查看phpMyAdmin的版本,查阅官方网站的文档看看是否支持php5.3.3,发现当前的phpMyAdmin支持,因此应该不是phpMyAdmin的问题

开始检查php-fpm的日志(/var/log/php-fpm/error.log),发现如下所示:

1
2
3
4
5
6
7
8
[14-Aug-2015 16:34:53] NOTICE: fpm is running, pid 9522   
[14-Aug-2015 16:34:53] NOTICE: ready to handle connections    
[14-Aug-2015 16:43:54] WARNING: [pool www] child 9527 exited on signal 11 (SIGSEGV) after 541.401349 seconds from start    
[14-Aug-2015 16:43:55] NOTICE: [pool www] child 9614 started    
[14-Aug-2015 16:44:00] WARNING: [pool www] child 9526 exited on signal 11 (SIGSEGV) after 547.107407 seconds from start    
[14-Aug-2015 16:44:00] NOTICE: [pool www] child 9615 started    
[14-Aug-2015 17:05:36] WARNING: [pool www] child 9523 exited on signal 11 (SIGSEGV) after 1843.098829 seconds from start    
[14-Aug-2015 17:05:36] NOTICE: [pool www] child 9649 started

这个日志显然不足以提供足够的信息来解决问题,因此修改php-fpm和php.ini对日志级别的一些参数配置,以提升日志级别,获取详细的错误信息。

搜索配置文件的中log关键字,或者根据文档或资料修改,一些方法或步骤如下:

/etc/php-fpm.conf文件,将日志级别从notice改动到debug

1
log_level = debug

/etc/php-fpm.d/www.conf文件,将php worker的标准输出和错误输出从/dev/null 重定向到主要的错误日志中,即/var/log/php-fpm/error.log

1
catch_workers_output = yes

/etc/php.ini文件

1
2
3
4
5
6
error_reporting = E_ALL & ~E_DEPRECATED
display_errors = On
display_startup_errors = On
log_errors = On
track_errors = On
html_errors = On

再次重新启动php-fpm,发现worker中的详细错误:

1
2
3
4
5
6
7
8
9
[14-Aug-2015 17:09:18] NOTICE: fpm is running, pid 9672   
[14-Aug-2015 17:09:18] NOTICE: ready to handle connections    
[14-Aug-2015 17:09:22] WARNING: [pool www] child 9673 said into stderr: "[Fri Aug 14 17:09:22 2015"    
[14-Aug-2015 17:09:22] WARNING: [pool www] child 9673 said into stderr: "] [notice] EACCELERATOR(9673): PHP crashed on opline 30 of PMA_URL_getCommon() at /usr/share/nginx/html/libraries/url_generating.lib.php:188"    
[14-Aug-2015 17:09:22] WARNING: [pool www] child 9673 said into stderr: ""    
[14-Aug-2015 17:09:22] WARNING: [pool www] child 9673 exited on signal 11 (SIGSEGV) after 4.286828 seconds from start    
[14-Aug-2015 17:09:22] NOTICE: [pool www] child 9679 started    
[14-Aug-2015 17:11:23] WARNING: [pool www] child 9675 said into stderr: "[Fri Aug 14 17:11:23 2015"    
[14-Aug-2015 17:11:23] WARNING: [pool www] child 9675 said into stderr: "] [notice] EACCELERATOR(9675): PHP crashed on opline 30 of PMA_URL_getCommon() at /usr/share/nginx/html/libraries/url_generating.lib.php:188"

错误信息中提到EACCELERATOR这个php模块,因此先确定一下是不是由于这个模块有问题,因此,先将此模块禁用,方法是将/etc/php.d/eaccelerator.ini文件更改个后缀名称,例如mv /etc/php.d/eaccelerator.ini /etc/php.d/eaccelerator.ini~,然后重启php-fpm,再校验一下结果,发现问题已经解决。

可能是eaccelerator与phpMyAdmin冲突的原因,因此要想使用phpMyAdmin可以将此模块禁用,或者安装时跳过这个包。

注释:eAccelerator是一个自由开放源码php加速器,优化和动态内容缓存,提高了php脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。它还有对脚本起优化作用,以加快其执行效率。使PHP程序代码执效率能提高1-10倍。(来自bdbk)

问题解决思路总结

第0条,沟通是诊断故障的关键,详细了解问题始末,例如部署方案,步骤,做了哪些操作等

第一,根据经验判断,nginx+php-fpm+phpMyAdmin是很牢靠的组合,因此判断这是个例问题,而不是批量问题,因此直接开始动手,登录到系统中查看安装的软件包,nginx、php和phpMyAdmin版本都是要查看的,此步骤有助于根据掌握的知识和经验,初步判断是否相互兼容,是否有未修复bug等。

第二,执行nginx -t检查nginx的配置文件有无显式错误,检查nginx运行状态

第三,执行php-fpm -t检查php-fpm的配置文件有无显式错误,检查php-fpm的运行状态

第四,检查错误日志,先检查nginx的错误日志,因为它是“第一现场”,再检查php-fpm日志,因为它是“第二现场”

第五,如果日志提示明显,则按照日志提示,修改相应的配置文件,再次验证问题

第六,如果依然有问题,则本步骤就是解决问题的最关键的步骤,需要提升记录日志的级别,这也就是为什么有debug为什么叫做调试,将nginx的日志级别提升到info(为什么不能提升到debug,nginx编译时有个--debug选项,不确定时可以不用),将php的日志级别提升到debug,打开所有的php调试开关

第七,重新启动nginx和php-fpm后,配置文件生效,重新打开网页重现问题,再次打开日志,根据日志提示内容再次,修改相应的配置文件,再次验证问题

第八,如果反复修改无果后,该查阅官方手册就查阅官方手册,该Google 搜索就Google搜索,该反馈bug就反馈bug,如果持续无果,则换种解决问题的方式,寻找正确的解决方案,参照如下:

  • 参考已有的成功的版本组合,更换版本组合或者修改配置文件,消除环境差异性,适用于快速解决问题

  • 将yum安装改为编译安装,或者yum安装更少的包,以最小化的安装方式将问题范围缩减到最小,从而确定问题,提升解决问题的能力,适用于研究和学习

最后补充一句:只要出现的问题能够重现,而不是随机出现,则就一定能很好的解决,因此不要慌,也不要浮躁,更不要放弃,甚至可以缓一缓后再冷静处理。

--end--

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1684839

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python库有什么用_Python程序员必知什么 常用的Python库有哪些

Python程序员必知什么?常用的Python库有哪些?Python有很多丰富而强大的库,这是它成为人工智能与数据分析领域强者的关键。有很多Python开发人员想知道常用的Python库有哪些,接下来就给大家详细介绍一下。ArrowPython中处理时间的库…

三次握手面试题java_java面试题三次握手和四次挥手-嗨客网

题目对 tcp 了解吗?讲讲它的三次握手和四次挥手?为什么需要三次握手,为什么需要四次挥手。答案三次握手第一次握手:客户端向服务器发送连接请求,这个时候报文首部中的同步为 SYN 1,同时生成一个随机序列号…

运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行脚本的问题

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1676490 运维经验分享作为一个专题,目前共7篇文章 《运维经验分享(一&#xff0…

一个jsp能取到父类jsp的值吗_「Javaweb」ssm整合权限控制框架shiro,你知道怎么做吗?...

为美好而努力——羊羽科技说。最近在开发自己的网站,需要权限控制功能,在网上找了一下,找到了我接下来要介绍的shiro框架。shiro框架是Apache公司维护的开源产品之一,其官网对其的简介是这样的:shiro官网简介翻译过来就…

php for嵌套循环_PHP中的for循环怎样嵌套

本篇文章主要介绍 PHP中的for循环怎样嵌套,感兴趣的朋友参考下,希望对大家有所帮助。for循环的执行原理:for循环的参数有(初始值;判断条件;更新循环变量表达式) 三者均不是必须的,若三者不完整则必须在适当…

Visio显示不完整

下面显示不完整的话,选中对象,菜单栏设置(点击对象,右键并没有段落选项)行距为单倍;右侧显示不完整,选中后右键设置环绕方式为负于文字上方,原来是嵌入型。

python2 python3 通信_python与USB通信

Date周三 04 十一月 2015TagsUSB/PythonPyUSB依赖于一些USB的驱动程序, 这个貌似叫做无驱驱动, 其中libusb是一统天下者, 当然就要用这个咯. 那么问题来了, libusb这个驱动是怎么装到要开发的设备上呢? 在windows下答案是Zadig, 这个和rtlsdr用的方案是一致的.下载了最新的Zad…

php设置用户头像,PHP针对多用户实现更换头像功能

一个网站,其实说白了就是某几个特定功能的组合,而更换用户头像就在这些功能之中。今天就来做个测试,针对不同的用户,实现头像上传功能。先给大家展示下成品效果图:思路针对不同的用户上传头像,我们要为每一…

执行计划中cpu耗时_面试被问怎么排查遇到的系统CPU飙高和频繁GC,到底该怎么回答?...

处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排…

可视化数据包分析工具-CapAnalysis

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://chenguang.blog.51cto.com/350944/1325742 可视化数据包分析工具-CapAnalysis 我们知道,Xplico是一个从pcap文件中解析出IP流…

网易云歌单添加到php,给自己的网站添加网易云音乐歌单吧^ ^

这个是怎么实现的?一起来看看吧APlayer首先我们需要一个音频播放器,这里我用到了APlayer,这是由bilibili前端大神DIYgod开源的播放器,有兴趣的可以去TA的主页看看,非常惊艳,这里我就不多说了我们看一下APla…

python学完面向对象之后_Python学完基础语法后,再往后应该学什么?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第一阶段:Python语言及应用课程内容:Python语言基础,面向对象设计,多线程编程,数据库交互技术,前端特效,Web框架,爬虫框架,…

百度应用部署秘籍

2019独角兽企业重金招聘Python工程师标准>>> 【背景介绍】 传统PaaS采用sandbox实现app间的资源安全隔离,sandbox需要对运行环境和编程语言进行底层的功能限制,例如:禁止创建进程和线程,禁止部分系统调用,禁…

php新闻删除功能设计,php原生开发新闻站之删除新闻

我们前两篇文章都完成了新闻的添加、修改。那么我们这个节课程就给大家介绍删除新闻,这个比之前的两个都要简单点!首先创建一个new_delete.php,接着我们要在新闻列表页找到删除的按钮,给这个按钮加一个连接,我们同样需要通过id来传…

java8新特性_JAVA8十大新特性详解

一、接口的默认方法Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sq…

spark1.6.1 on yarn搭建部署

注:本文是建立在hadoop已经搭建完成的基础上进行的。 Apache Spark是一个分布式计算框架,旨在简化运行于计算机集群上的并行程序的编写。该框架对资源调度,任务的提交、执行和跟踪,节点间的通信以及数据并行处理的内在底层操作都进…

php 精度问题怎么解决,JavaScript 中精度问题以及解决方案

JavaScript 中的数字按照 IEEE 754 的标准,使用 64 位双精度浮点型来表示。其中符号位 S,指数位 E,尾数位M分别占了 1,11,52 位,并且在 ES5 规范 中指出了指数位E的取值范围是 [-1074, 971]。精度问题汇总想…

主线程是如何向子线程传递数据的?_c++ 利用thread创建线程

用进行多线程开发小时候,老师总是教育我们上课要专心,“一心不可二用”。可是CPU这个不听话的“熊孩子”偏偏却在一个芯片中加入了两个甚至多个运算核心,想要一“芯”二用。从硬件厂商的角度,通过增加CPU的运算核心,突…

php多维数组交集,求数组差/交集函数-php数组函数(二)

求数组差集函数函数只检查了多维数组中的一维。可以用 array_diff($array1[0], $array2[0]) 检查更深的维度。u:自定义函数比较,a(association):同时比较键和值。自定义函数callable $value_compare_func必须返回一个小于零,等于零…

寻找水王(2)

求解内容极其相似,相同的思路进行求解即可。同时删除4个不同的ID后,剩余数据中3个多数id仍然是多数ID。 上题只需要一个结果,而现在需要3个结果,上题用到的nTimes,也应改为3个计数器。现在我们需要3个变量来记录当前遍…