上游太大 - nginx + codeigniter

Posted

技术标签:

【中文标题】上游太大 - nginx + codeigniter【英文标题】:Upstream too big - nginx + codeigniter 【发布时间】:2012-12-03 09:09:36 【问题描述】:

我从 nginx 收到此错误,但似乎无法弄清楚!我正在使用 codeigniter,并且正在使用数据库进行会话。所以我想知道标题怎么会太大。无论如何要检查标题是什么?或者可能看看我能做些什么来解决这个错误?

如果您需要我提供任何 conf 文件或其他任何内容,请告诉我,我会根据您的要求进行更新

2012/12/15 11:51:39 [error] 2007#0: *5778 upstream sent too big header while reading response header from upstream, client: 24.63.77.149, server: jdobres.xxxx.com, request: "POST /main/login HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "jdobres.xxxxx.com", referrer: "http://jdobres.xxxx.com/"

更新

我在conf中添加了以下内容:

proxy_buffer_size   512k;
proxy_buffers   4 512k;
proxy_busy_buffers_size   512k;

现在我仍然得到以下信息:

2012/12/16 12:40:27 [error] 31235#0: *929 upstream sent too big header while reading response header from upstream, client: 24.63.77.149, server: jdobres.xxxx.com, request: "POST /main/login HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "jdobres.xxxx.com", referrer: "http://jdobres.xxxx.com/"

【问题讨论】:

upstream sent too big header while reading response header from upstream 的可能重复项 ***.com/questions/31808400/… 嘿,另一个可能的问题可能是您尚未重新启动 php5-fpm 服务。只是为了其他人作为一种可能的解决方案。 【参考方案1】:

将此添加到 nginx.conf 文件的 http ,该文件通常位于 /etc/nginx/nginx.conf

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

然后将其添加到您的 php location 块中,这将位于您的 vhost 文件中查找以 location ~ .php$

开头的块
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;

【讨论】:

两者有什么区别? 有关 HttpProxyModule 模块的更多信息,请访问wiki.nginx.org/HttpProxyModule,有关 HttpFastcgiModule 的信息,请访问wiki.nginx.org/HttpFastcgiModule fastcgi_buffers 工作。我能够将它放在服务器下并且它在那里工作。 解决了我的问题。谢谢。 您能解释一下为什么将fastcgi_buffer_size 设置为128k 而不是其他数字吗?我如何在我的服务器中测量它以使 nginx 正常工作?【参考方案2】:

修改您的 nginx 配置并更改/设置以下指令:

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

【讨论】:

我会把这个放在哪里?在 http 部分或服务器部分内部?我假设 http? /etc/nginx/nginx.conf。 http块 太棒了。我现在正在测试它。为了以防万一,我将所有 3 增加到 512k。我正在让几个人测试它是否有效。 =D 也许你有循环重定向? 在发生故障之前,我的访问日志中没有看到任何重定向 =/【参考方案3】:

我已经证明,当传输无效标头时也会发送此信息。 HTTP 标头的无效字符或格式、cookie 过期设置一个多月等都会导致:upstream 在从上游读取响应标头时发送了太大的标头

【讨论】:

我遇到了 PHP 文件中的错误(无法写入错误日志)导致此 nginx 错误消息的情况,包括。 “错误网关”结果。【参考方案4】:

使用 nginx + fcgiwrap + 请求太长

我遇到了同样的问题,因为我使用的是 nginx + fcgiwrap 配置:

location ~ ^.*\.cgi$ 
    fastcgi_pass  unix:/var/run/fcgiwrap.sock;
    fastcgi_index index.cgi;
    fastcgi_param SCRIPT_FILENAME /opt/nginx/bugzilla/$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
    # attachments can be huge
    client_max_body_size 0;
    client_body_in_file_only clean;
    # this is where requests body are saved
    client_body_temp_path /opt/nginx/bugzilla/data/request_body 1 2;

并且客户端正在使用大约 6000 个字符的 URL 进行请求(bugzilla 请求)。

调试中...

location ~ ^.*\.cgi$ 
    error_log /var/log/nginx/bugzilla.log debug;
    # ...

这是我在日志中得到的:

2015/03/18 10:24:40 [debug] 4625#0: *2 upstream split a header line in FastCGI records
2015/03/18 10:24:40 [error] 4625#0: *2 upstream sent too big header while reading response header from upstream, client: 10....

我可以用“414 request-uri too large”代替“502 bad gateway”吗?

是的,你可以! 我之前在阅读How to set the allowed url length for a nginx request (error code: 414, uri too large),因为我认为“嘿,网址太长了”,但我得到的是502,而不是414

large_client_header_buffers

尝试#1:

# this goes in http or server block... so outside the location block
large_client_header_buffers 4 8k;

这失败了,我的 URL 是 6000 个字符

large_client_header_buffers 4 4k;

现在我不再看到502 Bad Gateway,而是看到414 Request-URI Too Large

"上游拆分 FastCGI 记录中的标题行"

做了一些研究并在互联网上的某个地方找到了:

http://forum.nginx.org/read.php?2,4704,4704 https://www.ruby-forum.com/topic/4422529 http://mailman.nginx.org/pipermail/nginx/2009-August/014709.html http://mailman.nginx.org/pipermail/nginx/2009-August/014716.html

这对我来说已经足够了:

location ~ ^.*\.cgi$ 
    # holds request bigger than 4k but < 8k
    fastcgi_buffer_size 8k;
    # getconf PAGESIZE is 4k for me...
    fastcgi_buffers 16 4k;
    # ...

【讨论】:

【参考方案5】:

我过去遇到过这个问题(不使用 codeigniter,但每当响应包含大量标头数据时就会发生)并且习惯于按照这里的建议调整缓冲区,但最近我再次被这个问题和缓冲区所困扰显然没问题。

原来这是我在这个特定项目中使用的 spdy 的错误,并通过启用 spdy 标头压缩来解决,如下所示:

spdy_headers_comp 6;

【讨论】:

【参考方案6】:
问题:上游发送的标头太大,而 使用 Magento 2 从上游 Nginx 读取响应标头
解决方案:将下面给出的设置替换为 /nginx.conf.sample 文件
fastcgi_buffer_size 4k;

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

【讨论】:

请阅读How do I write a good answer?

以上是关于上游太大 - nginx + codeigniter的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 nginx “上游发送的标头太大”错误?

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

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

502 Bad Gateway error - 上游从上游读取响应标头时发送的标头太大

NGINX:从上游读取响应头时上游超时(110:连接超时)

Nginx上游过早关闭连接,同时从上游读取响应标头,用于大型请求