需求背景:需要在nginx上新增端口用于DNS服务器的健康检查
DNS做健康检查原理:DNS除了做域名解析,还可以用于基于健康检查的流量分发:DNS服务器可以定期检查服务器的健康状态,并根据服务器的可用性和负载情况进行流量分发。如果某个服务器不可用或者负载过高,DNS服务器可以暂时将其从解析结果中移除,避免将请求发送到故障或负载的服务器上。在基于健康检查的分发中,一个或多个监控器会定期向服务器发送健康检查求情。这些检查请求可以是简单的PING请求、HTTP请求、TCP连接请求或其他协议的请求。监控器根据服务的响应时间、状态码、连接可用性等指标来判断服务器的健康状态。
nginx的具体配置如下:
http {
...
map $http_x_forword_for $real_ip {
default $binary_remote_addr;
"~^(.+)$" $1;
}
limit_req_zone $real_ip_zone=req_limit_per_ip:10m rate=1r/m;
limit_conn_zone $real_ip zone=c:10m;
server {
linten 19902;
server_name localhost;
server_tokens off;
keepalive_timeout 0;
send_timeout 5s;
client_body_timeout 1s;
client_max_body_size 1k;
limit_req_zone=req_limit_per_ip burst=1;
limit_conn limit_conn_zone 1;
if($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})'){
set $ymd $1;
}
access_log logs/access-19902-$ymd.log main;
error_log logs/error-19902.log;
location /{
return 200 "";
}
}
...
}
1.限制连接数为1,为什么压测没有拦截住?
当请求处理时间很短并且没有阻塞操作时,nginx会尽快的完成请求并释放连接,然后处理下一个请求。这样即使“limit_conn”设置为1,由于连接处理时间很短,它无法在同一时间内收到多个请求,因此不会触发限制。
但是,如果添加睡眠时间,请求的时间变长,nginx会保持处于繁忙状态,直到请求完成。这样当第二个请求到达时,nginx会检查连接的繁忙状态,并根据“limit_conn”指令的设置将其放入等待队列,知道前一个请求完成。这样就完成了对并发数的限制。
2.限制请求速率,burst参数的默认值是多少?配置为0效果是什么?
默认值是0,不允许显示配置。表示不允许任何短期请求超过限制。例如我配置的是一分钟一个请求,短期内(一分钟)只允许一个请求;即使配置的是一分钟五个请求,短期内并发情况下也只允许一个请求。
3.如果x_forwarded_for没有值,且没有默认值,限速会怎样?
没有源ip,限速也没有作用了;且无报错信息。