用nginx和php-fpm连续分段错误(代码11)

我运行的是具有1.2 GHz CPU和2.4 GB RAM的CentOS 6 64位服务器。 服务器运行nginx和php-fpm与APC扩展和mysql。

几个星期前,服务器开始不断地在HTTP请求上抛出500个错误; Google WMT每天报告抓取错误中的每天450个服务器错误。 如果你正在浏览网站,每3-4页左右就会出现一个错误。

这是如何configurationphp-fpm:

pm = dynamic pm.max_children = 45 pm.start_servers = 15 pm.min_spare_servers = 5 pm.max_spare_servers = 15 pm.max_requests = 1000 

在检查我在php-fpm错误日志中发现的日志之后,发现这些是最常见的两个错误:

 ERROR: fork() failed: Cannot allocate memory (12) WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 30 total children WARNING: [pool www] child 27455 exited on signal 11 (SIGSEGV) after 8393.397161 seconds from start 

我遵循日志的build议,并增加了以上的值:

 pm = dynamic pm.max_children = 70 pm.start_servers = 25 pm.min_spare_servers = 15 pm.max_spare_servers = 25 pm.max_requests = 1000 

它减less了错误的频率,但并不显着。

在做了更多的研究之后,我发现“无法分配内存”错误的原因之一可能是安装的PHP 5.4和APC 3.1.9之间的不兼容,所以我继续更新APC到版本3.1.13,报告与PHP兼容5.4。 这使“不能分配内存”错误完全消失,但它仍然是抛出代码11分段错误。

我发现pm.max_requests的价值可能太高,所以我把它降低到这个:

 pm.max_requests = 600 

它再次降低了抛出错误的频率,但并不显着。

在阅读了更多的build议之后,我安装了Varnish作为Web服务器的前端。 这标志着错误的显着减less,但日志显示代码11段错误仍然每2-3小时左右抛出一次。 这意味着仍然有用户在尝试查看我的网站时遇到服务器错误。 我想知道是否有任何其他优化,我可以做我的networking服务器。

其他信息可能是有用的:我每天2000左右访问独特的访问者,但我也得到了我的网站上的高水平的垃圾邮件攻击。 我已经将Cloudflare设置为服务器前面的代理,并且自垃圾邮件程度显着下降。 我还将MaxCDN用于脚本或图像等静态文件,因此通常不会从Web服务器请求这些文件。

很可能有一些模块的PHP包括正在导致你的段错误。 你将需要做一些debugging来找出可能导致它的原因。 这是一个很好的开始:

打开核心文件: http : //aplawrence.com/Linux/limit_core_files.html

用GDB读取核心转储: https : //stackoverflow.com/questions/5115613/core-dump-file-analysis

这会给你一个可能导致它的一般概念。 您可能需要升级/降级已安装的任何PHP模块。