1、改造网站本身前端代码,尽可能的将静态资源使用cdn方式调用,图片通过js生成,减少对自身服务器的请求
#1、免费好用的cdn库推荐,比如调用jquery、tailwind、font-awesome等开源插件,可以直接通过cdn来调用 https://www.bootcdn.cn/ https://cdnjs.com/ #2、一些简单的图片可以通过原生绘图canvas实现;个人微信、公众号等二维码可以通过qrcode插件生成 <script src="https://cdn.jsdelivr.net/npm/qrcode@1.5.1/build/qrcode.min.js"></script>
2、后端使用Redis缓存,在数据量大和访问频繁的情形下,Redis缓存能显著提升网站的性能
具体参考之前的文章:《cc防护经验分享一:分享一个Redis缓存类,兼容redis和文件缓存》
步骤1和2在正常访问,没有攻击的情况下,对网站性能提升是非常有帮助的;但是如果遇到了cc攻击,前面2个优化步骤对于服务器攻击问题的解决还是杯水车薪,遇到cc攻击后网站还是打开非常缓慢,像最近我的服务器每天上百万独立IP的攻击,网站本身优化后还是基本打不开,现在的办法是想办法拦截异常的IP
3、初级限制,对各种web软件做好初级设置,我这里使用的是宝塔面板
1、设置php,找到网站对应php版本,在"性能调整"那里,先把限制设置严格点,比如: max_children = 6 //允许创建的最大子进程数 start_servers = 2 //起始进程数(服务启动后初始进程数量) min_spare_servers = 2 //最小空闲进程数(清理空闲进程后的保留数量) max_spare_servers = 2 //最大空闲进程数(当空闲进程达到此值时清理) //等后面其他防护起作用了,而且流量逐渐正常了,再把参数调高点,避免正常用户出现打不开的情况 2、设置nginx,同样在"性能调整"那里,根据自己服务器的配置先设置适当严格点,比如: worker_connections = 20000 //最大并发链接数 3、设置fail2ban,这个是防护关键之一,前期攻击大也可以设置严格点 #3.1 比如单个网站参数:表示如果有某个IP在300s内,有2次异常访问,就拦截6000s;这个可以等后面访问正常了,根据实际情况适当设置宽泛一点 --最大重试次数:2 --周期:300 --禁止时间:6000 #3.2 另外,等后期Redis防护生效而且稳定了,可以关闭sqlite数据库,进一步提升fail2ban性能 #复制一份/etc/fail2ban/fail2ban.conf为fail2ban.local(这样即使升级fail2ban,自定义配置也不受影响),然后将dbfile = /var/lib/fail2ban/fail2ban.sqlite3改成 --dbfile = none #3.3 定期清理fail2ban日志,这里我把每周清理fail2ban、网站和maillog日志写到一个脚本了,见步骤4 4.开启宝塔自带的系统防火墙,这个也很重要 不过要注意测试下百度等蜘蛛抓取是否正常,可以将百度的爬虫IP加入防火墙白名单: 116.179.32.0/24 116.179.37.0/24 220.181.108.0/24 123.125.66.0/24
4、定期清理fail2ban、网站和maillog日志,一方面可以降低存储空间,另一方面可以提升fail2ban性能
可以根据实际情况,在宝塔计划任务里面,设置清理时间,比如每隔7天的半夜1点50清理一次
# 1、清理fail2ban日志,清空日志文件内容,但不删除文件本身(防止服务报错)
echo "" > /var/log/fail2ban.log
# 2、清理maillog日志,强制清空 maillog 文件内容,保留文件本身
> /var/log/maillog
# 3、清理网站的日志
#find /www/wwwlogs -name "*.log" -exec rm -rf {} \;
#find /wwwlogs -name "*.log" -exec rm -rf {} \;
#/etc/init.d/nginx restart
#service mysqld restart
# 遍历并清空所有日志文件
for log in /www/wwwlogs/*.log; do
truncate -s 0 "$log"
done
5、开启Redis数据库存储异常访问IP,这一步是最重要的,等有异常IP自动写入Redis数据库,在访问具体网站的时候,先验证当前访问IP是否在异常IP数据库里,如果在则直接返回不做后面处理,具体参考之前的文章:
《cc防护经验分享二:redis在fail2ban中的应用,提升fail2ban防护性能》
这个是半天多时间的拦截情况,效果还是非常明显,原来50多M的带宽占用,降到了10M以内;理论上,时间越久,拦截效果越好,而不会像之前那样,时间越久防护性能越低;而且拦截的IP还可以做一个API接口,供服务器以外的其他网站共享使用

最后,如果确实没有攻击,网站流量还是很高,可能就是真实访客,需要升级服务器扩容了
