Rate Limiting in NGINX
February 22, 2014
I had trouble with a bot, coming from multiple ip addresses, that was hammering my website. NGINX allows you to easily rate limit such access, returning a 503 if the rate is exceeded.
In my nginx config I added the two limit_req lines shown here:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { listen 80; server_name site.co.uk site.com; access_log /home/drumcoder/log/site.access.log; gzip on; if ($host ~* www\.(.*)) { set $host_without_www $1; rewrite ^(.*)$ http://$host_without_www$1 permanent; } location / { proxy_pass http://localhost:9999; proxy_set_header X-REAL-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; limit_req zone=one burst=5; } location /site_media { root /home/drumcoder/web/site/; } location /media { root /home/drumcoder/web/site/django/contrib/admin/; }
Note that we're rate limiting access to the gunicorn process that runs django - we don't rate limit on the static files in /site_media
or /media