您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发

【原】前端上传附件失败nginx出现408错误

不忘初心 不忘初心 2021-11-30 围观() 评论() 点赞() JAVA开发

简介:前端在上传附件的时候一直报错,但是查看后端压根就没有请求进来,在本地调试的时候就没有这个错误,代码没有不同,唯一不同的就是外网用的是正式域名,多走了一道nginx解析,跑去一看,还真的是nginx出了问题,在nginx的log中看到这个出错的请求对应的状态码是408。

前端在上传附件的时候一直报错,但是查看后端压根就没有请求进来,在本地调试的时候就没有这个错误,代码没有不同,唯一不同的就是外网用的是正式域名,多走了一道nginx解析,跑去一看,还真的是nginx出了问题,在nginx的log中看到这个出错的请求对应的状态码是408

前端上传附件失败nginx出现408错误

在看到这个错误之后,又多测试了几次,发现上传1M以内的文件是不会报错的,超过1M的文件就上传不了,而这个出错的文件就是一张1.1M的图片,此时已经能看出问题就是出在这里了,nginx在传输数据的时候,对数据的体积大小默认是1M,所以我传了超过1M的文件就会一直失败

查阅nginx官方资料之后发现,nginx有几个和本次错误相关的参数:

client_max_body_size

客户端请求服务器最大允许大小,默认大小为1M,如果超过了1M的文件,上传时会报错413 Request Entity Too Large。

client_body_buffer_size

nginx分配给请求数据的buffer大小,默认大小为机器上的两个内存页,如果你的机器是x86的,那么大小就是8K,如果你的机器是x64的,那么大小就是16K,缓冲区大家都能明白是为了加快响应速度的,没超过这个大小的可以放在内存中,一旦超过了这个buffer的大小之后,那么就要进行磁盘读写了。

client_header_timeout

定义读取客户端请求请求头的超时,默认60s,如果客户端未在此时间内传输整个请求头,则请求将终止,并显示 408(请求超时)错误。‎

client_body_timeout

‎定义读取客户端请求正文的超时,默认60s,超时仅设置在两个连续读取操作之间的一段时间内,而不是为整个请求正文的传输设置,如果客户端未在此时间内传输任何内容,则请求将终止,并显示 408(请求超时)错误。‎

我们先来分析一下这几个参数的关系,有大小限制,有超时时间,那组织一下语言来说,也就是文件太大了,整个传输的过程就会加长,等到超过了timeout时间之后就会报错,可是timeout和size都有双份,那我们怎么要修改哪一个呢?

在timeout相关的两个参数中,我们需要排除掉的应该是client_header_timeout参数,除非是网络问题,否则一个请求头的读取时间绝不对超过10s,而且我们出问题的地方是附件上传,所以十有八九就是读取body超时了,而在size相关的两个参数中,我们需要排除掉的应该是client_max_body_size参数,因为上面都明确写了,如果超过了默认值,直接就是413错误了。

这么一分析,就只剩下client_body_buffer_sizeclient_body_timeout了,这下大家是不是清楚了很多?client_body_buffer_size这个参数在上面已经介绍过了,而且从它这个单词的字面意思上也可以看得出来是用来做缓冲的,那文件太大了就缓冲不了,这时候就必须写磁盘,速度肯定会慢下来,一旦超过了timeout的限制,那可不就直接408了

分析到这里,解决方案已经呼之欲出了,要么加大timeout,要么加大buffer_size,但我们永远也无法精确知道用户会上传一个多大体积的附件,所以还差一步,那就是在上传的时候,前端做一下限制,同时也给一个人性化的Tips提示一下用户,我这里选择加大buffer_size参数来解决这个问题。

upstream jwcz {
server 127.0.0.1:8088;
}
server {
listen 80;
server_name www.jiweichengzhu.com;

# 加大缓冲区
client_body_buffer_size 2048k;
access_log logs/jwcz_access.log;
error_log logs/jwcz_error.log;
location / {
proxy_pass http://jwcz;
proxy_set_header Host $host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

加大缓冲区之后,问题得到解决!

nginx

看完文章,有任何疑问,请加入群聊一起交流!!!

很赞哦! ()

文章评论

  • 请先说点什么
    人参与,条评论

请使用电脑浏览器访问本页面,使用手机浏览器访问本页面会导致下载文件异常!!!

雨落无影

关注上方公众号,回复关键字【下载】获取下载码

用完即删,每次下载需重新获取下载码

若出现下载不了的情况,请及时联系站长进行解决

站点信息

  • 网站程序:spring + freemarker
  • 主题模板:《今夕何夕》
  • 文章统计:篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们