内部错误 500 Apache,但日志中没有任何内容?
Posted
技术标签:
【中文标题】内部错误 500 Apache,但日志中没有任何内容?【英文标题】:Internal Error 500 Apache, but nothing in the logs? 【发布时间】:2011-06-11 12:12:44 【问题描述】:当我尝试将 HTTP POST 发送到我的应用程序中的特定地址时,我收到 500 个内部服务器错误。我查看了虚拟主机文件中指定的自定义日志目录中的服务器日志,但错误没有出现在那里,所以调试这件事很麻烦。
如何让 Apache 将内部 500 错误记录到错误日志中?
【问题讨论】:
我在使用 php 和虚拟主机时遇到了同样的问题......没有错误(Apache2,Ubuntu)。最终缺少 PHP 模块(mysql、json 等) 对我们来说,它会将它们发送到访问日志(大概是因为从 Apache 的角度来看,它工作正常,只是从更深的层传递它们——在我们的例子中,Passenger/导轨)。只是把这张纸条放在这里,以防有人摸不着头脑。 【参考方案1】:为什么 500 内部服务器错误没有记录到您的 apache 错误日志中?
导致 500 Internal Server Error 的错误来自 PHP 模块。默认情况下,PHP 不会记录这些错误。原因是您希望 Web 请求在物理上尽可能快,并且将错误记录到攻击者可以观察到的屏幕上存在安全隐患。
这些启用内部服务器错误记录的说明适用于 Ubuntu 12.10
和 PHP 5.3.10
和 Apache/2.2.22
。
确保打开 PHP 日志记录:
找到您的 php.ini 文件:
el@apollo:~$ locate php.ini
/etc/php5/apache2/php.ini
以根用户身份编辑该文件:
sudo vi /etc/php5/apache2/php.ini
在 php.ini 中找到这一行:
display_errors = Off
将上面的行改为:
display_errors = On
在文件的下方,您会看到:
;display_startup_errors
; Default Value: Off
; Development Value: On
; Production Value: Off
;error_reporting
; Default Value: E_ALL & ~E_NOTICE
; Development Value: E_ALL | E_STRICT
; Production Value: E_ALL & ~E_DEPRECATED
分号是cmets,表示行不生效。更改这些行,使它们看起来像这样:
display_startup_errors = On
; Default Value: Off
; Development Value: On
; Production Value: Off
error_reporting = E_ALL
; Default Value: E_ALL & ~E_NOTICE
; Development Value: E_ALL | E_STRICT
; Production Value: E_ALL & ~E_DEPRECATED
这与 PHP 沟通的是我们想要记录所有这些错误。警告,性能会受到很大影响,因此您不希望在生产环境中启用此功能,因为日志记录需要工作,工作需要时间,时间成本。
重新启动 PHP 和 Apache 应该会应用更改。
再次执行导致 500 Internal Server 错误的操作,并检查日志:
tail -f /var/log/apache2/error.log
您应该会在最后看到 500 错误,如下所示:
[Wed Dec 11 01:00:40 2013] [error] [client 192.168.11.11] PHP Fatal error:
Call to undefined function Foobar\\byob\\penguin\\alert() in /yourproject/
your_src/symfony/Controller/MessedUpController.php on line 249
【讨论】:
display_errors
在屏幕上打印错误。 log_errors
在日志文件中写入错误。
这应该是这个问题的规范答案。
@WanLiqun 这是一个非常好的信息,但它只适用于 PHP,问题中甚至没有提到。
"导致 500 内部服务器错误的错误来自 PHP 模块。默认情况下,PHP 不会记录这些错误。"谁提到了 PHP?在 PHP 中禁用 Server 500 日志记录是一种假设,而且通常是错误的假设。 Apache 将从错误模块(在本例中为 php)记录服务器 500 错误,但大多数情况下它会转到 /var/log/apache2/error.log(假设 debian 或类似)
这个答案开始于一个糟糕的建议,将错误转储到屏幕上。【参考方案2】:
请检查您是否在代码中的某处禁用了错误报告。
在我的代码中有一个地方我禁用了它,所以我在它后面添加了调试代码:
require_once("inc/req.php"); <-- Error reporting is disabled here
// overwrite it
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
【讨论】:
【参考方案3】:@eric-leschinski 的答案是正确的。
但是如果您的服务器 API 是 FPM/FastCGI(Centos 8 上的默认设置,或者您可以检查使用 phpinfo() 函数),还有另一种情况
在这种情况下:
-
在 php 文件中运行
phpinfo()
;
寻找 Loaded Configuration File
参数以查看 PHP 的配置文件在哪里。
像@eric-leschinski 的回答一样编辑配置文件。
检查Server API
参数。
如果您的服务器仅使用 apache 处理 API -> 重新启动 apache。
如果你的服务器使用 php-fpm 你必须重启 php-fpm 服务
systemctl 重启 php-fpm
检查 php-fpm 日志文件夹中的日志文件。例如/var/log/php-fpm/www-error.log
【讨论】:
【参考方案4】:请注意:原始发帖人并没有专门询问 PHP。所有以 php 为中心的答案都做出了与实际问题无关的大假设。
与脚本错误日志相比,默认错误日志通常具有(更多)特定错误。通常会被拒绝权限,甚至找不到解释器。
这意味着错误几乎总是出在您的脚本上。例如,您上传了一个 perl 脚本但没有授予它执行权限?或者如果您在 Windows 中编写脚本然后将其上传到服务器而不转换行尾,则它可能在 linux 环境中损坏。您将收到此错误。
如果你忘记了,在 perl 中
print "content-type: text/html\r\n\r\n";
你会得到这个错误
有很多原因。所以请先检查您的错误日志,然后再提供更多信息。
默认错误日志通常在/var/log/httpd/error_log
或/var/log/apache2/error.log
。
查看默认错误日志(如上所示)的原因是,错误并不总是按照虚拟主机中的定义发布到自定义错误日志中。
假设是 linux 而不一定是 perl
【讨论】:
我查看了服务器的ErrorLog,没有任何发现。 你是对的,原来是php脚本的问题。 PEAR 库未安装。我将它安装在我的 VPS 上,一切都很好。谢谢大家! “请检查日志”如何成为“为什么我的日志为空”的公认答案? 我将用户指向默认错误日志而不是自定义错误日志。通常,当脚本由于某种原因失败时,错误会被路由到默认错误日志 使用 PHP,我在配置的 apache 错误日志中没有任何内容,但发现grep PHP /var/log/syslog
的错误。可能是因为我在/etc/php5/apache2/php.ini
中有error_log = syslog
。【参考方案5】:
将HttpProtocolOptions Unsafe
添加到您的 apache 配置文件并重新启动 apache 服务器。它显示错误详细信息。
【讨论】:
【参考方案6】:我刚刚遇到这个问题,这是由于我的 .htaccess 文件中的 mod_authnz_ldap 配置错误。绝对没有任何记录,但我一直收到 500 错误。
如果您遇到此特定问题,您可以像这样更改 mod_authnz_ldap 的日志级别:
LogLevel warn authnz_ldap_module:debug
这将对 mod_authnz_ldap 使用调试日志级别,但对其他所有内容发出警告 (https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel)。
【讨论】:
问题是,“如何使 Apache 将内部 500 错误记录到错误日志中?” 这应该是一个注释。 观察力不错。我添加了记录这些错误的说明。【参考方案7】:在我的例子中,它是 httpd.conf 中的 ErrorLog 指令。只是在我放弃后偶然注意到它。决定分享这个发现) 现在我知道在哪里可以找到 500 错误。
【讨论】:
您能否在回答中提供更多详细信息 我正在为 Apache 使用 Magento(CMS - 内容管理系统)。使用 Magento 核心类在我的页面上出现错误 500。我找不到可以看到错误消息的位置。根据这里的一些答案,我尝试在 apache 日志 /etc/httpd/logs/error_log 中搜索。但是那里什么都没有。后来我发现我的 httpd.conf 中有一行用于该特定的 Web 主机,定义了日志路径:尝试访问静态文件。如果这也不起作用,那么 转到从根“/”或“c:\”到文件目录的所有目录,并检查它们是否包含“.htaccess”文件。
我曾经在“c:\”中留下一个文件,结果最奇怪。
【讨论】:
问题是,“如何让 Apache 将内部 500 错误记录到错误日志中?”【参考方案9】:如果您的Internal Server Error信息未显示在日志文件中,您可能需要重新启动 Apache 服务。
我发现 Apache 2.4(至少在 Windows 平台上)倾向于固执地拒绝刷新日志文件——相反,记录的数据会在内存中保留很长一段时间。从性能的角度来看,这是一个好主意,但在开发时可能会令人困惑。
【讨论】:
这是我在 Linux 上的正确答案。即使删除了原始的 error.log(这是一个字符设备文件)并用 touch 777 error.log 替换它,Apache 也不会写入它,直到重新启动。【参考方案10】:检查您的 php 错误日志,它可能是与 apache 错误日志不同的文件。
前往phpinfo()
找到它并检查error_log 属性。
如果没有设置。设置它:https://***.com/a/12835262/445131
也许您的 post_max_size 对于您要发布的内容来说太小,或者其他最大内存设置之一太低。
【讨论】:
问题是,“如何使 Apache 将内部 500 错误记录到错误日志中?” 这应该是一个注释。【参考方案11】:检查您正在运行的 php 版本是否与您的代码库匹配。例如,您的本地环境可能正在运行 php 5.4(并且一切正常),并且您可能正在安装了 php 5.3 的新机器上测试您的代码。如果您使用 5.4 语法,例如 [] for array(),那么您将遇到上述情况。
【讨论】:
问题是,“如何使 Apache 将内部 500 错误记录到错误日志中?” 这应该是一个注释。以上是关于内部错误 500 Apache,但日志中没有任何内容?的主要内容,如果未能解决你的问题,请参考以下文章