기타/인프라 구축과정

[Infra] 8. Blue-Green 무중단 배포(2) - Voda Project

배발자 2023. 4. 4.
반응형

이전 포스팅에서 무중단 배포를 하기 위한 컨테이너 구동 쉘 스크립트를 작성하였다.

해당 쉘 스크립트는 젠킨스 파이프라인에서 빌드된 이미지를 가지고 컨테이너를 생성한다. 

 

생성 흐름은 블루 컨테이너가 현재 존재하지 않는다면 블루 컨테이너를 띄운다.

만약 블루 컨테이너가 구동 중이라면 그린 컨테이너를 구동 시키고 블루 컨테이너를 내린다. 

 

이러한 프로세스로 스와핑이 발생한다. 그렇다면 사용자의 요청이 들어왔을 때 어떠한 컨테이너로 포트 포워딩을 할 지 결정하는 것은 개발자의 몫이다.

 

필자는 컨테이너의 Up/Down에 의해 변경되어지는 포트 포워딩을 upstream을 활용하여 무중단 배포를 진행하였다. 

 

 

| /etc/nginx/conf.d/voda.conf

upstream app {
    least_conn;
    server 도메인명:3000;
    server 도메인명:3001;
}
upstream back {
    least_conn;
    server 도메인명:8081;
    server 도메인명:8082;
}
upstream pback {
    least_conn;
    server 도메인명:8083;
    server 도메인명:8084;
}

server {

    root /home/ubuntu/test/frontend/dist;
    index index.html;

    listen 80;
    listen [::]:80;

    server_name 도메인명.io;

    if ($host = 도메인명) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    return 404; # managed by Certbot
}


server {

    root /home/ubuntu/test/frontend/dist;
    index index.html;


    listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot

    server_name 도메인명;

    ssl_certificate /etc/letsencrypt/live/도메인명/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/도메인명/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    
    location / {
      proxy_pass http://app;
      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;
    }

    location /api/ {
      proxy_pass http://back/;
      client_max_body_size 50M;
    }

    location /papi/ {
     client_max_body_size 50M;
     proxy_pass http://pback/;

    }
}

 

이는 Nginx 서버의 설정 파일이다. 내용이 길어서 블록별로 나눠서 정리하겠다. 

 

upstream app {
    least_conn;
    server 도메인명:3000;
    server 도메인명:3001;
}
upstream back {
    least_conn;
    server 도메인명:8081;
    server 도메인명:8082;
}
upstream pback {
    least_conn;
    server 도메인명:8083;
    server 도메인명:8084;
}

 

이 설정 파일은 웹 서버와 리버스 프록시를 구성하는 데 사용된다. 

upstream 블록: 이 블록은 리버스 프록시의 역할을 하는 Vue 서버(app), Java 서버(back),  Python(pback)에 대한 업스트림 정책을 설정한다. least_conn은 가장 적은 연결 수가 있는 서버로 요청을 보내는 로드 밸런싱 방법이다. 

 

 

server {

    root /home/ubuntu/test/frontend/dist;
    index index.html;

    listen 80;
    listen [::]:80;

    server_name 도메인명.io;

    if ($host = 도메인명) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    return 404; # managed by Certbot
}

 

이전 인프라 포스팅에서 정리한바있지만 다시 한 번 정리해본다. 

 

이 블록은 Nginx 서버의 가장 기본이 되는 설정이다. HTTP 프로토콜에서 사용하는 포트인 80 포트에서 서비스하며, 인증서 발급 도구인 Certbot에서 관리된다. 

return 문: 이 문은 요청이 해당 도메인을 사용하는 경우, HTTPS 프로토콜에서 사용하는 포트인 443 포트로 리다이렉션 한다. 

 

 

server {

    root /home/ubuntu/test/frontend/dist;
    index index.html;


    listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot

    server_name 도메인명;

    ssl_certificate /etc/letsencrypt/live/도메인명/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/도메인명/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    
    location / {
      proxy_pass http://app;
      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;
    }

    location /api/ {
      proxy_pass http://back/;
      client_max_body_size 50M;
    }

    location /papi/ {
     client_max_body_size 50M;
     proxy_pass http://pback/;

    }
}


listen 문

> 이 문은 HTTPS 프로토콜에서 사용하는 포트인 443 포트에서 서비스하도록 Nginx에게 지시한다. IPv6를 사용하며, ssl 및 http2 모듈을 사용하여 HTTPS 연결을 처리한다. 

server_name 문

> 이 문은 이 서버 블록의 도메인 이름을 설정한다. 

 

ssl_certificate 및 ssl_certificate_key 문 (Certbot에 의해 자동으로 생성)
> 이 문은 HTTPS 연결에 사용되는 SSL 인증서 및 개인 키를 설정.

 

include 및 ssl_dhparam 문 (Certbot에 의해 자동으로 생성)

> 이 문은 SSL 설정 파일을 포함하고 Diffie-Hellman 알고리즘에 대한 키를 설정.

 


location 블록

> 이 블록은 프록시 지시자를 정의.

/ 경로의 요청은 app upstream에 프록시. 

/api/ 경로의 요청은 back upstream에 프록시. 

/papi/ 경로의 요청은 pback upstream에 프록시. 

 

client_max_body_size 지시자는 업로드 파일의 최대 크기를 지정.

proxy_set_header 지시자

> 이 지시자는 프록시 요청의 헤더를 설정합니다. X-Real-IP 헤더는 클라이언트의 IP 주소를 서버에 전달하고, X-Forwarded-For 헤더는 클라이언트의 IP 주소와 프록시 서버의 IP 주소를 서버에 전달한다.

Host 헤더는 프록시 요청의 호스트 이름을 지정한다.

반응형

댓글