zoukankan      html  css  js  c++  java
  • nginx 解决400 bad request 的方法(转载)

    nginx的400错误比较难查找原因,因为此错误并不是每次都会出现的,另外,出现错误的时候,通常在浏览器和日志里看不到任何有关提示。

    经长时间观察和大量试验查明,此乃request header过大所引起,request过大,通常是由于cookie中写入了较大的值所引起。

    所幸在nginx中是有办法解决这个问题:

    在nginx.conf中,将client_header_buffer_size和large_client_header_buffers都调大,可缓解此问题。

    其中主要配置是client_header_buffer_size这一项,默认是1k,所以header小于1k的话是不会出现问题的。

    按我现在配置是:

    client_header_buffer_size 16k;
    large_client_header_buffers 4 64k;

    这个配置可接收16k以下的header,在浏览器中cookie的字节数上限会非常大,所以实在是不好去使用那最大值。

    最好的解决办法当然是不要往cookie里写入太多的东西,不过如果是一个很大的网站,那么在一个二级域名写入了顶级域名下的cookie似乎是不好控制的,这需要制定一个规范来控制顶级域名的cookie写入量才可以解决得了。

    这个可能也是nginx的一个bug,因为buffer这个词义上说为缓冲,也就是说,如果没取完的话,是会循环取直至取完的,但是nginx并没有进行循环的动作直接返回了400错误。nginx的下一个版本可能会修正这个问题。

    ---

    最近发现16k的buffer居然还是不够用,改成128k了,变态一点对nginx来说也不是很大问题,重要是人不能因为这种事情搞疯了

    ---

    有朋友发现nginx在后台接收到很大的header时也会出现400错误,如:

    2008/08/02 22:51:14 [error] 16613#0: *105 upstream sent too big header while reading response header from upstream, client: 。。。。。。。。。。。。。

    在nginx的wiki里找了一遍,没有找到合适的语句,wiki更新过慢?于是查了一遍源码,在ngx_http_proxy_module.c也没有找到合适的语句。

    不过在nginx 0.3.12版的更新里有这么一句话:

    *) Change: the "proxy_header_buffer_size" and

       "fastcgi_header_buffer_size" directives was renamed to the

       "proxy_buffer_size" and "fastcgi_buffer_size" directives.

    不清楚作者改名用意何在,不过,proxy_buffer_size之前的名字proxy_header_buffer_size倒是有点合适,如果有朋友老遇到后台接收时抛出400错误,可以增大这个参数一试。

    原文地址:http://bbs.phpchina.com/forum.php?mod=viewthread&tid=207086

  • 相关阅读:
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Linux下的iwpriv(iwlist、iwconfig)的简单应用
    OCX控件的注册卸载,以及判断是否注册
    .OCX、.dll文件注册命令Regsvr32的使用
  • 原文地址:https://www.cnblogs.com/balala/p/5697902.html
Copyright © 2011-2022 走看看