daemon off; worker_processes 2; pid logs/nginx.pid; error_log logs/error.log notice; events { worker_connections 1024; } http { limit_req_zone $arg_key zone=smooth:1m rate=10r/s; limit_req_zone $arg_key zone=immediate:1m rate=10r/s; limit_req_zone $arg_key zone=threshold:1m rate=10r/s; limit_req_zone $arg_key zone=observe:1m rate=10r/s; limit_req_zone $arg_key zone=multi_ip:1m rate=10r/s; limit_req_zone $server_name zone=multi_total:1m rate=5r/s; log_format measured escape=json '{"key":"$arg_key","pid":$pid,"status":$status,' '"limit":"$limit_req_status","request_time":$request_time}'; server { listen 127.0.0.1:__FRONTEND_PORT__; server_name rate-lab; access_log logs/access.jsonl measured; limit_req_status 429; add_header X-Limit-Status $limit_req_status always; add_header X-Worker $pid always; location = /health { proxy_pass http://127.0.0.1:__BACKEND_PORT__; } location = /smooth { limit_req zone=smooth burst=5; proxy_pass http://127.0.0.1:__BACKEND_PORT__; } location = /immediate { limit_req zone=immediate burst=5 nodelay; proxy_pass http://127.0.0.1:__BACKEND_PORT__; } location = /threshold { limit_req zone=threshold burst=5 delay=2; proxy_pass http://127.0.0.1:__BACKEND_PORT__; } location = /observe { limit_req zone=observe burst=5; limit_req_dry_run on; proxy_pass http://127.0.0.1:__BACKEND_PORT__; } location = /multi { limit_req zone=multi_ip burst=5 nodelay; limit_req zone=multi_total burst=3; proxy_pass http://127.0.0.1:__BACKEND_PORT__; } } }