请选择 进入手机版 | 继续访问电脑版

登录 1秒注册

4414站长论坛

搜索
查看: 174
回复: 38

一招简单设置nginx可防止ddos攻击(CDN之外另一种方法)

[复制链接]
签到达人
小菜(17级)
 楼主|2020-7-31 16:15:51 |   使用道具 举报 显示全部楼层 |阅读模式
本帖最后由 小菜 于 2020-7-31 16:32 编辑

周。。。五。。。。啦。。。闲着没事干就写一下我这两天解决一个网站被刷的问题吧。
近段时间网站频频告警网站负载过高,我打开网站发现没啥影响的情况下因为懒所以没有过多的理会它。可是前两天中午网站突然打不开了,访问要么504或502错误码。。。这怎么得了,然后赶紧查看nginx的实时日志发现有大量的相同IP在采集我的网站,导致把php的fpm耗尽,吓得我直接封IP,封完IP过一会儿网站终于正常了,哈哈哈,完美!可是下午网站又打不开了查看日志又有新的IP在爬我的网站,吓得我赶紧又把这滚犊子的IP封了又封,封完IP恢复网站访问之后心想封IP是治标不治本的方法,得相处一个治本的方法才行!这里说下我的网站是 PHP + nginx 架构的,所以解决方法主要对这两个下手:

1)在PHP应用层做限制

做法:在应用层用PHP代码编写封禁规则
优点:可以随意按照自己的算法编写封禁规则
缺点:需要编写和维护代码成本高、而且还会占用php-fpm 进程

2)在nginx层限制

做法:设置nginx配置,利用nginx的桶漏算法对IP访问限制
有点:简单设置基本不需要任何成本、稳定、而且不占用php-fpm进程资源
缺点:只能按照nginx方式去做限制访问

3)接入CDN

这个方法是最有效,大家比较认可的方法,可惜我的域名因为种种原因没有备案接入不了CDN

综上我这里选择了nginx层做限制,配置如下:
#定义一个桶漏
limit_req_zone $binary_remote_addr zone=one:1m rate=1r/s;
server {
        location ~ \.php$ {
                        limit_req zone=one burst=3 nodelay;# 使用one桶漏

                        fastcgi_pass   127.0.0.1:9001;
                        fastcgi_index  index.php;
                        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                        include        fastcgi_params;
        }


配置说明:
配置使用limit_req_zone定义了一个桶漏,$binary_remote_addr  是根据访问IP生成的桶漏,zone=one 定义了桶漏的名称为one, 1m表示定义这个桶漏为1mb内存空间存放访问信息,rate=1r/s 是每个ip每秒处理1次并发数,这些都可以根据自己任意更改。因为很多爬虫过多访问耗尽了我的php-fpm 进程,所以我只对访问php文件做了限制limit_req zone=one burst=3 nodelay;

这里是使用上面定义的one桶漏,桶的容量是3,也就是说每个桶每秒处理一个请求,如果单个IP并发超过1个的话其它的会缓存在桶内,但是桶的容量只有,如果并发是3,处理1个请求两个会被缓存等待处理(这里用nodelay回被同时处理),如果并发超过3个水桶的水会溢出,访问直接503拒绝访问
image.png 演示站我就不发我的网站地址出来了,我看见笔趣阁也是这么设置 的,大家可以不断在访问http://www.biquge.info/1_1760/
然后按下ctrl + f5 强制刷新访问,多刷新几次就发现有503错误了,但是正常访问就没事

官方文档:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
其它中文文档:https://www.321dz.com/2019.html





此处为广告位招租位

使用道具 举报

CDN+防火墙就能解决了~没你说的这么复杂啦~

使用道具 举报

签到达人
小菜(17级)
 楼主|2020-7-31 16:29:51 | 支持 打赏层主 回复 使用道具 举报 显示全部楼层
xbz0412 发表于 2020-7-31 16:27
CDN+防火墙就能解决了~没你说的这么复杂啦~

CDN是确实很好的方法,但是如果没有备案用不了CDN,境外的一些CDN也不稳定,可以尝试一下这种方法
此处为广告位招租位

使用道具 举报

cdn似乎不支持伪静态吧

使用道具 举报

小李(3级)
2020-7-31 20:14:15 来自手机 | 支持 打赏层主 回复 使用道具 举报 显示全部楼层
路过看看

使用道具 举报

来围观  看看

使用道具 举报

学习了,收藏以后使用
萌妹子私房照 http://mmeizi.com

使用道具 举报

有人需要做网站优化吗

使用道具 举报

2020-7-31 23:48:07 来自手机 | 支持 打赏层主 回复 使用道具 举报 显示全部楼层
好像是大佬
遇见要珍惜呐

使用道具 举报

签到达人
小菜(17级)
 楼主|2020-8-1 00:36:44 来自手机 | 支持 打赏层主 回复 使用道具 举报 显示全部楼层
睡觉觉 发表于 2020-7-31 19:20
cdn似乎不支持伪静态吧

cdn是多路线多节点缓存跟伪静态无关
此处为广告位招租位

使用道具 举报

学习了,我的站这几天也是  天天被
qipafuli.com

使用道具 举报

签到达人
被DDOS 除了等死 跟加钱 没别的办法。你这种就抗一抗5G的流量。一般主机自带5G

使用道具 举报

签到达人
小菜(17级)
 楼主|2020-8-1 04:12:28 来自手机 | 支持 打赏层主 回复 使用道具 举报 显示全部楼层
本帖最后由 小菜 于 2020-8-1 04:20 编辑
我爱一条柴称 发表于 2020-8-1 01:50
被DDOS 除了等死 跟加钱 没别的办法。你这种就抗一抗5G的流量。一般主机自带5G


除非你有大量的ip做代理可以攻破,不然攻击请求将会被拒绝就不存在5g还是500g问题了。通过我目前网站日志观察采集者基本都是相同ip下多线程抓取,因为ip代理是需要成本的,所以此方法不保证百分百能拦截成功,但是大多情况是能拦截到不需要加钱的哦
此处为广告位招租位

使用道具 举报

签到达人
小菜 发表于 2020-8-1 04:12
除非你有大量的ip做代理可以攻破,不然攻击请求将会被拒绝就不存在5g还是500g问题了。通过我目前网站日志观察采集者基本都是相同ip下多线程抓取,因为ip代理是需要成本的,所以此方法不保证百分百能拦截成功,但是大多情况是能拦截到不需要加钱的哦

我笑了。

使用道具 举报

签到达人
MARK,收藏

使用道具 举报

cdn国内免费的也抵御不了多大流量吧,如果几百G的Ddos怎么办
www.yankt.cn 福州网站建设

使用道具 举报

神评大师
你这样搞把蜘蛛也搞死了,没有多大意义。
已经没有了

使用道具 举报

签到达人
别问,问就挂cf
www.qyzwy.com

使用道具 举报

用PHP写过滤代码就可以了,不过不能抵挡分布式的攻击,这种就加上行为验证就行了。
每日一笑话 ,www.xiaogouyu.top

使用道具 举报

过来看看,学习学习
喜讯:为了满足更多用户需求,香港空间产品线已做调整,新增了一个产品,仅需50元,即可永久使用,空间容量100M,赠送数据库50M,支持ASP和PHP,不限制流量,特别适合小型网站使用,详情可到官网查看www.idcsy.cn测试地址www.089444.cc

使用道具 举报

您需要登录后才可以回帖 登录 | 1秒注册

站长论坛积分规则

辽ICP备17019053号-2|Archiver|手机版|小黑屋| 站长论坛

GMT+8, 2020-8-9 08:02 , Processed in 0.267325 second(s), 150 queries .

Powered by Discuz! X3.3

© 本站内容均为会员发表,并不代表本站长论坛立场!

快速回复 返回顶部 返回列表