nginx 和 php-fpm 持续出现分段错误(代码 11)

nginx 和 php-fpm 持续出现分段错误(代码 11)

我正在运行 CentOS 6 64 位服务器,具有 1.2 GHz CPU 和 2.4 GB RAM。该服务器运行带有 APC 扩展的 nginx 和 php-fpm 以及 mysql。

几周前,服务器开始在 HTTP 请求中不断抛出 500 个错误;Google WMT 在抓取错误中每天报告大约 450 个服务器错误。如果您浏览该网站,大约每 3-4 页就会抛出一个错误。

php-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

我按照日志的建议将上述值增加到:

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

它确实降低了错误发生的频率,但效果并不显著。

经过进一步研究,我发现“无法分配内存”错误的原因之一可能是安装的 PHP 5.4 与 APC 3.1.9 不兼容,因此我继续将 APC 更新到版本 3.1.13,该版本报告与 PHP 5.4 兼容。这使得“无法分配内存”错误完全消失,但它仍然会抛出代码 11 分段错误。

我发现 pm.max_requests 的值可能太高,因此我将其降低至如下值:

pm.max_requests = 600

它再次降低了错误发生的频率,但效果并不显著。

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

其他可能有用的信息:我每天有大约 2000 名独立访客,但我的网站也受到大量垃圾邮件攻击。我已经在服务器前面设置了 Cloudflare 作为代理,从那时起垃圾邮件数量就显著减少了。我还使用 MaxCDN 来处理静态文件(例如脚本或图像),因此通常不会从 Web 服务器请求这些文件。

答案1

很可能是 php 包含的某些模块导致了段错误。您需要进行一些调试来找出导致错误的原因。下面是开始的好地方:

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

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

这可以让您大致了解导致此问题的原因。您可能需要升级/降级已安装的任何 PHP 模块。

相关内容