본문 바로가기
Server

[Server] Nginx를 이용해 로드밸런싱(Load Balancing) 구현하고 HTTPS 적용하기

by 케로베로 2021. 5. 24.

 현재 진행중인 프로젝트 shoe-auction은 지속적인 사용자 증가를 가정하고 진행하였기 때문에 확장성의 한계가 적은 Scale-out 방식의 확장을 채택하였다. 따라서 2개 이상의 WAS를 두고 있고, Session이나 Cahce 또한 외부 스토리지로 분리해 관리하도록 배포하는 과정을 모두 마쳤다.

 

 이제 필요한 것은 로드 밸런싱을 통해 2개 이상의 어플리케이션 서버에 트래픽을 적절히 분산시켜주는 것이다. 사실 NCP의 Load BalancerAWS의 Elastic Load Balancing 등의 서비스를 이용한다면 간편하게 콘솔내에서 구현할 수 있고 여러 설정 또한 가능하지만 처음 해보는 작업이기 때문에 Nginx에 직접 설정하는 방법을 통해 구현해보았다


👉 Nginx 서버에 로드밸런싱 설정

 우선 ssh로 서버에 접속하여 아래 명령어로 Nginx를 설치한다.

sudo yum install nginx

 

 그리고 웹 서버의 환경 설정 정보를 담고있는 nginx.conf 파일을 열어준다.

sudo vi /etc/nginx/nginx.conf

 

 upstream 블록에 upstream 서버 즉, origin 서버의 정보를 정의하고 프록시 설정으로 요청이 왔을 때 origin 서버에 요청을 전달하도록 설정한다.

 upstream origin {
        # 로드밸런싱 알고리즘 선택(default는 라운드 로빈)
        server 101.101.218.171:3000;
        server 118.67.119.228:3000;
    }

server {
	...
    location / {
    	proxy_pass http://origin;
        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;
    }
    
    ...
}

 

설정 파일을 저장하고 nginx를 재시작해줍니다.

sudo service nginx restart

 

그 후 만들어둔 테스트 요청을 보냈을 때 라운드 로빈 방식으로 순차적으로 두 오리진 서버에 번갈아가며 요청을 보내는 것을 확인할 수가 있습니다.

 


🔒 Nginx 서버에 SSL 인증서 적용으로 HTTPS로 접속하기

 기존에는 아직 인증서 설정을 하지 않았기 때문에 SSL 프로토콜 없이 HTTP를 통해 서버와 클라이언트와 평문으로만 통신하는 단계였습니다. 본 웹 어플리케이션은 이커머스의 성격을 띄고 있기 때문에 구매를 위한 개인정보 및 결제정보가 오고가기 때문에 인증서를 발급받고 HTTPS 통신을 강제해주는 것이 당연히 필요하다고 생각되어 적용하였습니다.

 

 

 SSL 인증서를 발급받기 위해서는 인증기관에게 보통 1년에 어느 정도의 비용을 결제한 후 서비스 받을 수 있지만, 오픈소스 인증서인  Let's Encrypt를 이용하면 무료로 발급이 가능하기 때문에 이를 적용하도록 하겠습니다.

 

우선 YUM epel 저장소를 추가해주어야 합니다.

yum install epel-release

 

그리고 인증서를 생성/관리 할 수 있도록 certbot을 설치합니다.

yum install certbot

 

현재 running 중인 nginx를 잠시 종료하고 인증서를 생성합니다.

service nginx stop

certbot certonly --standalone -d [도메인]

인증서 생성이 완료되었을 경우 /etc/letsencrypt/live/[도메인] 디렉토리 아래에 pem 형식의 인증서가 생성됩니다.

 

이를 Nginx에 적용하기 위해 다시 nginx.conf를 수정해야 합니다.

 server {
        listen 		80;
        server_name 	shoeauction.shop;
        return 301 	https://$host$request_uri;
    }

    server {
        listen       	443 ssl;
        server_name 	shoeauction.shop;

        ssl_certificate /etc/letsencrypt/live/shoeauction.shop/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/shoeauction.shop/privkey.pem;

        ...
    }

 https 서버 블록을 새로 만듭니다. https의 기본 포트 443에 ssl_certificate와 key를 등록해주고, 기존의 80포트로 오던 요청들 또한 443 https로 리다이렉트 해주도록 설정합니다.

 

 저장 후 다시 nginx를 동작시켜줍니다.

service nginx start

 

 그리고 다시 요청을 보내면 자물쇠 모양으로 HTTPS로 통신중임을 알려주며 아래와 같이 그 내용을 확인할 수 있습니다.

 


참고

 

7) 스프링부트로 웹 서비스 출시하기 - 7. Nginx를 활용한 무중단 배포 구축하기

이번 시간엔 무중단 배포 환경을 구축하겠습니다. (모든 코드는 Github에 있습니다.) 7-1. 이전 시간의 문제점? 이전 시간에 저희는 스프링부트 프로젝트를 Travis CI를 활용하여 배포 자동화 환경을

jojoldu.tistory.com