Nginx 로드밸런싱

김태호·2022년 5월 5일
0

Load Balancing 방식

라운드 로빈 방식 (Round Robin Method)

서버에서 들어온 요청을 순서대로 돌아가는 배정하는 방식이다.
클라이언트의 요청을 순서대로 분배하기 때문에 여러 대의 서버가 있고, 서버와의 연결이 오래 지속되지 않는 경우에 활용하기 적합하다.

적용

예시의 server에서 서로 사양이 다르다면 가중치를 다르게 줄 수 있습니다.
더 좋은 사양의 서버에게 높은 가중치를 줄 수 있습니다.
weight가 없으면 default로 1로 설정됩니다.

upstream backend {
    server backend1.example.com;
    server backend2.example.com weight=4;
    server backend3.example.com weight=2;
    server backend4.example.com weight=1;
}

IP 해시 방식 (IP Hash Method)

클라이언트의 IP 주소를 특정 서버에서 요청을 처리하는 방식이다.
사용자의 IP를 해싱해 로드를 분배하기 때문에 사용자가 항상 동일한 서버로 연결되는 것을 보장한다.

upstream backend {
    ip_hash;

    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}

최소 연결 방식 (Least Connection Method)

요청이 들어온 시점에 가장 적은 연결 상태를 보이는 서버에 우선적으로 트래픽을 분배한다.
자주 세션이 길어지거나, 서버에 분배된 트래픽들이 일정하지 않은 경우에 적합하다.

upstream backend {
    least_conn;

    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}

최소 리스폰 타임 방식(Least Response Time Method)

서버의 현재 연결 상태와 응답 시간을 모두 고려하여 트래픽을 분배하는 방식이다.
가장 적은 연결 상태와 가장 짧은 응답 시간을 보이는 서버에 우선적으로 로드를 배분하는 방식이다.

upstream backend {
    least_conn;

    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}

Generic HASH 방식

요청이 전송되는 서버는 텍스트 문자열, 변수 또는 조합일 수 있는 사용자 정의 키로 결정됩니다.

upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

Random 방식

각 요청은 임의로 선택한 서버로 전달됩니다.

# least_conn – The least number of active connections
upstream backend {
    random two least_time=last_byte;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}

Docker-compose 내부 NGINX 사용


nginx.conf 코드

# nginx/nginx.conf

user nginx;
worker_processes 1;

pid         /var/run/nginx.pid;

events {
        worker_connections  1024;
}

http {
        access_log  /var/log/nginx/access.log;
        error_log   /var/log/nginx/error.log;

        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        upstream nodeApps {
                server node-app1:3000;
                server node-app2:3000;
                server node-app3:3000;
        }

        server {
                listen 80;
                server_name http://localhost;

                location / {
                        proxy_pass         http://nodeApps;
                        proxy_redirect     off;
                        proxy_set_header   Host $host;
                        proxy_set_header   X-Real-IP $remote_addr;
                        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                }
        }

        sendfile        on;
        keepalive_timeout  65;
}

독립적인 NGINX 와 Docker-Compose Node Web Application 사용


nginx.conf

# nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 1024;
}

http {

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 10;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
}

node.conf

# conf.d/node.conf
server {
        listen 80;
        server_name localhost;

        location / {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;

                proxy_pass http://nodeApps;
                proxy_redirect off;
        }


}

upstream nodeApps {
        server 172.20.0.5:3000;
        server 172.20.0.6:3000;
        server 172.20.0.7:3000;
}

참고


  1. Nginx Beginner's Guide : http://nginx.org/en/docs/beginners_guide.html
  2. O'Reilly's Nginx Cook book 2019 (무료 배포 버전): https://www.nginx.com/wp-content/uploads/2017/07/Complete-NGINX-Cookbook-2019.pdf
  3. Nginx 소개 : https://www.nginx.com/resources/glossary/nginx/
  4. Nginx Directives: http://nginx.org/en/docs/http/ngx_http_upstream_module.html
    https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
  5. Load-balancing Methods : https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
  6. Nginx Embadded Variables :
    http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
    https://www.javatpoint.com/nginx-variables
  7. OSS - NGINX 소개서 : https://www.oss.kr/storage/app/public/oss/78/97/[Nginx]%20Solution%20Guide%20V0.95.pdf
  8. NGINX 권장사양 : https://docs.nginx.com/nginx-controller/admin-guides/install/nginx-controller-tech-specs/
profile
신입 모바일 개발자 입니다!

0개의 댓글