웹사이트 검색

nginx로 속도 제한


이 페이지에서

  1. 1 HttpLimitReqModule(ngx_http_limit_req_module) 사용
  2. 2 링크

이 문서에서는 nginx HttpLimitReqModule을 사용하여 지정된 세션에 대한 요청 수를 제한하는 방법을 설명합니다. 예를 들어 초당 여러 요청을 수행하는 봇에 의해 사이트가 망가져 서버 로드가 증가하는 경우에 유용합니다. ngx_http_limit_req_module을 사용하면 속도 제한을 정의할 수 있으며 방문자가 이 속도를 초과하면 503 오류가 발생합니다.

1 HttpLimitReqModule(ngx_http_limit_req_module) 사용

nginx.conf를 엽니다...

nano /etc/nginx/nginx.conf

... 그리고 세션 상태가 저장되는 영역을 정의합니다. 이것은 http {} 컨테이너 내부에 있어야 합니다.

http {
    [...]
    limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;
    [...]
}

이 영역을 하나라고 하며 10MB의 저장 공간이 할당됩니다. $remote_addr 변수 대신 상태 크기를 64바이트로 줄이는 $binary_remote_addr 변수를 사용합니다. 1MB 영역에는 약 16,000개의 주가 있을 수 있으므로 10MB는 약 160,000개의 상태를 허용하므로 방문자에게 충분해야 합니다. 속도는 초당 하나의 요청으로 제한됩니다. 여기서는 정수 값을 사용해야 하므로 제한을 초당 요청의 절반으로 설정하려면 30r/m(분당 요청 30개)를 사용합니다.

이 제한을 적용하기 위해 limit_req 지시문을 사용합니다. http {}, 서버 {} 및 위치 {} 컨테이너에서 이 지시문을 사용할 수 있지만 제 생각에는 요청을 앱 서버(PHP-FPM, mongrel 등)로 전달하는 위치 {} 컨테이너에서 가장 유용합니다. 그렇지 않으면 이미지, CSSJavaScript 파일이 많은 단일 페이지를 로드하는 경우 단일 페이지 요청으로 지정된 속도 제한을 초과할 수 있기 때문입니다.

따라서 이것을 위치 ~ \.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 구역=1 버스트=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를 다시 로드하는 것을 잊지 마십시오.

service nginx reload

2 링크

  • nginx: http://nginx.net/
  • HttpLimitReqModule:

저자 소개