内部错误500 Apache,但日志中没有任何内容?

wco*_*ert 109 apache error-logging

当我尝试在我的应用程序中的特定地址进行HTTP POST时,我收到500个内部服务器错误.我查看了虚拟主机文件中指定的自定义日志目录中的服务器日志,但是错误没有显示在那里,所以调试这个问题一直很麻烦.

如何让Apache将内部500错误记录到错误日志中?

Eri*_*ski 133

为什么500内部服务器错误没有记录到您的apache错误日志中?

导致500内部服务器错误的错误来自PHP模块.默认情况下,PHP不会记录这些错误.原因是您希望Web请求的速度尽可能快,并且将错误记录到屏幕上是一种安全隐患,攻击者可以在屏幕上观察它们.

这些启用内部服务器错误记录的说明适用Ubuntu 12.10PHP 5.3.10Apache/2.2.22.

确保打开PHP日志记录:

  1. 找到你的php.ini文件:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
    Run Code Online (Sandbox Code Playgroud)
  2. 以root身份编辑该文件:

    sudo vi /etc/php5/apache2/php.ini
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在php.ini中找到这一行:

    display_errors = Off
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将上面的行更改为:

    display_errors = On
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在文件中向下,你会看到这个:

    ;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
    
    Run Code Online (Sandbox Code Playgroud)
  6. 分号是注释,表示行不生效.更改这些行,使它们看起来像这样:

    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
    
    Run Code Online (Sandbox Code Playgroud)

    与PHP通信的是我们要记录所有这些错误.警告,会有很大的性能损失,因此您不希望在生产中启用此功能,因为日志记录工作且工作需要时间,时间需要花钱.

  7. 重新启动PHP和Apache应该应用更改.

  8. 执行您的操作再次导致500内部服务器错误,并检查日志:

    vi /var/log/apache2/error.log
    
    Run Code Online (Sandbox Code Playgroud)
  9. 你应该在最后看到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, referer: 
    https://nuclearreactor.com/abouttoblowup
    
    Run Code Online (Sandbox Code Playgroud)

  • `display_errors`在**屏幕上打印错误**.`log_errors`在**日志文件中写入错误**. (38认同)
  • 这应该是这个问题的规范答案. (11认同)
  • @WanLiqun这是一个非常好的信息,但它只适用于PHP,在问题中甚至没有提到. (9认同)
  • 该答案以错误的建议开始,该错误的建议将错误转储到屏幕上。 (3认同)

小智 9

检查您的php错误日志,该日志可能是您的apache错误日志中的单独文件.

通过转到phpinfo()并检查error_log属性来查找它.如果没有设置.设置它:https://stackoverflow.com/a/12835262/445131

也许你的post_max_size对于你想要发布的内容来说太小了,或者其他一个最大内存设置太低了.

  • 问题是,*“我如何让 Apache 将内部 500 错误记录到错误日志中?”* 这可能应该是一个注释。 (2认同)

bma*_*pin 9

我刚碰到这个,这是由于我的.htaccess文件中的mod_authnz_ldap配置错误造成的.绝对没有记录任何东西,但我一直收到500错误.

如果遇到这个特定问题,可以像这样更改mod_authnz_ldap的日志级别:

LogLevel warn authnz_ldap_module:debug
Run Code Online (Sandbox Code Playgroud)

这将使用mod_authnz_ldap的日志级别的调试,但警告其他一切(https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel).


Dev*_*ris 8

请注意:原始发帖者并没有专门询问 PHP。所有以 php 为中心的答案都做出了与实际问题无关的大量假设。

与脚本错误日志相反,默认错误日志通常具有(更多)特定错误。通常会出现权限被拒绝甚至找不到解释器的情况。

这意味着错误几乎总是出在你的脚本上。例如,您上传了一个 perl 脚本但没有授予它执行权限?或者它可能在 Linux 环境中被损坏,如果您在 Windows 中编写脚本,然后将其上传到服务器而不转换行结尾,您将收到此错误。

在 Perl 中,如果你忘记了

print "content-type: text/html\r\n\r\n";
Run Code Online (Sandbox Code Playgroud)

你会得到这个错误

原因有很多。因此,请首先检查您的错误日志,然后提供更多信息。

默认错误日志通常位于/var/log/httpd/error_log或中/var/log/apache2/error.log

您查看默认错误日志(如上所述)的原因是因为错误并不总是发布到虚拟主机中定义的自定义错误日志中。

假设是 linux 而不是 perl

  • “请检查日志”如何成为“为什么我的日志为空”的可接受答案? (305认同)
  • 我向用户指出了默认错误日志而不是自定义错误日志。通常,当脚本由于某种原因失败时,错误会被路由到默认错误日志 (7认同)
  • 我检查了服务器ErrorLog,没有发现任何内容。 (6认同)
  • 对于 PHP,我在配置的 apache 错误日志中没有任何内容,但使用 `grep PHP /var/log/syslog` 发现了错误。可能是因为我在“/etc/php5/apache2/php.ini”中有“error_log = syslog”。 (3认同)
  • 你是对的,原来是php脚本的问题。未安装 PEAR 库。我把它安装在我的 VPS 上,一切都很好。谢谢大家! (2认同)

Álv*_*lez 7

如果您的内部服务器错误信息未显示在日志文件中,则可能需要重新启动Apache服务.

我发现Apache 2.4(至少在Windows平台上)倾向于顽固地拒绝刷新日志文件 - 相反,记录的数据在内存中保留了相当长的一段时间.从性能的角度来看这是一个好主意,但在开发时可能会让人感到困惑.