如何修复从上游读取响应头时上游发送的头部太大的问题?
如何修复从上游读取响应头时上游发送的头部太大的问题?
我在我的日志中遇到了这个错误:
从上游读取响应头时,上游发送了太大的头部
我尝试在我的nginx.conf http块中添加以下内容,但没有起作用:
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
我还尝试在我的配置文件中添加以下内容,但找不到任何 location ~ .php$ {
所以我想知道如何解决这个错误?
将以下内容添加到一个手动创建的php块中会给我带来nginx:[emerg] unknown directive "location" in /etc/nginx/nginx.conf:6错误。
nginx报错“upstream sent too big header while reading response header from upstream”是nginx的一种通用错误提示,表示nginx对所接收到的内容不满意。
出现这个错误的原因可能有以下几种:
1. 上游服务器线程崩溃
2. 上游服务器返回了一个无效的头部
3. 标准错误输出(STDERR)中的通知/警告破坏了缓冲区,导致其和标准输出(STDOUT)一起关闭
解决这个问题可以通过以下方法:
1. 检查错误日志中错误信息的上方是否有其他日志行,如果有的话,是否是连续的日志行。例如:PHP message: PHP Notice: Undefined index:
。
可以从日志文件中找到类似如下循环的代码片段:
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 //过期cookie setcookie('bookmark', '', strtotime('2012-01-01 00:00:00')); //nginx将拒绝这个头部响应,因为超过了接受的时间范围 .... ?>
还有这个例子:
<?php header('Content-type: image/jpg'); ?> <?php //在此行的输出之前插入了一个空格 header('Content-length: ' . filesize('image.jpg')); echo file_get_contents('image.jpg'); // 错误!响应的长度现在比头部多1个字节! ?>
3. 验证或者让脚本记录,确保线程能够到达正确的终点而不是在完成之前退出。
问题的原因:在处理上游服务器的响应头时,发现响应头的大小超过了预设的限制。
解决方法:根据经验,以下参数通常可以解决"upstream sent too big header"问题。在http或server块中设置这些参数,而不是在location块中设置。
server {
...
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
另外,有时候Firefox的FirePHP插件会创建较大的响应头,可以尝试暂时禁用它。
有人问如何在更改参数之前找到实际的参数值。我有两台完全相同的机器,其中一台正常工作,另一台不正常。你的解决方法很好,但我想知道那些不起作用的值是多少。
有人表示感谢禁用FirePHP的提示,这对我来说是错误的原因。
成功了,非常感谢。在将Prestashop从Apache迁移到Nginx后出现了这个问题。