当我尝试在我的应用中向特定地址发出HTTP POST时,我收到了500个内部服务器错误。我查看了虚拟主机文件中指定的自定义日志目录中的服务器日志,但是错误没有显示在那里,所以调试这个问题一直很麻烦。
如何让Apache将内部500错误记录到错误日志中?
答案 0 :(得分:123)
为什么500内部服务器错误没有记录到您的apache错误日志中?
导致500内部服务器错误的错误来自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
以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内部服务器错误,并检查日志:
vi /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
答案 1 :(得分:9)
我刚碰到这个,这是由于我的.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)。
答案 2 :(得分:8)
检查您的php错误日志,该日志可能是您的apache错误日志中的单独文件。
通过转到phpinfo()
找到它并检查error_log属性。
如果没有设置。设置它:https://stackoverflow.com/a/12835262/445131
也许你的post_max_size对于你想要发布的内容来说太小了,或者其他一个最大内存设置太低了。
答案 3 :(得分:6)
如果内部服务器错误信息未显示在日志文件中,则可能需要重新启动Apache服务。
我发现Apache 2.4(至少在Windows平台上)倾向于顽固地拒绝刷新日志文件 - 相反,记录的数据在内存中保留了相当长的一段时间。从性能的角度来看这是一个好主意,但在开发时可能会让人感到困惑。
答案 4 :(得分:1)
请检查您是否在代码中的某处禁用了错误报告功能。
我的代码中有一个地方禁用了它,因此在它之后添加了调试代码:
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);
答案 5 :(得分:0)
检查您运行的php版本是否与您的代码库匹配。例如,您的本地环境可能正在运行php 5.4(运行正常),也许您正在安装了php 5.3的新机器上测试代码。如果你对数组()使用5.4语法,如[],那么你将得到你上面描述的情况。
答案 6 :(得分:0)
尝试访问静态文件。如果这不起作用那么 从根目录转到所有目录&#34; /&#34;或者&#34; c:\&#34;到你的文件目录,检查它们是否包含&#34; .htaccess&#34;文件。
我曾经在&#34; c:\&#34;中留下了一个文件。它有最奇怪的结果。
答案 7 :(得分:0)
在我的例子中,它是httpd.conf中的ErrorLog指令。在我放弃之后,只是意外地注意到了它。决定分享这个发现) 现在我知道在哪里可以找到500个错误。
答案 8 :(得分:0)
将HttpProtocolOptions Unsafe
添加到您的apache配置文件中,然后重新启动apache服务器。它显示了错误的详细信息。
答案 9 :(得分:0)
@ eric-leschinski的回答是正确的。
但是如果您的服务器API是FPM / FastCGI(在Centos 8上为默认值,或者您可以使用phpinfo()函数进行检查),则还有另一种情况
在这种情况下:
phpinfo()
; 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
答案 10 :(得分:-3)
与脚本错误日志相对的默认错误日志通常具有(更多)特定错误。通常会被拒绝权限,甚至是无法找到的翻译。
这意味着故障几乎总是在你的脚本上。例如,您上传了一个perl脚本,但没有给它执行权限?或者它可能在Linux环境中被破坏,如果您在Windows中编写脚本然后将其上传到服务器而不会转换行结尾,您将收到此错误。
如果你忘了,请在perl中找到print "content-type: text/html\r\n\r\n";
您将收到此错误
有很多原因。所以请先检查您的错误日志,然后提供更多信息。
默认错误日志通常位于/var/log/httpd/error_log
或/var/log/apache2/error.log
。
您查看默认错误日志(如上所示)的原因是因为错误并不总是发布到虚拟主机中定义的自定义错误日志中。
假设linux而不一定是perl