在项目中遇到一个场景,就是携带图片请求,图片大小200k左右不等。Nginx的日志中出现大量的408请求错误。于是针对此问题进行排查。

408错误的来源

通常产生408错误有两个地方的配置会导致:client_body_timeout和client_header_timeout。

这两个超时时间默认都是60s。

client_body_timeout:定义读取客户端请求正文的超时。超时是指相邻两次读操作之间的最大时间间隔,而不是整个请求正文完成传输的最大时间。 如果客户端在这段时间内没有传输任何数据,nginx将返回408 (Request Time-out)错误到客户端。

client_header_timeout:定义读取客户端请求头部的超时。如果客户端在这段时间内没有传送完整的头部到nginx, nginx将返回错误408 (Request Time-out)到客户端。

如果是上述超时时间配置问题,解决方案:调大对应的超时时间

大文件导致上传408错误

除了上面讲到情况,还有一种场景就是前端上传的文件或报文比较大,比如我们系统中经常要上传200k左右的图片信息。而Nginx中配置的client_body_buffer_size为128k。

上传比较小的图片,比小于128k的时候,没有什么问题,但当大于此值时,会出现频繁的408错误。于是将client_body_buffer_size值调整为1024k,问题解决了。

同时配置要改的还有client_max_body_size的大小。

client_max_body_size 10M;
client_body_buffer_size 10M;

其中client_max_body_size默认1M,表示客户端请求服务器最大允许大小,在“Content-Length”请求头中指定。如果请求的正文数据大于client_max_body_size,HTTP协议会报错413 Request Entity Too Large。就是说如果请求的正文大于client_max_body_size,一定是失败的。如果需要上传大文件,一定要修改该值。

Nginx分配给请求数据的Buffer大小,如果请求的数据小于client_body_buffer_size直接将数据先在内存中存储。如果请求的值大于client_body_buffer_size小于client_max_body_size,就会将数据先存储到临时文件中。文件目录为client_body_temp 指定的路径中,默认该路径值是/tmp/

配置的client_body_temp地址,一定让执行的Nginx的用户组有读写权限。否则,当传输的数据大于client_body_buffer_size,写进临时文件失败会报错。

如果追求效率,就设置 client_max_body_size client_body_buffer_size相同的值,这样就不会存储临时文件,直接存储在内存了。



Nginx包含图片请求频繁报408错误码插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2021/04/21/nginx-408-error-code/