当我尝试将 HTTP POST 发送到我的应用程序中的特定地址时,我收到 500 个内部服务器错误。我已经查看了虚拟主机文件中指定的自定义日志目录中的服务器日志,但是错误没有出现在那里,所以调试这一直是一件痛苦的事情。
如何使 Apache 将内部 500 错误记录到错误日志中?
当我尝试将 HTTP POST 发送到我的应用程序中的特定地址时,我收到 500 个内部服务器错误。我已经查看了虚拟主机文件中指定的自定义日志目录中的服务器日志,但是错误没有出现在那里,所以调试这一直是一件痛苦的事情。
如何使 Apache 将内部 500 错误记录到错误日志中?
为什么 500 Internal Server Errors 没有记录到您的 apache 错误日志中?
导致 500 Internal Server Error 的错误来自 PHP 模块。默认情况下,PHP 不会记录这些错误。原因是您希望 Web 请求在物理上尽可能快,并且将错误记录到攻击者可以观察到的屏幕上是一种安全隐患。
这些启用内部服务器错误记录的说明适用于Ubuntu 12.10
withPHP 5.3.10
和Apache/2.2.22
。
确保打开 PHP 日志记录:
找到您的 php.ini 文件:
el@apollo:~$ locate php.ini
/etc/php5/apache2/php.ini
以 root 身份编辑该文件:
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
分号是注释,表示行不生效。更改这些行,使它们看起来像这样:
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
检查您的 php 错误日志,它可能是与 apache 错误日志不同的文件。
通过转到phpinfo()
并检查 error_log 属性来找到它。如果没有设置。设置它:https ://stackoverflow.com/a/12835262/445131
也许您的 post_max_size 对于您要发布的内容来说太小,或者其他最大内存设置之一太低。
我刚刚遇到这个问题,这是由于我的 .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 服务。
我发现 Apache 2.4(至少在 Windows 平台上)倾向于固执地拒绝刷新日志文件——相反,记录的数据会在内存中保留很长一段时间。从性能的角度来看,这是一个好主意,但在开发时可能会令人困惑。
@eric-leschinski 的答案是正确的。
但是如果您的服务器 API 是 FPM/FastCGI(Centos 8 上的默认设置,或者您可以检查使用 phpinfo() 函数),还有另一种情况
在这种情况下:
phpinfo()
在 php 文件中运行;Loaded Configuration File
参数以查看您的 PHP 的配置文件在哪里。检查Server API
参数。如果您的服务器仅使用 apache 处理 API -> 重新启动 apache。如果你的服务器使用 php-fpm 你必须重启 php-fpm 服务
systemctl 重启 php-fpm
检查 php-fpm 日志文件夹中的日志文件。例如/var/log/php-fpm/www-error.log
请检查您是否在代码中的某处禁用了错误报告。
在我的代码中有一个地方我禁用了它,所以我在它后面添加了调试代码:
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);
请注意:原始海报并未专门询问 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
添加HttpProtocolOptions Unsafe
到您的 apache 配置文件并重新启动 apache 服务器。它显示错误详细信息。
在我的例子中,它是 httpd.conf 中的 ErrorLog 指令。只是在我放弃后偶然注意到它。决定分享发现)现在我知道在哪里可以找到 500 错误。
检查您正在运行的 php 版本是否与您的代码库匹配。例如,您的本地环境可能正在运行 php 5.4(并且一切正常),并且您可能正在安装了 php 5.3 的新机器上测试您的代码。如果您使用 5.4 语法,例如 [] for array(),那么您将遇到上述情况。
尝试访问静态文件。如果这也不起作用,则从根“/”或“c:\”转到文件目录的所有目录,并检查它们是否包含“.htaccess”文件。
我曾经在“c:\”中留下一个文件,结果最奇怪。