nginx大标题响应

“从上游读取响应报头时,上游发送的报头过大”

当我尝试从Facebook进行身份validation时,我总是收到这个消息。 我增加了我的缓冲区:

proxy_buffer_size 256k; proxy_buffers 8 256k; proxy_busy_buffers_size 512k; fastcgi_buffers 8 256k; fastcgi_buffer_size 128k; 

但似乎没有帮助。 任何想法为什么这可能发生?

nginx.conf文件:

 user www-data; worker_processes 1; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; # multi_accept on; } http { include /etc/nginx/mime.types; proxy_buffer_size 256k; proxy_buffers 8 256k; proxy_busy_buffers_size 512k; fastcgi_buffers 8 256k; fastcgi_buffer_size 128k; access_log /var/log/nginx/access.log; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; tcp_nodelay on; gzip on; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } 

在/ etc / nginx的/启用的站点 – /默认

 server { listen 80 default; server_name localhost; access_log /var/log/nginx/localhost.access.log; location / { root /var/www/nginx-default; index index.html index.htm; } location /doc { root /usr/share; autoindex on; allow 127.0.0.1; deny all; } location /images { root /usr/share; autoindex on; } } 

在codeigniter中我有同样的错误。 这适用于我:

http://forum.nginx.org/read.php?2,192785,196003#msg-196003

在.conf中

 location ~* \.php$ { fastcgi_pass 127.0.0.1:9001; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 16-sept-2012 parametros para evitar el 502 fastcgi_temp_file_write_size 10m; fastcgi_busy_buffers_size 512k; fastcgi_buffer_size 512k; fastcgi_buffers 16 512k; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_intercept_errors on; fastcgi_next_upstream error invalid_header timeout http_500; } 

今天早上我有同样的问题。 然而,增加缓冲区大小为我工作。 这是我使用的设置:

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

我没有看到你的配置中唯一的设置是

  proxy_temp_file_write_size 256k; 

另外,我为这个虚拟主机添加了这些值。 我认为这不重要,但可能值得尝试。

原来Codeigniter设置了它自己的最大尺寸。 我还没有想出如何限制,但改变nginx不会改变任何东西,不幸的是。 感谢所有帮助VBart和gsharma。

我们正在移动我们的生产环境,旧的工作没有问题,并且有相同的“上游在读取来自上游的响应标题时发送了太大的标题”问题。 这是一个Codeigniter 2.x应用程序。

就像@gsharma所说的,在用这个改变服务器配置之后,错误日志消失了。

  fastcgi_buffers 256 4k; fastcgi_buffer_size 8k; 

但是,仍然有一些问题:登录没有工作了。 问题出现在$ config ['sess_encrypt_cookie'] = TRUE;

当使用sess_encrypt_cookie时,Codeigniter会尝试使用mcrypt库,但如果不存在,则使用名为_xor_encode的方法。 好吧,我认为这个方法是越野车。

安装php-mcrypt之后,所有的工作都没有问题。

(对不起我的英语不好)

我得到这个错误,在一个800字节长的页面,4个头。 这是一个注销页面来删除cookie。 为了过期cookies,我把它们设置回我的生日。 这在nginx中不起作用,它们必须过期不到一个月才能通过验证来删除cookie。

我跑了一个检查一些不同的,但无效的头,并得到了相同的结果。 如果nginx不能验证它所引发的头文件:在从上游读取响应头的时候,上游发送了太大的头文件

2015:更多的经验信息: upstream sent too big header while reading response header from upstream是nginx的一般说法:“我不喜欢我所看到的”

  1. 您的上游服务器线程崩溃
  2. 上游服务器发回一个无效的头
  3. 从STDERR发回的通知/警告打破了缓冲区,它和STDOUT都关闭了

3:查看消息上面的错误日志,是否在消息前面记录了流? 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 

你可以在第三行(从之前的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:验证或创建一个脚本日志,以确保您的线程到达正确的终点,并在完成之前不退出。