서버 설정 · 1 min read · Oct 11, 2025
Nginx로 속도 제한하기

이 문서에서는 nginx HttpLimitReqModule을 사용하여 주어진 세션에 대한 요청 수를 제한하는 방법을 설명합니다. 예를 들어, 사이트가 초당 여러 요청을 수행하는 봇에 의해 공격받아 서버 부하가 증가하는 경우 유용합니다. HttpLimitReqModule을 사용하면 속도 제한을 정의할 수 있으며, 방문자가 이 속도를 초과하면 503 오류가 발생합니다.
1 HttpLimitReqModule 사용하기
nginx.conf 파일을 엽니다…
nano /etc/nginx/nginx.conf… 그리고 세션 상태가 저장되는 영역을 정의합니다. 이는 http {} 컨테이너 내부에 있어야 합니다:
http {
[...]
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
[...]
}이 영역은 one이라고 불리며 10MB의 저장 공간이 할당됩니다. 변수 $remote_addr 대신 $binary_remote_addr 변수를 사용하여 상태 크기를 64바이트로 줄입니다. 1MB 영역에 약 16,000개의 상태가 있을 수 있으므로 10MB는 약 160,000개의 상태를 허용하므로 방문자에게 충분할 것입니다. 속도는 초당 하나의 요청으로 제한됩니다. 여기서 정수 값을 사용해야 하므로, 초당 반 요청으로 제한하고 싶다면 30r/m (분당 30 요청)을 사용해야 합니다.
이 제한을 적용하기 위해 limit_req 지시어를 사용합니다. 이 지시어는 http {}, server {}, 및 location {} 컨테이너에서 사용할 수 있지만, 제 생각에는 요청을 앱 서버(PHP-FPM, mongrel 등)로 전달하는 location {} 컨테이너에서 가장 유용합니다. 그렇지 않으면 많은 이미지, CSS 및 JavaScript 파일이 포함된 단일 페이지를 로드할 경우 단일 페이지 요청으로 주어진 속도 제한을 초과할 수 있습니다.
따라서 이를 location ~ .php$ {} 컨테이너에 넣어 보겠습니다:
[...]
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
limit_req zone=one burst=5;
}
[...]limit_req zone=one burst=5;는 이 속도 제한이 이전에 정의한 세션 저장 영역에 속함을 지정합니다(즉, zone=one 때문에) 이는 속도 제한이 1r/s임을 의미합니다. 버스트 옵션의 의미를 일종의 대기열로 상상할 수 있습니다. 이는 속도 제한을 초과하면 다음 요청이 지연되며, 대기열에 있는 요청이 버스트 매개변수에 지정된 것보다 많을 경우에만 503 오류가 발생함을 의미합니다(예: 이렇게:

).
이 대기열을 사용하고 싶지 않다면(즉, 누군가 속도 제한을 초과하면 즉시 503을 전달하고 싶다면) nodelay 옵션을 사용해야 합니다:
[...]
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
limit_req zone=one burst=5 nodelay;
}
[...]변경 사항을 적용하려면 nginx를 다시 로드하는 것을 잊지 마세요:
systemctl nginx reload2 링크
- nginx: https://nginx.org/
- HttpLimitReqModule: http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.