一.故障现象
公司的业务系统访问提示报414 Request-URI Too Large
二.故障原因排查
出现问题的服务是通过阿里云的ACK的kubernnetes集群ingress控制器转发的,使用的镜像是aliyun-ingress-controller:v0.30.0.1,ingress-controller底层是nginx,通过抓包分析定位414返回码为ingress-controller返回。
通过网上查找Nginx 414 Request-URI Too Large报错解决方法,思路如下:
1.原因:当请求头过大时,超过large_client_header_buffer时,nginx可能返回"Request URI too large" (414)或者"Bad-request"(400)错误,请求投中最长的一行也要小于large_client_header_buffer,当不是Request line的最长行大于一个buffer(128k)时,会返回"Bad-request"(400)错误
2.解决方法:在nginx.conf的http段中加入以下参数:
client_header_buffer_size 512k;large_client_header_buffers 4 512k;client_max_body_size 100m;
三.最终解决办法
尝试配置client_header_buffer_size,large_client_header_buffers,client_max_body_size 100m;到nginx-ingress-controller的configmap,configmap的名称是nginx-configuration,命名空间在kube-system(根据安装的ingress控制器所在的命名空间不同而不同)
client_header_buffer_size 和large_client_header_buffers必须配置到nginx-ingress-controller的configmap里面,进而注入到nginx.conf里面的http配置段覆盖默认值
默认值如下:
client_header_buffer_size 1k;client_header_timeout 60s;large_client_header_buffers4 8k;client_body_buffer_size 8k;client_body_timeout 60s;
client_header_buffer_size 和large_client_header_buffers配置到nginx-ingress-controller的configmap里面时,下划线必须改成中划线,即为client-header-buffer-size、large-client-header-buffers。
在阿里云图形化界面配置如下
也可以通过命令行编辑nginx-configuration添加
kubectl edit cm nginx-configuration -n kube-system