网站源码下载PR查询短网址
首页编程数据库网页图形冲浪邮件下载浏览器QQ系统办公软件站长安全手机邮件认证组网通信


网站首页 -> 网络编程 -> PHP技巧
关于php-cgi 的 SIGSEGV 错误的一些想法

发表日期:2009-7-3


几台使用了 nginx+php-fpm 的机器上,偶尔能看到php-fpm.log中有这样的内容


引用
Oct 28 23:13:53.849419 [NOTICE] fpm_got_signal(), line 73: received SIGCHLD
Oct 28 23:13:53.849490 [WARNING] fpm_children_bury(), line 229: child 15044 (pool default) exited on signal 11 SIGSEGV after 1.332818 seconds
Oct 28 23:13:53.850341 [NOTICE] fpm_children_make(), line 305: child 15122 (pool default) started

如果得到SIGSEGV信号的进程比较多的话,还能看到如下的日志


引用
Oct 28 09:03:15.812009 [WARNING] fpm_children_bury(), line 256: failed PRocesses threshold (10 in 60 sec) is reached, initiating reload
Oct 28 09:03:15.812030 [NOTICE] fpm_pctl(), line 208: switching to 'reloading' state

然后php-fpm就会重启。其中的
failed processes threshold (10 in 60 sec) is reached
是在php-fpm.conf中设置的,表示在60秒内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过10个,php-fpm就会重启。可以通过把php-fpm.conf中的 emergency_restart_threshold的值设置的大一些来增加这个重启的阀值,比如增加到60个,在有些时候,这能够避免php-fpm重启,但这并不是解决问题的根本办法

SIGSEGV信号一般表示


引用
SIGSEGV --- Segment Fault. The possible cases of your encountering this error are:
1.buffer overflow --- usually caused by a pointer reference out of range.
2.stack overflow --- please keep in mind that the default stack size is 8192K.
3.illegal file access --- file operations are forbidden on our judge system

其中的第三条,跟本问题的关系比较大。也就是php-cgi访问了一个不存在的或者没有权限访问的文件
我用的php-fpm补丁是0.5.8版的,按照一些说法,只要设置了


引用
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

之后,php-cgi如果找不到文件或者没有权限访问的话 会提示No input file specified. 或者Access denied.
问题到这里似乎又陷入了僵局
后来又在php.ini中找到了php-cgi的一个参数 cgi.fix_pathinfo


引用
cgi.fix_pathinfo  boolean
对 CGI 提供了真正的 PATH_INFO/PATH_TRANSLATED 支持。以前 PHP 的行为是将 PATH_TRANSLATED 设为 SCRIPT_FILENAME,而不管 PATH_INFO 是什么。有关 PATH_INFO 的更多信息见 cgi 规格。将此值设为 1 将使 PHP CGI 修正其路径以遵守规格。设为 0 将使 PHP 的行为和从前一样。默认为零。用户应该修正其脚本使用 SCRIPT_FILENAME 而不是 PATH_TRANSLATED。

把这个参数的值设置为1 ,cgi会多做一些检查,来判断请求的路径中,那部分是文件名,哪部分是路径名
下面是google groups上的一段话


引用
when cgi.fix_pathinfo was set to "1" it caused a lot of checks in order to find which part of SCRIPT_FILENAME is a file name and which is PATH_INFO. In case of missing file it caused NULL
in path_translated, which caused the crash.

此问题已经耗费了我太多的精力,已经不愿意多花时间去查问题了。比如,可以使用gbd来查看php-cgi 出错以后产生的dump文件。但这个问题只是偶尔发生,很难捕捉到。如果有兄弟也遇到这个问题,或者你有更好的解决办法,不妨大家交流一下
修改此参数后,观察了一段时间,SIGSEGV错误在一些服务器上确实消失了。
补充一下 11月10日早上6点半左右到9点26分,三台服务器(给校内网做的app)同时出现了大量的SIGSEGV错误,校内的服务器出的故障,在我这几台服务器上产生了大量的不正确的 post / ,后来问校内的工程师,他们只说服务down掉了,却不肯略微详细的说一下情况。后来我模拟这些post,确没出问题??奇怪了

上一篇:nginx代理缓存乱码问题 人气:3509
下一篇:nginx缓存cache的5种方案 人气:3167
网站文章搜索
邮件订阅服务
输入你的邮件地址,你将不会错过任何关于<PHP技巧教程>的内容
今日更新文章
·Office 2010宝典 word之(10)巧用书法字帖
·Office 2010宝典 word之(9)快速更改文档
·Office 2010宝典 word之(8)让艺术字为您
·Office 2010宝典 word之(7)通过主题快速
·Office 2010宝典 word之(6)快速插入文档
·Office 2010宝典 word之(5)您手边的工具
·Office 2010宝典 word之(4)多语言翻译
·Office 2010宝典 word之(3)可以朗读的屏
·Office 2010宝典 word之(2)利用文档导航
·Office 2010宝典 word之(1)利用文档导航
·微软:Silverlight在HTML5时代有竞争力
·LG TB200:不买你就输了!
本栏目推荐文章
·上传的进度条 实时反映上传情况
·Virtual Network Interfaces
·JRUN 4 问题解答手册
·J2EE运行环境性能优化艺术之三
·怎样在J2ME上实现记录管理存储
·将 TOC 从 XML 带到 DHTML地带
·ASP.NET2.0 WebRource,开发微调按钮控件
·提高Java代码可重用性的三个措施
·经典c程序100例==11--20
·基于asp.net的webmenu的数据操作5
·用PHP发送MIME邮件(五)
·[视频教程]Dreamweaver与ASP动态网页设计
Copyright © 2000-2010 www.Devdao.com All rights reserved | 沪ICP备05001343号 sitemap