Laravel,PHP 7.3 nginx 502上游过早关闭的FastCGI stdout

时间:2019-03-20 11:56:53

标签: php laravel nginx

我在nginx后面有一个laravel应用程序,最近将php从7.1版本更新到7.3(docker image 7.1-fpm-alpine到7.3-fpm-alpine)。

我使用具有render()函数的异常来输出错误页面。 Laravel记录异常消息并完成堆栈跟踪。

自从更新到php 7.3以来,nginx显示它的默认502错误页面并记录[error] 11#11: *61 upstream prematurely closed FastCGI stdout while reading response header from upstream, client: [...]。 nginx中的stacktrace在2048个字节后被截断。

serverfault问题"Nginx/PHP-FPM long log lines get truncated"建议nginx仅处理不超过2048个字节的错误。

在PHP 7.1中,堆栈跟踪已被截断。

我是对的,问题是PHP现在记录了完整的堆栈跟踪,而不是将其截断了?

有没有一种方法可以截断PHP中的日志输出以返回到PHP 7.1的行为?

2 个答案:

答案 0 :(得分:2)

默认情况下,PHP 7.3的功能应与以前的版本相同(它将截断1024个字符),但是有new configuration to allow more characters

  

log_limit整数   记录行的日志限制,允许记录长度超过1024个字符的消息而无需换行。默认值:1024。自PHP 7.3.0起可用。


在使用官方Docker PHP 7.3容器时,我遇到了这个问题,该容器专门覆盖了Dockerfile中的默认值:

echo 'log_limit = 8192';

可以通过覆盖log_limit进行修复,使其不超过nginx的2048限制:

[global]
log_limit = 1024

答案 1 :(得分:0)

我的应用程序使用errorlog日志驱动程序,但遇到了同样的问题。在Laravel中,我通过以下方式修改了app/Exceptions/Handler.php(实际上,这很受您的问题启发):

public function report(Exception $exception)
{
    $message = get_class($exception) . ": {$exception->getMessage()}. Trace:\n{$exception->getTraceAsString()}";
    error_log(substr($message, 0, 2048));
}

substr()部分起作用了。不过,我仍然必须开发一个更好,更通用的解决方案,因为这只是快速的n-dirty解决方案。