Nginx防CC限制
若使用CDN将$binary_remote_addr更改为$http_x_forwarded_for
在网站的server模块添加如下代码(定义达到触发条件时nginx所要执行的动作):
ngx_http_limit_req_module模块是通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回503错误。
ngx_http_limit_conn_module模块则是限制IP连接数
效果:某ip访问过于频繁,打印的日志里会出现503错误
分割Nginx日志
为后续分析方便,把正常日志、错误日志、拦截日志分开
在nginx.conf中http模块添加如下代码:
定义日志格式以及三个变量,$normal、$notfound、$abnormal,分别表示正常日志、拦截日志(40X)、系统异常日志。
在网站的server模块添加如下代码:
定义日志输出到三个文件
禁止IP
添加完防CC限制和日志分割后,可以再error.log中看到出现许多503错误,接下来就需要将那些日志中的IP ban掉
添加真实IP变量
在nginx.conf中http模块添加如下代码:
新增禁止IP脚本
将下列代码放在/usr/local/bin/nginx_deny_ctl.sh中,并赋予可执行权限
注: NGINX_BIN和DENY_CONF需要根据实际情况填写
测试是否正常添加删除IP:
增添deny目录
在网站的server模块添加如下代码:
注:根据实际情况填写
配置fail2ban进行自动过滤禁止
过滤器filter:/etc/fail2ban/filter.d/nginx-bad-ip.conf
操作action:/etc/fail2ban/action.d/nginx-deny.conf
配置jail:/etc/fail2ban/jail.d/nginx.local
logpath需要配置为网站错误日志路径
重启服务
重新启动Nginx和fail2ban服务,试一发CC,静候效果。
上面的阈值随便配的,请自行琢磨适合自己的阈值。