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


122

尝试对应用程序中的特定地址进行HTTP POST时,出现500个内部服务器错误。我已经查看了虚拟主机文件中指定的自定义日志目录中的服务器日志,但该错误未在此处显示,因此调试它一直很麻烦。

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


1
使用PHP与虚拟主机时,我遇到相同的问题。...没有错误(Apache2,Ubuntu)。最终丢失了PHP模块(mysql,json等)

1
在我们的服务器上,它正在将它们发送到访问日志(大概是因为从Apache的角度来看,它正在正常工作,并且只是从更深的一层(在我们的情况下为Passenger / Rails)传递它们。只是在这里放这个笔记,以防有人挠头。
汤姆·洪特,2016年

Answers:


-3

请注意:原始海报不是专门询问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


6
我检查了服务器ErrorLog,在此找不到任何内容。
wcolbert

1
您是正确的,原来是php脚本有问题。未安装PEAR库。我将其安装在VPS上,一切都很好。谢谢大家!
wcolbert

260
“请检查日志”如何成为“为什么我的日志为空”的可接受答案?
阿尔瓦罗·冈萨雷斯

4
我向用户指出了默认错误日志,而不是自定义错误日志。通常,当脚本由于某种原因失败时,错误会被路由到默认错误日志
DeveloperChris

1
使用PHP,在配置的apache错误日志中没有任何内容,但是通过找到了错误grep PHP /var/log/syslog。可能是因为我error_log = syslog进去了/etc/php5/apache2/php.ini
mivk

145

为什么500个内部服务器错误未记录到您的Apache错误日志中?

导致您的500 Internal Server Error的错误来自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. 以根用户身份编辑该文件:

    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 Internal Server错误的操作,然后检查日志:

    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, referer: 
    https://nuclearreactor.com/abouttoblowup
    

46
display_errors屏幕上打印错误。log_errors将错误写入日志文件
daVe

11
这应该是该问题的规范答案。
大卫

9
@WanLiqun这是一条非常不错的信息,但仅适用于PHP,问题中甚至没有提到。
阿尔瓦罗·冈萨雷斯

1
“导致您的500 Internal Server Error的错误来自PHP模块。默认情况下,PHP不会记录这些错误。” 谁提到PHP?在PHP中禁用Server 500日志记录是一种假设,并且通常是错误的假设。Apache将从故障模块(在本例中为php)中记录服务器500错误,但大多数情况下,它会转到/var/log/apache2/error.log(假定使用debian或类似版本)
DeveloperChris

4
该答案以错误的建议开始,该错误的建议将错误转储到屏幕上。
luqo33

11

检查您的php错误日志,该日志可能与apache错误日志是一个单独的文件。

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

也许您的post_max_size太小了,而不是您要发布的内容,或者其他最大内存设置之一太低。


1
问题是,“如何使Apache将内部500错误记录到错误日志中?” 这可能是一条评论。
jww

11

我刚遇到这个问题,这是由于我的.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)。


1
问题是,“如何使Apache将内部500错误记录到错误日志中?” 这可能是一条评论。
jww

好观察。我添加了有关记录这些错误的说明。
bmaupin

7

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

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


这是我在Linux上的正确答案。即使删除了原始的error.log(这是一个字符设备文件)并将其替换为touch 777 error.log,Apache也不会重新写入它。
2015年

2

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

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

在这种情况下:

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

    systemctl重新启动php-fpm

    检查php-fpm日志文件夹中的日志文件。例如/var/log/php-fpm/www-error.log


1

就我而言,它是httpd.conf中的ErrorLog指令。我放弃后就已经不小心注意到了。决定共享发现)现在,我知道在哪里可以找到500个错误。


能否请您在回答中提供更多详细信息
Yahya Hussein

我正在使用Magento(CMS-内容管理系统)用于Apache。使用Magento核心类的页面上出现500错误。我找不到在哪里可以看到错误消息。根据这里的一些答案,我试图在apache日志/ etc / httpd / logs / error_log中进行搜索。但是那里什么也没有。后来,我发现我的httpd.conf中有用于特定Web主机的一行,定义了日志路径:<VirtualHost。... ErrorLog / usr / www / log / error_log因此,我需要查看更具体的主机日志,而不是常见的Apache日志。
Eugene Lycenok '18

1

添加HttpProtocolOptions Unsafe到您的apache配置文件并重新启动apache服务器。它显示错误详细信息。


0

检查您运行的php版本是否与您的代码库匹配。例如,您的本地环境可能正在运行php 5.4(并且运行良好),并且可能正在安装了php 5.3的新计算机上测试代码。如果您对Array()使用5.4语法(例如[]),则会遇到上述情况。


问题是,“如何使Apache将内部500错误记录到错误日志中?” 这可能是一条评论。
jww

0

尝试访问静态文件。如果这也不起作用,则转到从根目录“ /”或“ c:\”到文件目录的所有目录,并检查它们是否包含“ .htaccess”文件。

我曾经在“ c:\”中留下一个文件,它的结果最奇怪。


1
问题是,“如何使Apache将内部500错误记录到错误日志中?”
jww

0

请检查您是否在代码中的某处禁用了错误报告功能。

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

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.