Nginx map value not matched when used as input of another map

Linna.Ding linnading1989 at
Mon Jul 18 17:59:06 UTC 2016

I just tested with a single map "cache_key", and the rate limiting doesn't
work, the $cache_key was logged as empty string. But changing
$upstream_cache_status to non-upstream variables like $remote_addr and
adding an IP match value will make the rate limiting work.
The zone I defined like so:
       limit_req_zone $cache_key zone=cache_host:1m rate=1r/m;
       map $upstream_cache_status $cache_key {
           HIT $host;
           EXPIRED $host;
           - $host;
           default "";
And I use it in one of my server chunk with limit_req directive below:
    limit_req zone=cache_host busrt=1;

Since I am using Nginx as reverse proxy, is this because
$upstream_cache_status value is set after the request is sent to origin
server and got the response, while $cache_key is used in rate limit zone
which checked before the request was sent to origin server?
If so, is there a recommended way to implement rate limiting only for
request that MISS cache?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the nginx-devel mailing list