Library

NGINX 부하 분산 및 Proxy

Andrew's Akashic Records 2024. 9. 23. 14:49
728x90

Here is a digital illustration that visually represents the concept of a network server setup, including elements like NGINX, SSL, load balancers, and web caching. The image features a server rack with various labeled cables in a modern and minimalistic style

 

NGINX는 HTTP, TCP, 그리고 UDP 트래픽에 대한 부하 분산을 지원하여, 다양한 유형의 트래픽과 서비스에 유연하게 대응할 수 있습니다. 각 프로토콜에 대한 부하 분산 설정 방법과 기법을 자세히 살펴보겠습니다.

1. HTTP 부하 분산

HTTP 부하 분산은 웹 애플리케이션 서버에 대한 요청을 관리하는 가장 흔한 경우입니다. NGINX는 HTTP 레벨에서 세션 지속성, 다양한 로드 밸런싱 알고리즘 및 동적 콘텐츠 관리를 지원합니다.

http {
    upstream myapp {
        server server1.example.com;
        server server2.example.com;
        server server3.example.com;
    }

    server {
        listen 80;

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

2. TCP 부하 분산

TCP 부하 분산은 TCP 수준에서 어떤 유형의 네트워크 트래픽도 처리할 수 있습니다. 이를 통해 이메일 서버, FTP 서버 및 기타 TCP 기반 서비스의 부하를 분산할 수 있습니다.

 

NGINX에서 TCP 부하 분산을 설정하려면 stream 모듈을 사용해야 하며,  대부분의 경우 이 모듈이 설치되어 있지만 NGINX의 일부 버전에서는 이 모듈이 기본적으로 포함되어 있지 않을 수 있습니다. 이는 컴파일 시 --with-stream 매개변수를 포함시켜 활성화할 수 있습니다.

stream {
    upstream tcpapp {
        server tcpserver1.example.com:12345;
        server tcpserver2.example.com:12345;
    }

    server {
        listen 12345;
        proxy_pass tcpapp;
    }
}

3. UDP 부하 분산

UDP 부하 분산은 주로 스트리밍, 게임 서버, 일부 실시간 서비스에서 사용됩니다. NGINX의 stream 모듈을 사용하여 UDP 부하 분산을 설정할 수 있습니다.

stream {
    upstream udpapp {
        server udpserver1.example.com:12345;
        server udpserver2.example.com:12345;
    }

    server {
        listen 12345 udp;
        proxy_pass udpapp;
        proxy_responses 1;  # UDP 응답 수 조절 (기본값 1)
    }
}

4. Proxy 설정(포트 포워드)

NGINX steam 모듈을 이용해 Proxy Server기능을 설정할 수 있습니다.

user  nginx;
worker_processes  auto;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}
stream {

    server {# Real DB JMS WEB
        listen 8088;
        proxy_pass 10.30.1.6:8088;
    }

    server {# test DB JMS WEB
        listen 8089;
        proxy_pass 10.30.1.8:8088;
    }

    server {# Real DB SSH
        listen 50032;
        proxy_pass 10.30.1.6:50022;
    }

    server {# test DB SSH
        listen 50033;
        proxy_pass 10.30.1.8:50022;
    }
}

참고: NGINX Docker Install

Docker에서 NGINX를 설치하고 TCP/UDP 스트림 프록시를 구성하는 과정은 몇 단계로 나눌 수 있습니다. 이 설정은 NGINX를 통해 TCP 또는 UDP 트래픽을 특정 내부 네트워크 서비스로 포워딩하는 데 사용됩니다.

1. NGINX Docker 이미지 준비

Docker Hub에서 공식 NGINX 이미지를 사용할 수 있으며, 필요에 따라 커스텀 NGINX 이미지를 만들어 stream 모듈을 포함시킬 수 있습니다. 여기서는 기본적인 NGINX 이미지를 사용하고, 필요한 설정을 추가하는 방식을 설명합니다.

2. NGINX 컨테이너 생성 및 구성

컨테이너를 실행하기 전에, NGINX 설정 파일을 준비하고 이를 컨테이너 내부로 마운트해야 합니다. NGINX가 TCP/UDP 트래픽을 처리하도록 stream 블록을 설정 파일에 추가합니다.

Dockerfile 예시

커스텀 NGINX 이미지를 만들기 위한 Dockerfile:

# 기본 NGINX 이미지 사용
FROM nginx:latest

# NGINX 설정 파일 복사
COPY nginx.conf /etc/nginx/nginx.conf
COPY stream.conf /etc/nginx/stream.conf

# 포트 열기
EXPOSE 80 12345

# NGINX 실행
CMD ["nginx", "-g", "daemon off;"]

NGINX 설정 파일 (nginx.conf)

nginx.conf 파일에서는 HTTP 설정과 함께 스트림 설정을 포함할 수 있도록 수정합니다.

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    }
}

include /etc/nginx/stream.conf;

스트림 설정 파일 (stream.conf)

stream.conf 파일에서 실제로 TCP 또는 UDP 포트를 리스닝하고, 트래픽을 내부 서비스로 포워딩합니다.

stream {
    server {
        listen 12345;  # NGINX가 TCP/UDP 트래픽을 리스닝할 포트
        proxy_pass backend-service:12345;  # 내부 서비스의 호스트명과 포트
    }
}

3. Docker 컨테이너 실행

위의 Dockerfile과 설정 파일을 사용하여 NGINX 컨테이너를 빌드하고 실행합니다.

docker build -t custom-nginx .
docker run -d -p 80:80 -p 12345:12345 custom-nginx

이 명령은 NGINX 컨테이너를 백그라운드에서 실행하고, 호스트의 80번(HTTP)과 12345번 포트(TCP/UDP)를 컨테이너에 연결합니다.

728x90