如何修复从上游读取响应头时出现的上游发送的头部过大错误?

17

我的日志中出现了以下错误:

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

我尝试添加了一些内容

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文件中添加内容,但是我无法找到任何location ~ .php$ {

所以我想知道如何解决这个错误?添加

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

尝试将手工制作的php块添加到我的代码中时,出现了nginx:[emerg]未知指令“location” /etc/nginx/nginx.conf:6错误。


你能发布你的整个配置文件吗?可能更相关的部分在conf.d子目录中。 - user1600649
可能是重复的问题:上游太大 - nginx + codeigniter - dnozay
请将下方的程序相关内容从英语翻译成中文。只返回翻译后的文本:类似:https://dev59.com/PFwZ5IYBdhLWcg3wIdV8 - trante
2个回答

31

通常这些参数可以解决“上游发送的标题过大”的问题,而且您不需要为它们设置巨大的值 :) 并将它们设置为http或server块,而不是location。

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

有时候Firefox的FirePHP会创建大的header,可以尝试暂时禁用它。


在更改参数之前,如何找到这些参数的实际值?我有两台机器,代码完全相同..一台可以运行,另一台不行...您的解决方案很好,但我想知道那些无法工作的值是什么! - Drmjo
感谢您提示我禁用 FirePHP。这就是我的错误原因。 - Felipe Balduino Cassar
工作了,非常感谢。这是在将Prestashop从Apache迁移到Nginx后发生的问题。 - Jaroslav Štreit

11

upstream sent too big header while reading response header from upstream是nginx通用的表达方式,表示"我不喜欢我看到的东西"

  1. 您的上游服务器线程崩溃了
  2. 上游服务器返回了一个无效头部
  3. 从标准错误输出(STDERR)返回的通知/警告破坏了缓冲区,同时也关闭了它和标准输出(STDOUT)

3: 查看上面消息之上的错误日志,是否存在伴随着该消息的日志行?例如,以下是来自我的日志文件的循环片段:

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

在之前的20个错误中的第3行,您可以看到缓冲区限制已达到,并且下一个线程写入了它。然后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:验证或记录脚本,确保您的线程到达正确的终点并在完成之前不退出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接