[Nginx] 로드밸런싱 직접 구성해보기

[원본 링크]

nginx는 '리버스 프록시'라고 부르는 중개 시스템 중 하나다.
가장 대표적인 사용처 중 하나는, 서버 앞단에 달아서 유저단의 진입점으로 삼고, 로드밸런싱 등을 수행하는 것이다.

구조도다.

본 포스트에서는 AWS EC2 서비스를 이용해 로드밸런서 서버와 앱서버 2개를 띄워 실습을 해보도록 하겠다.

보통 AWS 등의 클라우드 서비스를 이용하면 더 편리하고 뛰어난 자체 로드밸런서를 제공해주기 때문에, 실제로 이렇게 사용할 일은 별로 없다.

그래도 직접 세팅해보며 그 개략적인 구조를 이해해보는 것도 의미가 있을 것이다.




환경 구축: EC2 인스턴스 만들기

꼭 aws ec2일 필요는 없다.
모든 클라우드 서비스에 이런 가상머신 서비스는 다 있기 때문에, 다른걸 쓰고싶다면 다른걸 써도 무방하다.

nginx용 하나랑

서버용 2개를 만든다.

난 그냥 기본옵션으로 줬는데, 돈이 아깝다면 더 줄여도 된다.
어차피 테스트만 하는거라 대단한 스펙이 필요치도 않다.

이렇게 3개를 띄웠다.

보안그룹 인바운드에 80 포트를 추가하는 것도 잊지 말자





서버 구축하기

서버 먼저 구축하도록 하겠다.
여기서는 비교적 세팅이 간편하고 쉬운 Nodejs express를 사용하겠다.
취향과 필요에 따라 다른걸 사용해도 무방하다.

패키지 업데이트 한번 해주고

nodejs를 설치한다.

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install --lts

잘 됐으면

제너레이터로 서버 템플릿을 생성해준다.

npx express-generator server

그리고 80 포트 열고, 실행해주면 된다.

cd server
npm i 
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000
npm start

이렇게

근데 이렇게 둘다 똑같이 나오면 구분이 잘 안되니까, 메세지만 살짝 바꿔주도록 하겠다.


이렇게




nginx 설치

아마존 리눅스에는 yum에 nginx가 빠져있어서 이렇게 설치해야 한다.
왜 없지..?

sudo amazon-linux-extras install -y nginx1

그리고 service에 nginx를 등록해서 계속해서 실행되도록 한다.

sudo service nginx start

그럼 이렇게 접속이 될 것이다.




로드밸런싱 구성하기

먼저 설정파일을 하나 추가하겠다.

sudo mkdir /etc/nginx/test
sudo vi /etc/nginx/test/config

디렉터리명은 적절히 잘 써주고, 텍스트파일을 하나 만들어서 아래와 같이 작성한다.


upstream backend {  
    least_conn;     // 서버에 할당된 가중치를 고려해 연결 수가 가장 적은 서버로 전송
    server 172.31.10.219:80; 
    server 172.31.15.163:80; 
}

server {
  listen 80; 

  location / {
    proxy_pass http://backend; //설정한 이름으로 요청 보내기
  }
}

//로 쓴 주석은 지운채로 옮겨적어야 한다. 저런 신택스는 nginx가 모른다.
위와 같이 server들을 IP로 적으면 되는데, 보통 private IP만을 넣고 서버들의 퍼블릭 IP는 막아놓는다.

그리고 least_conn는 연결 수가 적은 서버로 요청을 넘기겠다는 의미다.
저것 말고도 라운드로빈, least_time 등의 기법들도 사용할 수 있다.

그리고 저 설정을 메인 설정파일에서 포함시켜주기만 하면 된다.

sudo vi /etc/nginx/nginx.conf

기존의 http 기본설정을 지우고, 아래의 구문으로 대체한다.

http {
	include /etc/nginx/test/*;
}

그리고 리로드하면 된다.

이 작업은 오류만 없다면 무중단으로 이루어진다.

그럼 이렇게 잘 조절해서 연결해줄 것이다.

기본원리는 이게 다다.



참조
https://velog.io/@jeff0720/2018-11-18-2111-%EC%9E%91%EC%84%B1%EB%90%A8-iojomvsf0n
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/