Итак, нас, а точнее один из саИтов на виртуальном хостинге в очередной раз начали ддосить. Как правило, без специальных ддос железок такой клиент заворачивается на днс на 127.0.0.1, или в случае выделенного ip-адреса- на центральном маршрутизаторе. Но мы решили пойти по другому У нас есть nginx фронт-эндом, поэтому будем пытаться выстаивать под ддосом с 20000 хостов при помощи него. Подразумевается, что proxy_cache_path у нас уже описан в контексте http. Для начала обосомим перменную для которой ужесточим и пропишем правила: Code: set $special_limit 0; if ($http_host ~* 'example.com') { set $personal_limit 1; } if ($http_host ~* '[url=http://www.example.com]www.example.com[/url]') { set $personal_limit 1; } if ($personal_limit = 1) { rewrite ^(.*)$ /personal_limit last; } Далее, описываем локейшн: Code: location /personal_limit { internal; access_log logs/personal_limit_access.log cachestatus; error_log logs/personal_limit_error.log notice; proxy_connect_timeout 10; proxy_send_timeout 10; proxy_read_timeout 10; proxy_buffering on; proxy_ignore_headers "Expires" "Cache-Control"; proxy_pass http://$host$request_uri; proxy_cache personal_cache; set $request_uri_without_session $request_uri; if ($request_uri ~* "(.*)(\?|&)(sid|PHPSESSID|session)=([^&]+)(.*)$") { set $request_uri_without_session $1$5; } proxy_cache_key "$request_method$host$request_uri_without_session"; proxy_cache_valid 200 3d; proxy_cache_valid 304 1d; expires 3d; limit_conn by_vhost 10; }
Code: limit_req_zone $binary_remote_addr zone=lphp:10m rate=1r/s; limit_zone limz $binary_remote_addr 10m; limit_conn limz 10; В location \{ Code: limit_req zone=lphp burst=10 nodelay;