Nginx限流和黑名单配置 本文共有3023个字,关键词: ####简单粗暴设置 ```bash #白名单设置,访问根目录 location / { allow 123.34.22.15; allow 33.56.32.1/100; deny all; } #黑名单设置,访问根目录 location / { deny 123.34.22.15; } #特定目录访问限制 location /tree/list { allow 123.34.22.15; deny all; } ``` ####根据日记生成 在http模块最后加上配置 ```bash #黑名单设置 include /etc/nginx/conf.d/blockip.conf; ``` blokip说明 ```bash # 屏蔽单个ip访问 deny IP; # 允许单个ip访问 allow IP; # 屏蔽所有ip访问 deny all; # 允许所有ip访问 allow all; #屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令 deny 123.0.0.0/8 #屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令 deny 124.45.0.0/16 #屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令 deny 123.45.6.0/24 ``` 创建脚本 ```bash vim /etc/nginx/blockip.sh #!/bin/bash #取最近5w条数据 日志地址自定义 tail -n50000 /usr/local/nginx/logs/access.log \ #过滤需要的信息行ip等 |awk '{print $1,$12}' \ #过滤爬虫 |grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou|360|bing|soso|403|admin" \ #统计 |awk '{print $1}'|sort|uniq -c|sort -rn \ #超过1000加入黑名单 |awk '{if($1>1000)print "deny "$2";"}' >> /etc/nginx/conf.d/blockip.conf #重启nginx生效 /usr/sbin/nginx -s reload ``` 加入任务计划 ```bash crontab -e #每半小时检查执行一次脚本 */30 * * * * . /etc/profile;/bin/sh /etc/nginx/blockip.sh ``` ####Nginx 的限流策略 Nginx 的限流主要是两种方式: 限制访问频率和限制并发连接数。 Nginx 按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。 Nginx 官方版本限制 IP 的连接和并发分别有两个模块: 1、limit_req_zone:用来限制单位时间内的请求数,即速率限制 , 采用的漏桶算法 “leaky bucket”。 2、limit_conn_zone:用来限制同一时间连接数,即并发限制。 ####limit_req_zone限制访问频率 使用语法:limit_req_zone key zone rate key :定义限流对象,binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。 zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为 10M,名字为 myRateLimit 的内存区域。1M 能存储 16000 IP 地址的 访问信息,10M 可以存储 16W IP 地址访问信息。 rate: 用于设置最大访问速率,rate=10r/s 表示每秒最多处理 10 个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每 100 毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续 100 毫秒内又有请求到达,将拒绝处理该请求。 ```bash http { # 定义限流策略 limit_req_zone $binary_remote_addr zone=rateLimit:10m rate=1r/s ; # 搜索服务的虚拟主机 server { location / { # 使用限流策略,burst=5, #重点说明一下这个配置,burst 爆发的意思, #这个配置的意思是设置一个大小为 5 的缓冲区(队列)当有大量请求(爆发)过来时, # 超过了访问频次限制的请求可以先放到这个缓冲区内。 #nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回 503, #如果没有设置,则所有请求会等待排队。 limit_req zone=rateLimit burst=5 nodelay; proxy_pass http://192.168.1.100; } } } ``` ####limit_conn_zone限制最大连接数 使用语法:limit_conn_zone key zone key :定义限流对象,binary_remote_addr 是一种 key,表示基于 remote_addr(客户端 IP) 来做限流,binary_ 的目的是压缩内存占用量。 zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为 10M,名字为 myRateLimit 的内存区域。1M 能存储 16000 IP 地址的 访问信息,10M 可以存储 16W IP 地址访问信息。 举例: ```bash http { # 定义限流策略 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; # 搜索服务的虚拟主机 server { location / { # 对应的 key 是 $binary_remote_addr,表示限制单个 IP 同时最多能持有 1 个连接。 limit_conn perip 1; # 对应的 key 是 $server_name, #表示虚拟主机(server) 同时能处理并发连接的总数。 #注意,只有当 request header 被 后端 server 处理后,这个连接才进行计数。 limit_conn perserver 10 ; proxy_pass http://192.168.1.100 ; } } } ``` 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 梦白沙 (๑>ڡ<)☆谢谢老板~ 1元 2元 5元 10元 50元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 随手发现 2022-09-05 评论 472 次浏览