1.关于动态黑名单
主要是定时查询访问日志,查询出访问频率较高的ip,加入黑名单 详情见我的上一篇文章nginx动态黑名单功能
2.避免网页被盗链
在http模块配置add_header X-Frame-Options SAMEORIGIN; 只允许相同域名iframe引入网页
X-Frame-Options 有三个值: DENY 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。 SAMEORIGIN 表示该页面可以在相同域名页面的 frame 中展示。 ALLOW-FROM uri 表示该页面可以在指定来源的 frame 中展示。
3.referer设置
通过配置实现通过Http请求包头中的Referer实现防盗链。在http请求的跳转过程中,Http包头中会加入Referer参数,指明跳转的来源。通过这个可以实现简单的防盗链功能。
location / {
valid_referers none blocked domain.com *.domain.com ;
if ($invalid_referer) {
return 403;
}
proxy_pass https://192.168.1.1/;
}
4.限流配置
首先,在nginx.conf文件中的http模块下配置
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
说明:区域名称为one(自定义),占用空间大小为10m,平均处理的请求频率不能超过每秒一次。如果是1分钟一次则为1r/m
第二,在http模块的子模块server下面配置
location ~* .htm$ {
limit_req zone=one burst=5 nodelay;
proxy_pass http://192.168.1.1;
}
我这里是对uri后缀为htm的请求限流,注意limit_req zone=one burst=5 nodelay;
其中zone=one和前面的定义对应。
burst这个网上都说峰值之类的,通过亲自试验发现这么说并不准确,应该叫缓冲队列的长度比较合适。
nodelay字面的意思是不延迟,具体说是对用户发起的请求不做延迟处理,而是立即处理。比如我上面定义的rate=1r/s,即每秒钟只处理1个请求。如果同一时刻有两个后缀为htm的请求过来了,若设置了nodelay,则会立刻处理这两个请求。若没设置nodelay,则会严格执行rate=1r/s的配置,即只处理一个请求,然后下一秒钟再处理另外一个请求。直观的看就是页面数据卡了,过了一秒后才加载出来。
此部分来源博客地址Nginx使用limit_req_zone对同一IP访问进行限流
5.配置http_user_agent
通过nginx日志分析各种爬虫,ddos和正常请求的差异,阻止爬虫和ddos 比如观察某爬虫请求客户端代理为
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
可以在location模块添加
if ($http_user_agent ~* "Mozilla/5.0\ \(X11;\ Linux\ x86_64\)") { return 403; }
6.其他配置
只允许GET,POST请求
if ($request_method !~ ^(GET|POST)$) {
return 403;
}
屏蔽所有xml请求
location ~ .*\.(xml)$ { return 403;}
|