我正在运行一个 VPS,它使用 Linux CentOs 6,内存为 4 GB,硬盘为 10 GB,还有 2 个虚拟 CPU Intel(R) Xeon(R)CPU L5640 @ 2.27GHz。正如我的主机所说,每个虚拟 CPU 必须至少是 0.5 个物理 CPU。
在一天中的某些时间,当流量较大时,尝试访问我的 php 脚本时我会间歇性地收到“500 内部服务器错误”。
我激活了 apache 的调试级别日志记录,以及使用 E_ALL 的 PHP 日志记录,但是在任何日志中都找不到对错误 500 的引用(我检查了正确的日志!)。
我在路径脚本中没有任何 .htaccess 文件。奇怪的是错误从脚本中的第一个 php 行开始(先前的 html 显示正确,但在第一行 php 脚本发送 500 错误)。
CPU 负载始终良好(最大 0.15 0.08 0.01)并且 RAM 接近 95%,但是一个月内仅交换过 2 次,大小为 2-5 MB。
Apache 使用以下值与 prefork 协同工作:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 280
MaxClients 280
MaxRequestsPerChild 4000
</IfModule>
一切工作正常,在安静的时候我没有收到任何错误,但是当流量上升(每小时 6-9000 次访问)时我开始收到错误。
我可以通过增加资源来解决此问题吗?(我可以将 RAM 升级到 16 GB)。
它可以依赖于达到 MaxClients 数(但是 apache 必须将其写入日志,对吗?)?
如果我将 RAM 升级到 6 或 8 GB,我必须用它来计算 MaxClients 值吗?
MaxClients = Total RAM dedicated to the web server / Max child process size
最大子进程大小约为20M。
问题还会出在哪里?
提前致谢
以下是有关错误日志的 php.ini 部分
error_reporting = E_ALL | E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = Off
error_log = /var/log/php_errors.log
未提及的所有内容都会被评论。
答案1
当您在 PHP 中遇到 500 错误时,首先要做的就是检查 PHP 错误日志;如果 apache 没有报告 500 错误,那么它就是由 PHP 引起的。
要检查是否达到资源限制,请启用并监视 apache服务器状态。
答案2
问题的原因如下:
Max Requests Per Child: 4000
更改MaxRequestsPerChild
为较小的值,尝试从 70 开始,所有间歇性的 500 内部服务器错误将消失。