기존 회사의 웹서버 로드벨런싱의 경우 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
'업무 기록 > ETC' 카테고리의 다른 글
개발자와 비개발자와의 효과적인 협업 가이드: 소통의 벽을 허물다 (2) | 2024.11.22 |
---|---|
Kotlin(코틀린) 코루틴으로 비동기 프로그래밍 (0) | 2024.11.20 |
[Oracle] PL/SQL정의, 기능, 대량 데이터 추가 (1) | 2024.05.22 |
SSL 인증서 확인 및 Nginx 인증서 변경 Openssl (2) | 2024.04.22 |
Vscode -VSLX 오프라인 설치, 내부망 NextJs 설치 실행, .npmrc 변경, 확장파일 위치 (2) | 2024.03.29 |