Nginx全局异常兜底数据返回+封禁恶意IP什么是兜底数据

举报
小滴课堂 发表于 2022/03/30 14:44:17 2022/03/30
【摘要】 什么是兜底数据兜底数据,它属于咱们微服务里面的一个容灾方案,现在多数互联网公司一般服务就很多个,那难免会有服务或者接口出错。我们需要说一下这个重要性,比如一个网站它一天的访问量几千万上亿,那它如果某一个接口挂了,那咱们前端的就拿不到对应的数据,那我们的页面就展示就会出问题比如空白,那用户就会一脸的懵逼。那造成接口挂了的问题有很多种,最常见的就是由于咱们这个接口访问量突然增高或者我们服务器因为...

什么是兜底数据

兜底数据,它属于咱们微服务里面的一个容灾方案,现在多数互联网公司一般服务就很多个,那难免会有服务或者接口出错。

我们需要说一下这个重要性,比如一个网站它一天的访问量几千万上亿,那它如果某一个接口挂了,

那咱们前端的就拿不到对应的数据,那我们的页面就展示就会出问题比如空白,那用户就会一脸的懵逼。

那造成接口挂了的问题有很多种,最常见的就是由于咱们这个接口访问量突然增高或者我们服务器因为某个原因当掉了,好比以前新浪微博某个明星出轨或者结婚了,新浪微博的服务器挂了很多次是吧,咱们刷新的时候拉取不到对应的信息流。

我们举另外一个更贴切的例子,好比我们去看今日头条里面的新闻。财经频道,假如某一天财经频道这个频道挂了对不对,后面对应的数据分类接口拉不回来。那我们就可以提前准备好一份财经的相关新闻列表数据,它包含标题、图片、概要,数量可以是几十篇到几百篇,只要能满足用户的日常消费就可以,当我们这个接口挂了,我们就把这份兜底数据返回给用户,那用户就不会没有内容看,换到这个频道也不会出现空白。对用户体验而言就是比较好的。


通过这一个例子,大家就明白兜底数据的重要性,那如何通过Nginx配置我们这样的一个兜里数据呢?

作为后端开发人员,肯定有出现过我们接口出现了5xx错误。

然后有些同学没有做好统一的错误管理,直接把对应的一站一大串错误代码暴露给用户,这样对用户而言肯定是很不好的。所以我们可以在Nginx这一层做好统一的错误转换, 不管什么情况返回给前端的http状态码肯定是200

下面就是我们配置Nginx根据错误的http状态码,返回兜底数据,这个兜底数据可以是一个json串,也可以从文件中读取出来的列表文件。

location / {
            proxy_pass http://lbs;
            proxy_redirect default;
      
            proxy_next_upstream error timeout http_503 non_idempotent;
            #开启错误拦截配置,一定要开启
            proxy_intercept_errors on;
  }

# 不加 =200,则返回的就是原先的http错误码;配上后如果出现500等错误都返回给用户200状态,
# 并跳转至/default_api

  error_page  404 500 502 503 504  =200  /default_api;
  location = /default_api {
    default_type application/json;
    return 200 '{"code":"-1","msg":"invoke fail, not found "}';
 }

我们来解释一下 error_page 后面跟了很多的一个HTTP状态码,比如 404 500 502 503 504,这个就表示遇到这些状态码之后它就会把这个状态码改为 200 然后去请求 /default_api 这个路径。

且会映射到location = /default_api,里面声明它的返回类型是json和json数据。

这个流程就是如果后端返回错误状态码。Nginx那边就会做一个转换,然后返回对应的全局兜底数据, 当然这个兜底数据需要跟前端约定好,这样前端那边才可以根据对应的状态码展示对应的信息。

{"code":"-1","msg":"invoke fail, not found "}

网络安全-Nginx封禁恶意IP

我们再来讲一下另外一个案例 通过Nginx封禁恶意ip,为什么要封禁恶意访问的ip呢?主要有两大影响,一个是网络攻击,还有一个就是为了数据安全。

网络攻击

这一个很常见像我们业界里面很多公司会开发游戏对不对,肯定有竞争对手开发同类型的游戏,那如果某个公司的游戏服务器被别人攻击了,然后很网络很卡顿,在玩游戏的用户就不喜欢这个平台游戏,转而去另外一个平台。

再比如一个公司要搞电商双十一促销活动,另外一个对手公司他也要进行类似的促销活动。

某一个公司被黑客攻击了,导致他的网站瘫痪了,在双11促销那天用户根本无法访问这个网站,

这样用户就不会在这个平台进行购买,转而去另外一个平台进行购买对应的商品,那这样损失就很大了。

造成网站瘫痪的攻击有很多种,比如TCP洪水攻击,注入攻击,DDOS, 像这些比较难防的就是DDoS。

数据安全

关于数据安全有很多种,第一个就是防止别人爬取你网站上的数据。你们公司是做一个体育站点,现在世界杯开始了,公司花了几千万购买了版权,然后想在这个市场里面推广开来。

这个时候对手发现了你们公司有这个对应的数据,他们就开发一个爬虫系统,做了一个山寨的网站。对应的比赛的比分信息、球员、包括赛程和视频等信息,就爬取你们网站上面的数据。

这样的话你们数据就被他爬过来了而他那边不用花一分钱

所以通过上面这两个案例,大家就知道封禁恶意ip有多么的重要,常见的我们封禁ip有两种方式,

第一种就是通过Linux服务端的防火墙iptables进行封禁,第二种就是在Nginx层进行封禁。

这两种封禁的话我们更倾向于第一种,但是我们这边是讲Nginx的,所以我们就讲一下Nginx如何去封禁对应的恶意ip。

我们创建于一个文件blacklist.conf,在上面输入我们想要封禁的ip,前面增加个deny就可以拒绝对应的ip进行访问,

为了方便测试我们禁止127.0.0点一访问,

#blacklist.conf目录下文件内容
deny 192.168.159.2;
deny 127.0.0.1;

然后我们修改nginx.conf的配置文件增加下面的内容,重点是 include blacklist.conf; 就是导入上面要封禁的ip列表。


http{
    # ....
    include blacklist.conf;
}
location / {
    proxy_pass http://lbs;
    proxy_redirect default;
}

重启我们的服务,然后我们就可以通过浏览器访问 127.0.0.1, 就会发现拒绝访问, 再通过局域网的ip访问这个nginx是可以成功的。

自动化封禁思路拓展:

我们可以在启动一个定时任务里面去跑我们的shell脚本, shell里面的内容就是统计Nginx的access.log访问日志。

每一分钟执行一次,统计每秒访问超过60次的ip,然后写入到对应的黑名单列表,再通过nginx重新加载对应的文件就可以做到动态封禁ip。

本章小结

掌握什么是兜底数据以及Nginx配置都得数据。

掌握恶意ip的危害和Nginx如何封禁而恶意ip。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。