Nginx CBC (6): 对连接进行流控
这是捷客兄弟的第 15 篇原创
Nginx CBC (6): 对连接进行流控
防止把水池撑爆的一种方式,是把进水的管子弄小一点。
Nginx 其中一种广泛使用的方式是作为软负载均衡,即客户端请求先到达 Nginx,再路由到上游 upstream 服务器。拿 Java Web 应用来说,上游服务器往往是跑着 Weblogic 或者 Tomcat 等 Java 容器的 Ap,它们能承受的连接数大大低于 Nginx。
为了“保护“上游服务器,可以考虑在 Nginx 对连接进行流控。
单个 server 的例子
道理不多说,先来看一个简单的例子,Nginx 配置单个 server。
limit_conn_zone $server_name zone=perserver:10m;
server {
listen 80;
server_name localhost;
error_log logs/myerror.log info;
limit_conn perserver 1;
limit_conn_status 500;
limit_conn_log_level warn;
limit_rate 50;
location / {
root html;
index index.html index.htm;
}
}
这个例子里面出现了很多之前没有讨论到的命令,没有关系,先把例子跑起来。
期待的效果如下:
1.执行 curl localhost
,能看到服务器的返回内容特别慢,index.html
的内容几乎是逐行显示出来的;2.第一步成功之后,再次跑 curl localhost
,这次不用等待内容全部返回,按 Ctrl + Z
让当前进程切换到后台。然后再跑一次 curl localhost
。
第 2 步实验成功的结果如下。
结果1 :返回了 500 的出错页面
<html>
<head><title>500 Internal Server Error</title></head>
<body>
<center><h1>500 Internal Server Error</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>
结果2 :在 error.log 日志中有一条 warn
级别的拒绝记录。
[warn] 64
实验解析
这里我们使用到了 Nginx 标准模块 ngx_http_limit_conn_module
中的几个指令,从实验结果可以看到,这个模块提供了不少流控功能,这些配置是对所有 worker 进程生效的。
•limit_conn_zone
: 定义共享内存(包括大小),以及 key 关键字。•limit_conn
: 定义限制并发连接数。•limit_conn_log_level
: 定义当限制发生时的日志级别。•limit_conn_status
: 定义当限制发生时向客户端返回的错误码。
注意在上面实验中,使用到的流控方式是 perserver
,按照 server
维度进行控制。
多个 server 的例子
下面例子中,配置了两个 server ,验证是否按照我们设想,Nginx 是按 server
维度进行管控。
limit_conn_zone $server_name zone=perserver:10m;
server {
listen 80;
server_name localhost;
error_log logs/myerror.log info;
limit_conn perserver 1;
limit_conn_status 500;
limit_conn_log_level warn;
limit_rate 10;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 8000;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
期待效果
•执行 curl localhost
,能看到服务器的返回内容特别慢,index.html
的内容几乎是逐行显示出来的;•执行 curl localhost:8000
,页面瞬间返回。
进一步思考
•本文没有注明 4 条指令的 Syntext
,Default
,Context
,大家知道去哪里查吗?•limit_conn_zone
还可以通过什么维度进行控制?
-----------------------
在我们这个地方,你必须不停地奔跑,才能留在原地。
长按下图二维码关注我吧