웹사이트 검색

NGINX에서 연결(요청) 수를 제한하는 방법


NGINX에는 사용자가 웹사이트, 웹 애플리케이션 및 기타 웹 리소스에 대한 트래픽을 제어할 수 있는 다양한 모듈이 함께 제공됩니다. 트래픽이나 액세스를 제한하는 주요 이유 중 하나는 DoS(서비스 거부) 공격과 같은 특정 종류의 공격이나 남용을 방지하는 것입니다.

NGINX에는 사용이나 트래픽을 제한하는 세 가지 주요 방법이 있습니다.

  1. 연결(요청) 수를 제한합니다.
  2. 요청 비율을 제한합니다.
  3. 대역폭 제한.

위의 NGINX 트래픽 관리 접근 방식은 사용 사례에 따라 정의된 키를 기반으로 제한하도록 구성할 수 있으며, 가장 일반적인 것은 클라이언트의 IP 주소입니다. NGINX는 세션 쿠키 등과 같은 다른 변수도 지원합니다.

3부로 구성된 시리즈 중 첫 번째 부분에서는 웹사이트/애플리케이션을 보호하기 위해 NGINX의 연결 수를 제한하는 방법에 대해 논의하겠습니다.

  • NGINX에서 연결(요청) 수를 제한하는 방법 – 1부
  • NGINX에서 연결(요청) 속도를 제한하는 방법 – 2부
  • NGINX에서 대역폭 사용량을 제한하는 방법 – 3부

NGINX는 서버에서 처리 중인 요청이 있고 전체 요청 헤더를 이미 읽은 경우에만 연결을 제한으로 간주한다는 점을 명심하세요. 따라서 모든 클라이언트 연결이 계산되는 것은 아닙니다.

NGINX의 연결 수 제한

먼저 limit_conn_zone 지시문을 사용하여 다양한 키에 대한 연결 측정항목을 저장하는 공유 메모리 영역을 정의해야 합니다. 앞서 언급했듯이 키는 텍스트, 클라이언트의 원격 IP 주소와 같은 변수 또는 이 둘의 조합일 수 있습니다.

HTTP 컨텍스트 내에서 유효한 이 지시문은 keyzone(zone_name:size 형식)이라는 두 가지 매개변수를 사용합니다.

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

거부된 요청에 반환되는 응답 상태 코드를 설정하려면 HTTP 상태 코드를 매개변수로 사용하는 limit_conn_status 지시어를 사용하세요. HTTP, 서버 및 위치 컨텍스트 내에서 유효합니다.

limit_conn_status 429;

연결을 제한하려면 다음 구성 스니펫에 표시된 대로 limint_conn 지시어를 사용하여 사용할 메모리 영역과 허용되는 최대 연결 수를 설정하세요. 이 지시문은 HTTP, 서버 및 위치 컨텍스트 내에서 유효합니다.

limit_conn   limitconnbyaddr  50;

전체 구성은 다음과 같습니다.

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;
limit_conn_status 429;

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    limit_conn   limitconnbyaddr  50;

    #include snippets/error_pages.conf;
    proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        proxy_pass http://api_service;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
   }
}

파일을 저장하고 닫습니다.

그런 다음 다음 명령을 실행하여 NGINX 구성이 올바른지 확인하세요.

sudo nginx -t

다음으로 NGINX 서비스를 다시 로드하여 최근 변경 사항을 적용합니다.

sudo systemctl reload nginx

Nginx 연결 제한 확인

클라이언트가 허용된 최대 연결 수를 초과하면 NGINX는 "429 요청이 너무 많습니다" 오류를 클라이언트에 반환하고 오류에 아래와 같은 항목을 등록합니다. 로그 파일:

2022/03/15 00:14:00 [error] 597443#0: *127 limiting connections by zone "limitconnbyaddr", client: x.x.x.x, server: testapp.tecmimt.com, request: "GET /static/css/main.63fdefff.chunk.css.map HTTP/1.1", host: "testapp.tecmimt.com"

애플리케이션에 대한 Nginx 연결 수 제한

$server_name 변수를 사용하여 특정 서버에 대한 연결 수를 제한할 수도 있습니다.

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $server_name zone=limitbyservers:10m;
limit_conn_status 429;

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

     limit_conn  limitbyservers  2000;

    #include snippets/error_pages.conf;
    proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        proxy_pass http://api_service;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
   }
}

이 구성을 사용하면 NGINXtestapp.linux-console.net 애플리케이션을 구동하는 가상 서버에 대한 총 연결 수를 2000개 연결로 제한할 수 있습니다.

참고: 클라이언트의 IP를 기반으로 연결을 제한하는 것은 단점이 있습니다. 특히 애플리케이션에 액세스하는 많은 사용자가 동일한 네트워크에 있고 NAT 뒤에서 작동하는 경우 두 명 이상의 사용자에 대한 연결을 제한하게 될 수 있습니다. 모든 연결은 동일한 IP 주소에서 시작됩니다.

이러한 시나리오에서는 애플리케이션 수준에서 클라이언트를 식별할 수 있는 NGINX에서 사용할 수 있는 하나 이상의 변수를 사용할 수 있습니다. 예를 들면 세션 쿠키가 있습니다.

다음 Nginx 관련 기사도 좋아할 것입니다.

  • NGINX에서 사용자 정의 404 오류 페이지를 만드는 방법
  • NGINX에서 클라이언트 IP 주소를 기반으로 액세스를 제어하는 방법
  • NGINX에서 콘텐츠를 캐시하는 방법
  • Nginx에서 HTTP/2.0을 활성화하는 방법
  • Linux에서 Nginx를 HTTP 로드 밸런서로 사용하는 방법

지금은 그게 다야! 이 시리즈의 다음 부분에서는 요청 속도를 제한하는 NGINX의 또 다른 유용한 트래픽 관리 기술에 대해 논의하겠습니다. 그때까지 우리와 함께 있어주세요.