Rate Limit not applied when mapping $upstream_http_ headers

Maxim Dounin mdounin at mdounin.ru
Fri Oct 1 17:33:40 UTC 2021


On Fri, Oct 01, 2021 at 10:47:01AM +0200, Markus Grobelin wrote:

> Hy everybody, 
> I have a reverse-proxy setup with an upstream application that 
> sets a header (x_tenant_id). 
> Based on that headers value, I want to apply a rate limit to 
> clients. 
> I verified the rate limit applies* properly, when a usual 
> request header (e.g. $http_x_tenant_id) is mapped. However the 
> config below does not map $upstream_http_x_tenant_id** at all. 
> Any advice how to achieve rate limiting using such 
> $upstream_http_ headers? 

Request rate limiting, as configured with the limit_req rate 
directive (not to be confused with response transmission rate 
limiting, limit_rate), happens before processing a request, that 
is, before the request is sent to the upstream server and a 
response is received.  As such, you cannot rely on variables only 
available when a response is received from the upstream server, 
such as $upstream_http_* variables.

If you want to reject requests based on the information only 
available on the upstream server, the best solution might be to 
actually reject requests on the upstream server.  If you have to 
do it on nginx for some reason, it should be possible to configure 
things using X-Accel-Redirect redirections, though this going to 
be a complex configuration, and it will do two upstream request 
instead of just one.  A better approach might be to re-think your 
limiting configuration to use something directly available from 
the request.

Maxim Dounin

More information about the nginx mailing list