内部错误500阿帕奇,但没有在日志?

我得到500内部服务器错误时,我尝试使一个 HTTP POST 到我的应用程序中的特定地址。我已经查看了虚拟主机文件中指定的自定义日志目录中的服务器日志,但是错误没有显示在那里,因此调试一直是一件麻烦事。

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

383463 次浏览

请注意: 最初的海报并没有特别提到 PHP。所有以 php 为中心的答案都做出了与实际问题无关的大量假设。

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

这意味着错误几乎总是在于您的脚本。例如,你上传了一个 perl 脚本,但没有给它执行权限?或者,如果你在 windows 中编写脚本,然后将它上传到服务器,而没有转换行结束符,那么在 linux 环境中它可能已经损坏了,你会得到这个错误。

如果你忘了的话

print "content-type: text/html\r\n\r\n";

你会得到这个错误

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

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

查看默认错误日志(如上所述)的原因是,错误并不总是被提交到虚拟主机中定义的自定义错误日志中。

假设是 linux 而不一定是 perl

检查 php 错误日志,它可能是与 apache 错误日志分开的文件。

通过转到 phpinfo()并检查 error _ log 属性来找到它。 如果未设置,设置为: < a href = “ https://stackoverflow. com/a/12835262/445131”> https://stackoverflow.com/a/12835262/445131

也许你的 post _ max _ size 对于你想要发布的内容来说太小了,或者其他的 max 内存设置太低了。

检查所运行的 php 版本是否与代码库相匹配。例如,您的本地环境可能正在运行 php 5.4(并且运行良好) ,您可能正在安装了 php 5.3的新机器上测试代码。如果对 array ()使用5.4语法,比如[] ,那么就会得到上面描述的情况。

我刚刚遇到了这个问题,这是由于 mod _ authnz _ ldap 在我的。Htaccess 文件。绝对没有被记录,但我不断得到一个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)。

这是2013年的一个古老的回答,那时 PHP 还很新,安全性还不是问题:

在未来,像这样将错误转储到屏幕上是一种安全风险。你最好不要在任何生产环境下这样做。

为什么没有将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
    
  2. 以 root 用户身份编辑该文件:

    sudo vi /etc/php5/apache2/php.ini
    
  3. 在 php.ini 中找到这一行:

    display_errors = Off
    
  4. 将上面的行更改为:

    display_errors = On
    
  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
    
  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
    

    这传递给 PHP 的信息是,我们希望记录所有这些错误。警告,这将对性能造成很大的影响,所以您不希望在生产环境中启用此功能,因为日志记录需要工作,而工作需要时间,时间花费金钱。

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

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

    tail -f /var/log/apache2/error.log
    
  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
    

如果您的 内部服务器错误信息没有显示在日志文件中,那么您可能需要使用 重启 Apache 服务

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

尝试访问一个静态文件。如果这也不工作 从根目录“/”或“ c:”转到您的文件目录并检查它们是否包含”。Htaccess 」档案。

有一次我把一个文件放在“ c:”里,结果非常奇怪。

在我的例子中,是 httpd.conf 中的 ErrorLog 指令。只是在我放弃之后不小心注意到了。决定分享这个发现) 现在我知道在哪里可以找到500个错误了。

HttpProtocolOptions Unsafe添加到您的 apache 配置文件并重新启动 apache 服务器。

@ eric-leschinski 的回答是正确的。

但是,如果您的服务器 API 是 FPM/FastCGI (Centos 8的默认值或者您可以检查 use phpinfo ()函数) ,那么还有另一种情况

在这种情况下:

  1. 在 php 文件中运行 phpinfo();
  2. 寻找 Loaded Configuration File参数以查看 PHP 的配置文件位置。
  3. 编辑配置文件,如@eric-leschinski 的回答。
  4. 检查 Server API参数。 如果您的服务器只使用 apache 句柄 API-> 重新启动 apache。 如果服务器使用 php-fpm,则必须重新启动 php-fpm 服务

    Systemctl 重新启动 php-fpm

    检查 php-fpm 日志文件夹中的日志文件

请检查您的代码中是否禁用了错误报告。

在我的代码中有一个地方我禁用了它,所以我在它之后添加了调试代码:

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);