我们有API应用程序,该应用程序使用许多客户。每个客户都有API令牌,他在GET
请求中传递了该令牌。
访问日志示例:
GET /api/token=FhrHd25Sk6REmwqn32Ssdf/bla?/bla/bla
我们想为令牌创建白名单,并使用nginx限制每个令牌的每秒连接数。
您能为执行此任务提供一些建议吗?
limit_req
指令控制每秒各种键的最大连接数(在这种情况下,key是API令牌)。有关详细信息,请参见this document。
您可以使用map
指令提取API令牌。有关详细信息,请参见this document。
例如:
map $request_uri $token {
~/token=freepass/ '';
~/token=(?<thetoken>[^/]+)/ $thetoken;
default 'everybody';
}
limit_req_zone $token zone=one:10m rate=1r/s;
server {
...
limit_req zone=one;
...
}
在上面的示例中,令牌“ freepass”将具有无限访问权限,因为它没有为key定义值。使用命名捕获来提取令牌。 default子句将没有定义令牌的请求放入同一key,这可能是您想要的,也可能不是您想要的,因为这些请求将受到严格限制。