본문 바로가기
업무 기록/ETC

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

by code2772 2024. 6. 11.

[ 목차 ]

    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

    반응형