设为首页 收藏本站
查看: 801|回复: 0

[经验分享] 分析php代码报502的错

[复制链接]

尚未签到

发表于 2018-12-14 10:44:54 | 显示全部楼层 |阅读模式
  首先得了解502错误的定义(http://www.checkupdown.com/status/E502_zh.html)以及主要是考虑是不是代理(访问的上游)出了问题
  

  查询php-fpm的日志可以发现有php运行超时的记录

  ...
  [pool www] child 27343, script '/usr/local/tengine/html/index.php' (request: "POST /index.php") executing too slow (3.196879 sec), logging
  ......
  

  想到的是哪些参数会决定了php执行的超时时间:
  

  以下摘自章小鱼儿_linux博客的一些内容(http://zhangxylinux.blog.运维网.com/5041623/1543035)
  

  PHP自身配置:

  •   在php.ini里max_execution_time可以设置php脚本的最大执行时间,但是在php-cgi(php-fpm)中,该参数不生效,真正能控制php最大执行时间的是request_terminate_timeout,就是说如果是使用 mod_php5.so 的模式运行 max_execution_time 是会生效的,但是如果是php-fpm模式中运行时不生效的。参数优先级 nginx >  php-fpm > php
  •   max_execution_time
  • 计算的只是PHP脚本本身执行的时间,执行之外的时间都不会计算在内。哪些属于执行之外的时间呢?包含sleep、数据交互、socket交互等等
  • request_terminate_timeout = 0  即为不受时间控制,永不超时
      

  3.request_terminate_timeout引起的资源问题

  • request_terminate_timeout的值如果设置为0或者过长的时间,可能会引起file_get_contents的资源问题。
  • 如果file_get_contents请求的远程资源如果反应过慢,file_get_contents就会一直卡在那里不会超时。request_terminate_timeout默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 30s,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免”502 Bad Gateway”。解决办法是request_terminate_timeout设置为10s或者一个合理的值,或者给file_get_contents加一个超时参数
如果常有请求超时,请打开php-fpm的慢日志,通过日志来确认评估超时时间

4.

  • Ngnix中的fastcgi 请求时间控制
  • fastcgi_connect_timeout
  • 语法:fastcgi_connect_timeout time
  • 默认值:fastcgi_connect_timeout 60
  • 使用字段:http, server, location
  • 指定同FastCGI服务器的连接超时时间,这个值不能超过75秒。
      

  • fastcgi_read_timeout
  • 语法:fastcgi_read_timeout time
  • 默认值:fastcgi_read_timeout 60
  • 使用字段:http, server, location
  • 前端FastCGI服务器的响应超时时间,如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,或者在错误日志中出现前端服务器响应超时错误,可能需要调整这个值。
      

  • fastcgi_send_timeout
  • 语法:fastcgi_send_timeout time
  • 默认值:fastcgi_send_timeout 60
  • 使用字段:http, server, location
  • 指令为上游服务器设置等待一个FastCGI进程的传送数据时间,如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,那么可以修改这个值,如果你在上有服务器的error log里面发现一些超时错误,那么可以恰当的增加这个值。
  • 指令指定请求服务器的超时时间,指完成了2次握手的连接,而不是完整的连接,如果在这期间客户端没有进行数据传递,那么服务器将关闭这个连接。
  


  • 在nginx+FastCGI 配置测试中
  • 其中在request_terminate_timeout设置为永不超时的情况下,nginx中fastcgi_read_timeout 的设置时间将影响到最终的超时时间。
  • 测试中,如果是php-fpm中的超时
  • 将显示 502 Bad Gateway
  • 如果是nginx中cgi配置超时
  • 将显示 504 Gateway Time-out




但是经过分析服务器上没有出现所有 php-cgi 进程都卡在 file_get_contents()上
继续查看日志发现以下内容:

WARNING: [pool www] child 407 exited on signal 11 (SIGSEGV) after 3409158.647209 seconds from start

查询系统日志也能发现类似问题
php-fpm[407]: segfault at c5a1 ip 00000000007cd1cc sp 00007fff74640bc0 error 4 in php-fpm[400000+949000]

发现进程遇到段错误异常退出了,但是系统并没有开启core文件,暂时不能定位了

如何发现段错误:

查看限制情况:


系统对于core文件大小默认限制是0.也就是说不能生成core文件。可以通过以下命令设置大小。
执行ulimit -c unlimited
就去除了系统对core文件大小的限制,接下来我们就可以根据产生的core文件去定位问题了


利用GDB调试php core dump

应用程序因异常或bug异常退出在一定条件下会产生core文件


开启core

设置core路径
echo "/tmp/core.%p" > /proc/sys/kernel/core_pattern


修改unlimit(略)



重启php-fpm



查看core文件

gdb /usr/local/php/sbin/php-fpm -c core_file_path
.....

//查看调用栈

(gdb)bt

....


还可以利用php提供的.gdbinit(gdb命令编写脚本)帮我们查看php函数层的调用
(gdb)source /usr/local/src/autoinst.nmp_nosql_node_php54/php-5.4.30/.gdbinit
(gdb)zbacktrace




参考链接:
http://zhangxylinux.blog.运维网.com/5041623/1543035
https://yq.aliyun.com/articles/27468
http://www.vckai.com/p/38




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-651258-1-1.html 上篇帖子: php-fpm 启动报please specify user and group other-10059225 下篇帖子: PHP生成随机密码的4种方法及性能对比
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表