웹사이트 검색

Nginx로 속도 제한


이 페이지에서

  1. 1 HttpLimitReqModule 사용
  2. 링크 2개

이 문서에서는 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;
    [...]
}

이 영역을 하나라고 하며 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를 다시 로드하는 것을 잊지 마십시오.

systemctl nginx reload

2 링크

  • nginx: https://nginx.org/
  • HttpLimitReqModule: