生产环境nginx限制上传大小带来的灾难
一:背景介绍
本篇博客是对生产环境nginx限制上传大小带来的灾难进行的总结和进行的改进。
目的是将经历转变为自己的经验。通过博客的方式分享给大家,大家一起共同进步和提高。
二:思路&方案
对于在生产环境上调整nginx上传文件的大小是一个非常恐怖的方案:
1.首先由于是生产环境,很可能有用户正在进行使用,不管有没有改动成功,都需要重启nginx服务都会导致某一段时间内服务处于不可用的状态。
2.该方案,没有考虑到后续的变化,如果这次你调整到可以上传1.5w人的文档,如果下次我是2.5w人的文档你又怎么办呢?是不是又去修改nginx上传文件的大小。
方案
那是不是一定不可以修改nginx上传文件的大小呢,我认为也不是的。
上面的方案(直接修改nginx上传文件大小)没有考虑其他情况1. 现在修改nginx是否合适,优势利弊是什么? 2.有没有其他的更优的方案他们的优势利弊是什么?
解决生产环境nginx限制上传大小的方案
背景:现在生产环境的体测上面很可能有用户正在使用,但是现在学院又需要导入1.5w人对应的excel表格,但是由于nginx上进行了限制倒是1.5w条的excel导入失败。
1.不能影响线上用户的使用,于是我们可以进1.5w人的表格进行查人,分5批次进行导入,3000人表格进行导入。找到nginx能够接受最大人数的上传。
对于之后上传文件这里如何进行设计避免出现今天的情况
- 在设计之初考虑到今后的应用场景,事先设置nginx上传文件大小的限制,以及nginx接口超时时间
- 页面前端做上文文件大小的限制,如提示支持多大的文件上传,建议上传多大的文件。
- 后端可以做分批次导入excel表格的接口,可以利用多线程节省导入的时间。
三:Nginx上传文件大小配置
在nginx的配置文件nginx.conf中设置了上传文件的大小。
Nginx一般默认的上传最大请求体在1m。如果设置为0,表示上传文件大小不受限制。
Default: client_max_body_size 1m;
nginx支持在http块、server块和location块中设置client_max_body_size
三者的主要区别是:http{}中控制所用nginx收到的请求,server{}控制该server收到的请求报文大小;location{}只对匹配了location 路由规则的请求生效。
示例
http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; #默认的上传最大请求体在1m。如果设置为0,表示上传文件大小不受限制。 client_max_body_size 10m; include /etc/nginx/conf.d/*.conf; }
四:总结
- 对于问题的解决方案不能只想到一种解决方案,我们需要相处3中以上的解决方案,通过评估在当前环境下,哪一种方案更为合适。
- 秉持二选二 二选三思维