see: https://www.nginx.com/blog/rate-limiting-nginx/

Example Use Case

  • only allow 3.95.18.164 and 192.168.86.0/24
  • 3.95.18.164 is rate limited
  • 192.168.86.0/24 is NOT rate limited
geo $limit {
    default 1;
    192.168.86.0/24 0;
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=confluencelimit:10m rate=20r/s;

server {
    listen 8080;
    listen 80;
    server_name confluence.marcuschiu.com;

    allow 3.95.18.164;
    allow  192.168.86.0/24;
    deny all;

    access_log logs/confluence.marcuschiu.com/access.log;
    error_log  logs/confluence.marcuschiu.com/error.log;

    location / {
		limit_req zone=confluencelimit burst=20 nodelay;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;

        proxy_pass http://192.168.86.28:8090;
    }
}