您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发
【原】前端上传附件失败nginx出现408错误
不忘初心 2021-11-30 围观() 评论() 点赞() 【JAVA开发】
简介:前端在上传附件的时候一直报错,但是查看后端压根就没有请求进来,在本地调试的时候就没有这个错误,代码没有不同,唯一不同的就是外网用的是正式域名,多走了一道nginx解析,跑去一看,还真的是nginx出了问题,在nginx的log中看到这个出错的请求对应的状态码是408。
前端在上传附件的时候一直报错,但是查看后端压根就没有请求进来,在本地调试的时候就没有这个错误,代码没有不同,唯一不同的就是外网用的是正式域名,多走了一道nginx解析,跑去一看,还真的是nginx出了问题,在nginx的log中看到这个出错的请求对应的状态码是408。
在看到这个错误之后,又多测试了几次,发现上传1M以内的文件是不会报错的,超过1M的文件就上传不了,而这个出错的文件就是一张1.1M的图片,此时已经能看出问题就是出在这里了,nginx在传输数据的时候,对数据的体积大小默认是1M,所以我传了超过1M的文件就会一直失败。
查阅nginx官方资料之后发现,nginx有几个和本次错误相关的参数:
客户端请求服务器最大允许大小,默认大小为1M,如果超过了1M的文件,上传时会报错413 Request Entity Too Large。
nginx分配给请求数据的buffer大小,默认大小为机器上的两个内存页,如果你的机器是x86的,那么大小就是8K,如果你的机器是x64的,那么大小就是16K,缓冲区大家都能明白是为了加快响应速度的,没超过这个大小的可以放在内存中,一旦超过了这个buffer的大小之后,那么就要进行磁盘读写了。
定义读取客户端请求请求头的超时,默认60s,如果客户端未在此时间内传输整个请求头,则请求将终止,并显示 408(请求超时)错误。
定义读取客户端请求正文的超时,默认60s,超时仅设置在两个连续读取操作之间的一段时间内,而不是为整个请求正文的传输设置,如果客户端未在此时间内传输任何内容,则请求将终止,并显示 408(请求超时)错误。
我们先来分析一下这几个参数的关系,有大小限制,有超时时间,那组织一下语言来说,也就是文件太大了,整个传输的过程就会加长,等到超过了timeout时间之后就会报错,可是timeout和size都有双份,那我们怎么要修改哪一个呢?
在timeout相关的两个参数中,我们需要排除掉的应该是client_header_timeout
参数,除非是网络问题,否则一个请求头的读取时间绝不对超过10s,而且我们出问题的地方是附件上传,所以十有八九就是读取body超时了,而在size相关的两个参数中,我们需要排除掉的应该是client_max_body_size
参数,因为上面都明确写了,如果超过了默认值,直接就是413错误了。
这么一分析,就只剩下client_body_buffer_size
和client_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报错“src/os/unix/ngx_user.c:26:7: error: ‘struct crypt_data’ has no member named ‘current_salt’”
- linux环境下nginx1.13.6二进制方式安装教程
- windows环境下nginx使用教程
- nginx配置ssl证书,提示找不到OpenSSL依赖
- nginx配置腾讯云ssl证书图文教程
- nginx配置ssl证书之后访问不了80端口
- ERR_ABORTED 503 (Service Temporarily Unavailable)
- Nginx限制IP访问频率,防止暴力攻击
- nginx配置阿里云ssl证书图文教程
- Nginx白名单封禁IP防止暴力攻击访问
标签云
猜你喜欢
- IntelliJ IDEA 2019.2已经可以利用补丁永久破解激活了
- IntelliJ IDEA 2019.3利用补丁永久破解激活教程
- IntelliJ IDEA高版本最灵活的永久破解激活方法(含插件激活,时长你说了算)
- Jetbrains全家桶基于ja-netfilter的最新破解激活详细图文教程
- IntelliJ IDEA 2022.1永久破解激活教程(亲测可用,持续更新)
- 分享几个正版 IntelliJ IDEA 激活码(破解码、注册码),亲测可用,持续更新
- ja-netfilter到底需不需要mymap,2021.3.2版本激活失效?
- 如何激活idea2022.1及以上版本中的插件(亲测可用)
- 【史上最全】IntelliJ IDEA最新2022.1版本安装和激活视频教学(含插件)
- IntelliJ IDEA 2022.2 版本最新2099年永久激活方法,亲测可用,也可以开启新UI了。
站点信息
- 网站程序:spring + freemarker
- 主题模板:《今夕何夕》
- 文章统计:篇文章
- 标签管理:标签云
- 微信公众号:扫描二维码,关注我们