尝试对应用程序中的特定地址进行HTTP POST时,出现500个内部服务器错误。我已经查看了虚拟主机文件中指定的自定义日志目录中的服务器日志,但该错误未在此处显示,因此调试它一直很麻烦。
如何使Apache将内部500错误记录到错误日志中?
尝试对应用程序中的特定地址进行HTTP POST时,出现500个内部服务器错误。我已经查看了虚拟主机文件中指定的自定义日志目录中的服务器日志,但该错误未在此处显示,因此调试它一直很麻烦。
如何使Apache将内部500错误记录到错误日志中?
Answers:
请注意:原始海报不是专门询问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
grep PHP /var/log/syslog
。可能是因为我error_log = syslog
进去了/etc/php5/apache2/php.ini
。
为什么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
分号是注释,这意味着这些行不会生效。更改这些行,使其如下所示:
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, referer:
https://nuclearreactor.com/abouttoblowup
display_errors
在屏幕上打印错误。log_errors
将错误写入日志文件。
检查您的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 handle API->重新启动apache。如果您的服务器使用php-fpm,则必须重新启动php-fpm服务
systemctl重新启动php-fpm
检查php-fpm日志文件夹中的日志文件。例如/var/log/php-fpm/www-error.log
就我而言,它是httpd.conf中的ErrorLog指令。我放弃后就已经不小心注意到了。决定共享发现)现在,我知道在哪里可以找到500个错误。