limit-conn

限制并发请求(或并发连接)插件。

属性

名称类型必选项默认值有效值描述
connintegerrequiredconn > 0允许的最大并发请求数。超过 conn 的限制、但是低于 conn + burst 的请求,将被延迟处理。
burstintegerrequiredburst >= 0允许被延迟处理的并发请求数。
default_conn_delaynumberrequireddefault_conn_delay > 0默认的典型连接(或请求)的处理延迟时间。
only_use_default_delaybooleanoptionalfalse[true,false]延迟时间的严格模式。 如果设置为true的话,将会严格按照设置的时间来进行延迟
keyobjectrequired[“remote_addr”, “server_addr”, “http_x_real_ip”, “http_x_forwarded_for”, “consumer_name”]用户指定的限制并发级别的关键字,可以是客户端 IP 或服务端 IP。
例如,可以使用主机名(或服务器区域)作为关键字,以便限制每个主机名的并发性。 否则,我们也可以使用客户端地址作为关键字,这样我们就可以避免单个客户端用太多的并行连接或请求淹没我们的服务。
当前接受的 key 有:”remote_addr”(客户端 IP 地址), “server_addr”(服务端 IP 地址), 请求头中的”X-Forwarded-For” 或 “X-Real-IP”, “consumer_name”(consumer 的 username)。
rejected_codestringoptional503[200,…,599]当请求超过 conn + burst 这个阈值时,返回的 HTTP 状态码
rejected_msgstring可选非空当请求超过 conn + burst 这个阈值时,返回的响应体。
allow_degradationboolean可选false当插件功能临时不可用时是否允许请求继续。当值设置为 true 时则自动允许请求继续,默认值是 false。

注:key 是可以被用户自定义的,只需要修改插件的一行代码即可完成。并没有在插件中放开是处于安全的考虑。

在 stream 代理中使用该插件时,只有 remote_addrserver_addr 可以被用作 key。另外设置 rejected_code 毫无意义。

如何启用

下面是一个示例,在指定的 route 上开启了 limit-conn 插件:

  1. curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{ "methods": ["GET"], "uri": "/index.html", "id": 1, "plugins": { "limit-conn": { "conn": 1, "burst": 0, "default_conn_delay": 0.1, "rejected_code": 503, "key": "remote_addr" } }, "upstream": { "type": "roundrobin", "nodes": { "39.97.63.215:80": 1 } }}'

你也可以通过 web 界面来完成上面的操作,先增加一个 route,然后在插件页面中添加 limit-conn 插件: limit-conn - 图1

test plugin

上面启用的插件的参数表示只允许一个并发请求。 当收到多个并发请求时,将直接返回 503 拒绝请求。

  1. curl -i http://127.0.0.1:9080/index.html?sleep=20 &
  2. curl -i http://127.0.0.1:9080/index.html?sleep=20<html><head><title>503 Service Temporarily Unavailable</title></head><body><center><h1>503 Service Temporarily Unavailable</h1></center><hr><center>openresty</center></body></html>

这就表示 limit-conn 插件生效了。

移除插件

当你想去掉 limit-conn 插件的时候,很简单,在插件的配置中把对应的 json 配置删除即可,无须重启服务,即刻生效:

  1. curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{ "methods": ["GET"], "uri": "/index.html", "upstream": { "type": "roundrobin", "nodes": { "39.97.63.215:80": 1 } }}'

现在就已经移除了 limit-conn 插件了。其他插件的开启和移除也是同样的方法。