Nginx 请求连接限制配置

Jan 30 2019 Linux

通过 APT 等包管理工具安装的 nginx 默认也安装了请求限制模块 limit_req_modulelimit_conn_module ,这两个官方模块可以配置客户端请求和者连接的数量。

那请求和连接有什么区别呢?

对于 HTTP 协议来说,其建立在 TCP 之上,1.0 版本一个 HTTP 请求就会产生一个 TCP 连接,对于1.1版本来说加入了 keep-alive 头部关键字可以串行复用了 TCP 请求,在 HTTP/2(包括SPDY)中,每个并发请求都被视为一个单独的连接,完全支持多路复用 TCP 连接。

所以说一个连接必定有一个请求,多个请求可能来源同一个连接。

设置语法

设置连接限制可以使用 limit_req_zone 以及 limit_req 两个指令来设置。

请求限制

limmit_req_zone 相当于初始化一个连接限制行为。

1
2
3
4
# limit_req_zone
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http

key 是指一个客户端的特征值,比如说 $remote_addr 指定以客户端IP来作为限制手段。

size 是指使用内存存储这些请求/连接池的大小限制,一般设置为10M即可。

rate 是指速率,比如说 1r/s 是每秒限制为一个请求。

例如:limit_req_zone $binary_remote_addr zone=azone:10m rate=1r/s;

定义好之后,就可以使用 limit_req 来对具体场景做限制,可以使用在 http,server 以及 location 区域。

1
2
3
4
# limit_req
Syntax: limit_req zone=name [burst=number] [nodelay];
Default: —
Context: http, server, location

burst 设置最多有多少个请求可以延迟到队列,如果加上nodelay就会立即丢弃其它的都会被立即丢弃并返回503状态码。

连接限制

而 limit_conn_zone 和 limit_conn 则和上述配置差不都。

limit_conn_zone 和 limit_req_zone 的区别就是没有了 rate 速率的设置,相应的连接限制数量要在 limit_conn 指令下完成。

1
2
3
4
# limit_conn_zone
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
1
2
3
4
# limit_conn
Syntax: limit_conn zone number;
Default: —
Context: http, server, location

例如:

1
2
3
4
5
6
7
8
9
10
limit_conn_zone $binary_remote_addr zone=test:10m;
server {
listen 80;
server_name _;

location / {
limit_conn test 1;
limit_rate 300k;
}
}