• 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

  • 相关阅读:
    004.Jquery库的用法
    update 死锁问题
    Nginx负载均衡模式
    微信公众号开启服务器配置 JAVA
    mybatis plus + AOP 多数据源自动切换
    mybatis plus 快速上手
    mybits 笔记
    java 异步
    node 垃圾回收机制
    常用正则
  • 原文地址:https://www.cnblogs.com/balala/p/5697902.html
Copyright © 2020-2023  润新知