【问题标题】:Laravel, PHP 7.3 nginx 502 upstream prematurely closed FastCGI stdoutLaravel,PHP 7.3 nginx 502 上游过早关闭 FastCGI 标准输出
【发布时间】:2019-08-11 02:45:35
【问题描述】:

我在 nginx 后面有一个 laravel 应用程序,最近将 php 从版本 7.1 更新到 7.3(docker 映像 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 的行为?

【问题讨论】:

    标签: php laravel nginx


    【解决方案1】:

    我的应用程序使用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() 部分是关键所在。不过,我仍然需要开发一个更好、更通用的解决方案,因为这只是一个快速的解决方案。

    【讨论】:

    • 似乎是一个很好的解决方法,感谢您的回答。如果一段时间内没有更好的解决方案,我会将其标记为已接受。
    • 如果您找到了更好的解决方案,如果您能更新您的答案,那就太好了。
    【解决方案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
    

    【讨论】:

    • this answer 的相关位:“如果你想要日志行超过 2048 字节,你需要重新编译 Nginx。” 所以在 Docker 环境中通常不可能修改此限制,因此非常需要根据您的答案覆盖日志限制。
    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2013-04-21
    • 2022-11-27
    • 2019-04-04
    • 2015-12-04
    • 2015-02-08
    • 2018-06-11
    相关资源
    最近更新 更多