标签:err serve fir default 算法 图片 forward list remote
该模块使用的是漏斗算法来进行限制。
官方的配置示例如下:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}
参数的简单解释:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req zone=one burst=5 nodelay;
测试部分:
我自己写了一个简单的Go脚本进行测试,代码如下
package main
import (
"fmt"
"net/http"
"time"
)
func curl(){
r,err := http.Get("https://www.fengcc.club/")
if err != nil{
fmt.Println(err.Error())
}
fmt.Println(time.Now(), r.Status)
}
func main(){
for i := 0; i < 100; i++{
go curl()
}
time.Sleep(time.Millisecond*4000)
}
100次请求开始的时间为10:48:38.8205601
,结束时间为10:48:40.9850476
,共有8个请求成功,其他均为503.符合预期.
官方示例如下:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /download/ {
limit_conn addr 1;
}
配置和功能和上面的模块类似,就不在介绍。
前言:当使用CDN或负载均衡技术时,我们获取的remote_IP,很可能不是客户端的IP,因此我们需要获取客户端的真实IP再去做限制,可以通过"X-Forwarded-For"来获取。
nginx配置如下:
http {
#获取客户端的真实IP
map $http_x_forwarded_for $clientRealIp {
default $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}
#设置IP白名单,
geo $whiteiplist {
default 1;
127.0.0.1 0;
134.175.207.203 0;
#221.218.233.79 0;
}
#对内部的IP不设限
map $whiteiplist $all_limit {
1 $clientRealIP;
0 "";
}
#对IP做的限制
limit_conn_zone $all_limit zone=two:10m;
limit_conn two 5;
limit_req_zone $all_limit zone=one:10m rate=2r/s;
server {
location / {
limit_req zone=one burst=5 nodelay;
}
}
}
注:如果不生效,可以尝试重启软件。
标签:err serve fir default 算法 图片 forward list remote
原文地址:https://www.cnblogs.com/feng0919/p/13377933.html