업무 기록/ETC

L4 로드벨런싱과 암호화 및 VIP

code2772 2024. 6. 11. 10:34
728x90
반응형

기존 회사의 웹서버 로드벨런싱의 경우 L4에서 VIP 를 통해 여러 서버로 로드벨런싱을 해주고 해당 Nginx에서  동일 서버인 Node로 전달 후  Node 에서 WAS 간에 로드벨런싱이  존재하였다. 
Nginx 에서 Node 간 프론트 딴에도 로드벨런싱을 통한 고가용성과 부하분산을 위해 작업을 하였고 해당 내용을 정리하였다

 


먼저 보이는 부분이 기존 구조이다. 



이렇게 변경할 계획이다.

 

 

 

간단 로드벨런싱과 VIP에 대해서 설명

 

L4 로드벨런싱
네트워크 트래픽을 TCP/UDP 레벨에서 분산시키는 방식이다. 

특징
프로토콜 레벨 분산 - IP 주소와 포트 번호를 기준으로 트래픽을 분산
속도 - 패킷 검사하고 분산 과정이 단순하며 헤더 정보만 검사하기 때문에 L7 보다 오버헤드 감소
투명성 - 실제 서버의 존재를 알지 못하며, 모든 요청은 로드벨런서를 통헤 전달
고강용성 - 서버 장애를 감지하고 요청을 다른 서버로 분산

VIP(Cirtual IP Address)
가상 IP 주소를 의미한다. 여러 물리적 서버가 하나의 IP 주소로 접근될 수 있게 한다.
특징으로는 단일 접근점, 유연성, 트래픽 관리, 고가용성이 존재한다.

 

 

 

[ 코드 설명 ]

먼저 테스트 서버를 하나 받아 사전 테스트를 하였다. 기본적으로 CMake, pm2, Nginx, jdk, node 등 기본적인 것들이 깔려있지는 않았지만 이는 설명하지 않고 Nginx 설정 변경 부분만 설명하겠다.
 
# 기본적인 Nginx 설치 장소  
/usr/local

# 설정 파일 위치
/usr/local/nginx/conf/conf.d

 

 

upstream backend_servers {
	# 첫 번째 서버
    server xxxx.xxxx.xxxx.21:3000 max_fails=3 fail_timeout=3s;
    # 두 번째 서버
    server xxxx.xxxx.xxxx.22:3000 backup max_fails=3 fail_timeout=3s;
}

 

Nginx가 트래픽을 분산할 여러 서버를 정의하고 기본적으로 21번이 메인서버고, 22번은 시본서버가 실패한 경우 처리한다.

 

 

server {
    listen   80;
        server_name  xxxxx.co.kr xxxx.xxxx.xxxx.21 xxxx.xxxx.xxxx.21;
        if ($host = "xxxxx.co.kr") {
                return 301 https://dev.bizwideshot.co.kr;
        }
        if ($host = "xxxx.xxxx.xxxx.21") {
                return 301 https://xxxx.co.kr;
        }
        if ($host = "xxxx.xxxx.xxxx.21") {
                return 301 https://xxxx.co.kr;
        }
}

 

HTTP 포트 80에서 들어오는 수신, 모든 요청을 HHTPS로 리디렉션한다. 이를 통해 모든 트래픽을 암호화된 채널로 전환한다.

 

 

server {

    server_name  xxxx.co.kr;
    listen 443 ssl;

    access_log  /home/xxxx/logs/sms.access.log;
    error_log   /home/xxxx/logs/sms.error.log;

	# 클라이언트 최대 요청 바디 크기 설
    client_max_body_size 1G;

    ssl_certificate /home/xxxx/sms_sj/ssl/Wildcard.xxxx.co.kr.pem;         #생성된 인증서경로
    ssl_certificate_key /home/xxxx/sms_sj/ssl/Wildcard.xxxx.co.kr.key;     #생성된 개인키
	
	# 지원할 SSL/TLS 프로토콜 섷
    ssl_protocols TLSv1.2 TLSv1.3;
    # SSL 암호 스위트 설
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';  
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=63072000" always;


    location / {
	  # 클라이언트 요청 헤더를 백앤드 서버로 전
      proxy_set_header Host $host;
      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_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_cache_bypass $http_upgrade;

      proxy_connect_timeout 120;
      proxy_send_timeout 120;
      proxy_read_timeout 120;
	
	
	# 백앤드 서버 그룹으로 트래픽 전달
     proxy_pass http://backend_servers;
      proxy_redirect off;
    }

    gzip on;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_min_length  1000;
    gzip_disable     "MSIE [1-6]\."
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    location ~ /\.ht {
        deny all;
    }
}

 

HTTPS 트래픽을 처리한다. 해당 도메인에 대한 요청을 수신하고 SSL 인증서를 사용하여 트래픽을 암호화한다. 클라이언트의 요청을 기존에 정의한 'backend_servers'로 정의된 서버 그룹으로 전달하여 로드벨런싱을 수행한다. 




# 해당 포트 막혀있는 경우

# 확인
firewall-cmd --zone=public --list-all

# 사용하기
firewall-cmd --zone=public --add-port=3000/tcp --permanent

반응형