1、问题背景:
前端需要进行图片上传,在一次版本优化后,根据客户要求取消了图片压缩,导致上传接口请求header徒增,nginx报错信息如下:
[warn] 60937#0: *34319 an upstream response is buffered to a temporary file /dev/shm/proxy/0/40/0000000400 while reading upstream,
2、导致的问题原因:
后台nginx配置如下:
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
由于header限制配置为32K,超过这个大小会进行拦截,导致nginx转发报错。
3、问题解决:
调整nginx配置
client_header_buffer_size 256k;
large_client_header_buffers 4 256k;
重新加载配置
./sbin/nginx -s reload
4、配置详解
通用的 HTTP 请求头相关的配置主要也是大小、超时时间等等。它们都可以配置在 http、server 下面。
client_header_buffer_size
用于设置读取客户端请求头部的缓冲容量。
client_header_buffer_size size;
默认值是 1k ,对于大多数请求,1K的缓冲足矣。但如果请求中含有的cookie很长,或者请求来自WAP的客户端,可能请求头不能放在1K的缓冲中。 如果从请求行,或者某个请求头开始不能完整的放在这块空间中,那么 Nginx 将按照 large_client_header_buffers 指令的配置分配更多更大的缓冲来存放。
这里和请求体不同的是,请求体会往文件里放,但请求头不会,不够了再根据其它配置申请更大的内存。毕竟请求头的内容再大也大不到像需要上传文件的请求体一样。最终它的配置其实不会导致什么影响,因为最终如果不够了它会根据 large_client_header_buffers 的配置进行申请分配,因此,我们紧接着就看看 large_client_header_buffers 的配置。
large_client_header_buffers
这个配置是设置读取客户端请求超大请求的缓冲最大 number(数量) 和每块缓冲的 size(容量) 。
large_client_header_buffers number size;
它的默认值是 4 8k 。条件包括这么几点:
HTTP 请求行的长度不能超过一块缓冲的容量,否则nginx返回错误414 (Request-URI Too Large)到客户端。
每个请求头的长度也不能超过一块缓冲的容量,否则nginx返回错误400 (Bad Request)到客户端。
(请求行+请求头) 的大小不能超过 32k(4 * 8k) 。