项目实战典型案例28——生产环境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能够接受最大人数的上传。

对于之后上传文件这里如何进行设计避免出现今天的情况

  1. 在设计之初考虑到今后的应用场景,事先设置nginx上传文件大小的限制,以及nginx接口超时时间
  2. 页面前端做上文文件大小的限制,如提示支持多大的文件上传,建议上传多大的文件。
  3. 后端可以做分批次导入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;
}

四:总结

  1. 对于问题的解决方案不能只想到一种解决方案,我们需要相处3中以上的解决方案,通过评估在当前环境下,哪一种方案更为合适。
  2. 秉持二选二 二选三思维

猜你喜欢

转载自blog.csdn.net/wangwei021933/article/details/129540308