Nginx를 Reverse Proxy로 사용하여 로드 밸런싱 적용하기

돌멩이·2024년 7월 23일
0

실습을 진행한 내용을 간단히 정리했다.

1. nginx 설치
brew install nginx

2. nginx.conf 파일 열기
brew info nginx 명령어를 통해 파일의 위치를 찾는다.
/opt/homebrew/etc/nginx/nginx.conf 경로로 이동하여 vi 또는 nano 편집기로 nginx.conf 파일을 연다.


3. nginx.conf 파일에 서버 포트 추가
localhost에서 실습할 것이라 http 블록 안에 upstream 블록을 선언하여 로드밸런싱할 서버 포트를 추가한다. 나는 http 블록 안의 server 블록 위에 선언했다.

     # 로드 밸런싱을 위한 upstream 블록
     upstream servers {
         server localhost:3000;
         server localhost:3001;
         server localhost:3002;
     }

servers는 임의로 붙인 명칭이고, 자유롭게 변경할 수 있다.
server 블록 안의 listen 포트는 기본으로 둔다. (http 요청은 기본 80 포트를 이용)
또한 로드 밸런싱 방식을 변경하고 싶다면 upstream 블록안에 설정하면 된다.

로드 밸런싱 방식은 크게 round-robin, least-connected, ip-hash, weighted으로 나뉜다.

default는 round-robin으로, 요청을 순차적으로 각 서버에 분배한다. 서버 목록의 1번 -> 2번 -> 3번 ... -> 다시 1번 -> (반복). 처음부터 끝까지 순서대로 요청을 분배한 다음 다시 처음으로 돌아가는 방법이다.
least-connected는 현재 가장 적은 연결을 가지고 있는 서버에 요청을 분배한다. upstream 블록 안에 least_conn;을 추가하면 동작한다.
ip-hash는 동일한 클라이언트의 요청이 항상 동일한 서버에 연결되도록 보장한다. 클라이언트의 IP 주소를 해싱 키로 사용하여 해당 서버를 사용할 수 없는 경우를 제외하고 항상 동일한 서버로 요청을 전송한다. 세션 유지에 유용하다. upstream 블록 안에 ip_hash;을 추가하면 동작한다.
weighted는 서버에 가중치를 부여하여 요청을 분배한다.

upstream myapp1 {
    server srv1.example.com weight=3;
    server srv2.example.com;
    server srv3.example.com;
}

가중치의 기본값은 1이다. 만약 5개의 요청이 들어온다면,
srv1.example.com 서버로 3개의 요청이 전송됨.
srv2.example.com 서버로 1개의 요청이 전송됨.
srv3.example.com 서버로 1개의 요청이 전송됨.
즉, 가중치가 많이 부여된 서버가 더 많은 요청을 처리하는 방식이다.
추가로, 최신 버전의 Nginx에서는 least-connected와 ip-hash 방식에서도 가중치를 사용할 수 있다고 한다.


다음으로는 location 블록의 내용을 수정한다.

   
   location / {
       proxy_pass http://servers;
   }

location / 루트 URL(/)로 들어오는 모든 요청을 servers로 전달하여 로드 밸런싱을 수행한다.

nginx의 수정사항을 반영하기 위해 sudo nginx -s reload 명령어를 입력한다.


4. 애플리케이션을 여러 포트로 실행
현재 포트를 출력하는 간단한 app.js 코드를 작성한다.

  const express = require('express');
  const app = express();
  const port = 3000;

  app.get('/', (req, res) => {
    res.send(`Response from server running on port ${port}`);
  });

  app.use(express.static('build'));

  app.listen(port, () => {
    console.log(`Frontend server running at http://localhost:${port}`);
  });

nginx.conf에 서술했던 것처럼 port 3000, 3001, 3002번에서 각각 app1.js, app2.js, app3.js 실행한다. (node app1.js)


5. http:localhost/ 주소로 접속하여 로드 밸런싱 되는 것 확인

  • 라운드 로빈 방식인 경우

  • ip_hash 방식인 경우

테스트 환경에서는 least_conn이랑 round_robin이 비슷하게 동작하는 것으로 보임.



TO DO
리버스 프록시가 무엇인지, 로드 밸런싱이 무엇인지, Location의 우선 순위 등등 좀 더 내용을 추가할 것
https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

profile
하나를 배웠을 때 하나를 알면 잘하는 것이다. 💡

0개의 댓글