Day10-流量限制(五)

前言

前几天终於把限制请求「数量」的部分讲完了,但光是限制数量是不够的,最好还能限制每个请求的大小,否则攻击者只要发一些 body 很肥很肥的无用请求,一样可以把服务器瘫痪掉

值得庆幸的是,不管你前面挡的是 Nginx、Apache、IIS 还是其他 Web server,他们都已经帮你设好一个不错的预设值,只要在修改设定时不要不小心改掉就好了~

在 Nginx 设定 max body size

考虑以下这个设定档,如果我想把所有 server(大多时候会同时听 80 跟 443 port)可接受的 body 大小都设定成 100KB,那只需要在 http 底下加一行 client_max_body_size 100k 就好了,非常简单吧~而且就如刚刚说的,就算你不刻意设定,client_max_body_size 属性的预设值也是 1MB,对於一般应用来说也是非常合理的范围

http {
    # 请求的 body 最大就是 100KB
    client_max_body_size 100K;

    upstream backend {
        server 192.0.0.1:8000;
        server 192.0.0.2:8000;
        server 192.0.0.3:8000;
    }

    server {
        listen 80;
        location /api {
            proxy_pass http://backend;
        }
    }
}

设定套用上去之後,如果有人尝试送超过 100KB 的请求,那 Nginx 就会直接拒绝,并且回给他 413 Request Entity Too Large 的错误,这样 client 看到就会知道请求的 body 太肥了。而且这样有一个好处就是 Nginx 後面的 API server 完全不会意识到有人送了这个太肥的请求,毕竟一开始就被 Nginx 挡掉了,等於是加上一层防护罩的概念

针对特定 API 做设定

但有一种情况是这样:因为有些 Server 需要让使用者上传档案,而 100KB 对上传的头贴、影片来说显然是不够的,所以对於那些上传档案的 API 要特别把限制调高,这时也可以针对不同 location 做不同的设定

http {
    # 预设值 100KB
    client_max_body_size 100K;

    server {                
        # 上传大头贴最高可以到 5MB
        location /api/upload/avatar {
            client_max_body_size 5M;
            proxy_pass http://backend;
        }
        
        # 上传影片最高可以到 20MB
        location /api/upload/video {
            client_max_body_size 20M;
            proxy_pass http://backend;
        }
        
        # 其他 API 就是预设值 100KB
        location /api {
            proxy_pass http://backend;
        }
    }
}

如此一来大部分 API 还是维持 100KB 的限制,而上传大头贴、影片的两个 API 则是调整到 5MB、20MB,因为这两个 API 的资源消耗比较多,所以记得要搭配前几天讲的 rate limit 进行使用,才不会被恶意攻击者不断上传一堆影片

小结

关於「流量限制」的部分就到今天结束,这几天讲的这些方法虽然可以有效挡住短时间的流量攻击,但对於大规模、长时间的 DDOS 攻击还是没办法完全挡住,毕竟请求来自四面八方,三不五时还会更换 IP,所以真的遇到的话也只能请专业的公司协助了

另外这边也想补充一下,除了 max body size 之外,Nginx 在很多属性上(像是 buffer 大小、connection pool 大小、timeout)都给了很不错的预设值。所以就算你只是把 Nginx 挡在 API server 前面做转发,不做多余的调整,也能为 server 带来基本的防护力哦~

如果对於这几天的内容若有什麽问题都欢迎在下方留言,如果都没问题的话,明天就要开始讲 HTTP Headers 相关的设定了~


<<:  中场回顾

>>:  Angular 深入浅出三十天:表单与测试 Day10 - Template Driven Forms 实作 - 动态表单初体验

Day 14:Disqus 留言管理指南

昨天我们在 Hexo 装设了 Disqus 留言版功能,那当真的有人留言之後,我该怎麽去管理这些留言...

Day4给你一个导览列大家说好不好

今天从导览列开始做 首先先把 components里的helloword .vue 跟有import...

Day 15 ( 中级 ) 无限循环画中画

无限循环画中画 教学原文参考:无限循环画中画 这篇文章会介绍,如何在 Scratch 3 里使用角色...

【day13】连续上班日做便当2

今天的便当是无淀粉系列 主菜是鲜甜的肉束尾 其实我本人很害怕猪肉的腥味 但男友妈妈准备的食材都很好 ...

每个人都该学的30个Python技巧|技巧 16:其他串列常用的函式(字幕、衬乐、练习)

今天终於是教串列的最後一篇啦~明天就可以进到新的资料型态了,期不期待咧ᕕ(ᐛ)ᕗ 在这部影片中一口气...