从上游读取响应标头时如何修复上游发送的标头太大?

Posted

技术标签:

【中文标题】从上游读取响应标头时如何修复上游发送的标头太大?【英文标题】:how to fix upstream sent too big header while reading response header from upstream? 【发布时间】:2014-11-03 21:46:14 【问题描述】:

我的日志中有这个错误:

从上游读取响应标头时,上游发送了太大的标头

我尝试添加

proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;

到我的 nginx.conf http 块,但没有工作

我也试过添加

fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;

到我的 conf 文件,但我找不到任何 位置 ~ .php$

所以我想知道如何克服这个错误? 添加

fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;

手工制作的 php 块给了我 nginx: [emerg] unknown directive "location" in /etc/nginx/nginx.conf:6

【问题讨论】:

你能发布你的整个配置吗?可能更相关的位在 conf.d 子目录中。 Upstream too big - nginx + codeigniter的可能重复 类似:***.com/questions/31808400/… 【参考方案1】:

通常此参数修复“上游发送的标头太大”问题,您不需要为它们设置大值 :) 并将它们设置为 http 或服务器块,而不是位置。

server 
...
    fastcgi_buffers  16 16k;
    fastcgi_buffer_size  32k;

有时 FirePHP for Firefox 会创建大标题,请尝试暂时禁用它。

【讨论】:

如何在更改之前找到这些参数的实际值?我有 2 台机器相同的代码 .. 一台工作 一台不工作......您的解决方案运行良好,但我想知道哪些值不起作用! 感谢禁用 FirePHP 的提示。这是我的错误原因。 工作,非常感谢。 Prestashop 从 Apache 迁移到 Nginx 后发生。【参考方案2】:

upstream sent too big header while reading response header from upstream 是 nginx 表达“我不喜欢我所看到的”的通用方式

    您的上游服务器线程崩溃了 上游服务器发回了无效的标头 从 STDERR 发回的通知/警告破坏了它们的缓冲区,并且它和 STDOUT 都已关闭

3:查看消息上方的错误日志,它是否在消息之前记录了行? PHP message: PHP Notice: Undefined index: 来自循环我的日志文件的示例 sn-p:

2015/11/23 10:30:02 [error] 32451#0: *580927 FastCGI sent in stderr: "PHP message: PHP Notice:  Undefined index: Firstname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Lastname in /srv/www/classes/data_convert.php on line 1090
... // 20 lines of same
PHP message: PHP Notice:  Undefined index: Firstname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Lastname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:
2015/11/23 10:30:02 [error] 32451#0: *580927 FastCGI sent in stderr: "ta_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Firstname

您可以在第 3 行(从之前的 20 个错误中)看到缓冲区限制被击中、破坏,并且下一个线程在它上面写入。 Nginx 然后关闭连接并返回 502 给客户端。

2:记录每个请求发送的所有标头,检查它们并确保它们符合标准(nginx 不允许超过 24 小时的任何内容删除/过期 cookie,发送无效的内容长度,因为错误消息在内容计数...)

示例包括:

<?php
//expire cookie
setcookie ( 'bookmark', '', strtotime('2012-01-01 00:00:00') );
// nginx will refuse this header response, too far past to accept
....
?>

还有这个:

<?php
header('Content-type: image/jpg');
?>

<?php   //a space was injected into the output above this line
header('Content-length: ' . filesize('image.jpg') );
echo file_get_contents('image.jpg');
// error! the response is now 1-byte longer than header!!
?>

1:验证或制作脚本日志,以确保您的线程到达正确的终点并且在完成之前不会退出。

【讨论】:

以上是关于从上游读取响应标头时如何修复上游发送的标头太大?的主要内容,如果未能解决你的问题,请参考以下文章

Nginx Web 服务器错误 - 上游从上游读取响应标头时发送的标头太大

上游从上游、客户端(nginx、varnish)读取响应头时发送了太大的头

NGINX - 在标准错误中发送的 FastCGI:“主要脚本未知”,同时从上游读取响应标头

错误 28105#0:*1 FastCGI 在标准错误中发送:“主要脚本未知”,同时从上游读取响应标头

AWS Nginx“从上游读取响应标头时上游过早关闭连接”

错误:从上游 [uWSGI/Django/NGINX] 读取响应标头时,上游过早关闭连接