1. Nginx
Nginx는 최근 증가하고 있는 웹 서비스의 요구를 지원하기 위해 개발된 고성능 웹서버입니다.
Nginx는 적은 자원의 사용으로 높은 성능과 높은 동시성 보이는 것을 목표로 만들어졌습니다.
기존에는 Apache를 웹서버로 많이 사용했지만,
Apache 서버는 웹과 모바일의 발전으로 점점 늘어나는 트래픽을 감당하기 어려워 졌고, 크고 작은 문제들이 많이 생겼습니다.
이런 문제를 해결하기 위해 Nginx가 개발되으며 현재는 로드밸런싱, 캐싱, HTTP Server 등의 다양한 용도로 많이 사용되고 있습니다.
2. Nginx 준비
2-1. Nginx 설치
- Mac에서 Homebrew로 Nginx 설치
$ brew install nginx
- Ubuntu에서 apt로 Nginx 설치
$ sudo apt install nginx
2-2. Nginx 설정 파일 초기화
- Nginx를 사용하여 로드밸런싱을 적용하려면 Nginx의 설정 파일인 nginx.conf 을 수정해야 합니다.
- Mac
$ vim /usr/local/etc/nginx/nginx.conf
- Ubuntu
$ vim /etc/nginx/nginx.conf
2. 실습에 필요한 설정값만 추가하기 위해 nginx.conf 파일을 열어 기존에 작성되어있는 모든 내용을 지워준 뒤, 아래 설정만 추가 해줍니다.
#nginx.conf
http {
server {
listen 8080;
}
}
events { }
3. Nginx 서버 실행
$ sudo nginx
4. Browser에서 [localhost:8080](<http://localhost:8080>) 또는 host IP:8080으로 접속하여 서버가 정상적으로 실행되고 있는지 확인
5. Nginx 서버를 종료하고 싶을 때는 해당 명령어로 종료
$ sudo nginx -s stop
3. Load Balancing 적용하기
3-1. Node.js application 서버 준비
3-1-1. Node.js application
- 로드밸런싱이 적용되는 과정을 보기위해 준비된 데모 어플리케이션 GitHub Repository을 통해 간단한 Node.js 프로젝트를 clone 받아줍니다
- package.json에 있는 dependency를 설치해줍니다.
$ npm install
- Clone 받은 application 코드를 먼저 살펴보겠습니다.
// app.js
const express = require('express');
const app = express();
const PORT = process.argv[2];
app.get('/', (req, res) => {
console.log('GET Request');
res.send(`Served from ${process.pid}`);
});
app.listen(PORT, () => {
console.log(`Listening on port ${PORT}`);
});
Express 프레임워크를 사용하여 서버를 띄웁니다. 그리고 서버에 / 에 대한 요청이 들어오면, 콘솔창에 요청을 받았다는 의미의 GET Request 를 출력하고 응답으로 해당 프로세스 ID를 리턴해주는 코드입니다.
로드밸런서를 적용하고 나면 매 요청이 준비된 3개의 서버에 고르게 전달되어 각 프로세스에 해당하는 프로세스 ID를 반환하게 됩니다. 즉, 요청을 할 때마다 다른 프로세스 ID가 반환되게 됩니다.
3-3-2. Node.js application 서버 실행
- 총 3개의 서버를 실행하여 Load Balancing 실습을 진행해 보겠습니다.
- 첫 번째 서버를 8001 port를 할당하여 실행합니다.
$ node app.js 8001
[그림 3-1] 처럼 첫번째 서버가 정상적으로 실행되었다면, 터미널 창 두개를 추가로 열어 서버 2개를 각각 port 8002와 8003을 할당하여 실행해줍니다.
3-4. nginx.conf에 Load Balancing 설정 추가
- 서버들은 준비 되었으니 초기화해두었던 nginx.conf 파일 내용을 수정하여 Load Balancing을 적용해보겠습니다.
- upstream 추가
#nginx.conf
http {
**upstream backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}**
server {
listen 8080;
}
}
events { }
첫 번째로 요청을 분산할 대상인 서버들을 그룹지어 backend 라는 이름을 가진 upstream 블락에 추가해주었습니다. upstream은 사용자에게 받은 정보를 전달할 대상을 의미합니다. 저희는 사용자에게 받은 정보를 Node.js 서버로 전달하기 때문에 upstream 블락의 Node.js 서버들의 위치 정보를 적어주면 됩니다. 그리고 이 때 upstream 블락의 이름이 꼭 backend일 필요는 없습니다.
- location 추가
#nginx.conf
http {
upstream backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 8080;
**location / {**
**proxy_pass <http://backend>;**
**}**
}
}
events { }
server 블락에 location 을 추가하여 요청을 보낼 path인 / 를 지정합니다. 그리고 / 으로 요청이 들어왔을 때의 요청 정보를 전달해 줄 proxy_pass로 upstream을 추가합니다. 다음과 같은 설정을 통해 Nginx server에 port 80으로 / 요청이 오면 upream에 지정한 서버들에게 http 요청을 전달하게 됩니다.
- Nginx 설정파일이 업데이트 되었으니 변경된 내용을 적용 해줍니다
$ sudo nginx -s reload
3-5. 적용완료한 Load Balancer 확인
서버들도 준비되었고 Nginx 세팅도 완료했으니 이제 실제로 요청을 보내 Load Balancing이 제대로 적용되는지 확인해 보겠습니다.
- 현재 Nginx 서버가 로컬호스트에 띄워져있고 listen할 port를 8080으로 설정해두었으니, 브라우저에서 localhost:8080 혹은 host IP:8080에 요청을 보내 확인해보면 됩니다.
- 처음 요청을 보내니 [그림 3-3]와 같이 5248이라는 프로세스 ID가 반환되었습니다. (Node.js server가 실행 되고 있는 프로세스는 컴퓨터마다 다르기 때문에 5248이 아닐 수 있습니다.)[그림 3-3] Request를 처리한 node applicatrion server의 process ID
3. 그렇다면 3개의 서버 중 어떤 서버가 요청을 처리했는지 서버 로그를 확인해보겠습니다. [그림 3-4]와 같이 첫번째 요청은 8001 port에 할당 된 서버에서 처리한 것을 확인할 수 있습니다.
[그림 3-4] port 8001에 할당 된 서버에서 요청을 처리
5. 새로고침을 통해 다시 한 번 요청을 보내 보겠습니다. [그림 3-5]을 보면 이번에는 이전 요청에 대한 응답으로 받았던 프로세스 ID인 5248 이 아닌 5449가 반환된 것을 확인할 수 있습니다. 그렇다면 이전 요청을 처리했던 서버가 아닌 다른 서버에서 두 번째 요청을 처리했다는 것을 뜻합니다.
[그림 3-5] 새로운 요청을 보냈을 때 바뀐 프로세스 ID
6. 그렇다면 3개의 서버 중 어떤 서버가 요청을 처리했는지 서버 로그를 확인해보겠습니다.[그림 3-6]과 같이 처음 요청을 처리했던 port 8001번에 할당 된 서버가 아닌, 8003 port에 할당 된 서버에서 해당 요청을 처리한 것을 확인할 수 있습니다.
[그림 3-6] port 8003에 할당 된 서버에서 요청을 처리
7. 이후 여러번 요청을 반복해보면 요청이 준비된 서버들에게 고르게 분포되어 처리되는 것을 확인할 수 있습니다.
[그림 3-7] Load Balancing 적용 후 3개의 sever에 고르게 분포되는 request
출처: https://www.notion.so/wecode/Network-Nginx-Load-Balancing-f23a8b0438584d6f8ec784d1e9e40f05
'Cloud Service > AWS 공부' 카테고리의 다른 글
[CICD] CICD의 개념 및 동작원리 2) (0) | 2023.10.28 |
---|---|
[CICD] CICD는 언제, 왜 필요할까? 1) (0) | 2023.10.28 |
[AWS] ALB - [Network] Proxies & Load Balancing (0) | 2023.10.28 |
[AWS] VPC-5) Custom VPC를 활용하여 Infrastructure 구성하기 ** (0) | 2023.10.28 |
[AWS] VPC-4) ** (0) | 2023.10.28 |