NGINX 부하 분산 및 Proxy
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)를 컨테이너에 연결합니다.