계속 읽고 듣다보니까 엔진x 더라고요 ㅋㅋㅋ
아무튼
Nginx는 최근 증가하고 있는 웹 서비스의 요구를 지원하기 위해 개발된 고성능 웹서버입니다. Nginx는 적은 자원의 사용으로 높은 성능과 높은 동시성 보이는 것을 목표로 만들어졌습니다. 기존에는 Apache를 웹서버로 많이 사용했지만, Apache 서버는 웹과 모바일의 발전으로 점점 늘어나는 트래픽을 감당하기 어려워 졌고, 크고 작은 문제들이 많이 생겼습니다. 이런 문제를 해결하기 위해 Nginx가 개발되으며 현재는 로드밸런싱, 캐싱, HTTP Server 등의 다양한 용도로 많이 사용되고 있습니다.
Nginx 설치
- Mac에서 Homebrew로 Nginx 설치
- $ brew install nginx
- Ubuntu에서 apt로 Nginx 설치
- $ sudo apt install nginx
Nginx 설정 파일 초기화
- Nginx를 사용하여 로드밸런싱을 적용하려면 Nginx의 설정 파일인 nginx.conf 을 수정해야 합니다.
- Mac
- $ vim /usr/local/etc/nginx/nginx.conf
- Ubuntu
- $ vim /etc/nginx/nginx.conf
- Mac
- 실습에 필요한 설정값만 추가하기 위해 nginx.conf 파일을 열어 기존에 작성되어있는 모든 내용을 지워준 뒤, 아래 설정만 추가 해줍니다
#nginx.conf
http {
server {
listen 8080;
}
}
events { }
- Nginx 서버 실행Browser에서 [localhost:8080](http://localhost:8080) 또는 host IP:8080으로 접속하여 서버가 정상적으로 실행되고 있는지 확인
- Nginx 서버를 종료하고 싶을 때는 해당 명령어로 종료
$ sudo nginx -s stop
Load Balancing 적용하기
Node.js application (서버 구축)
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가 반환되게 됩니다.
Node.js application 서버 실행
- 총 3개의 서버를 실행하여 Load Balancing 실습을 진행해 보겠습니다.
- 첫 번째 서버를 8001 port를 할당하여 실행합니다.
$ node app.js 8001
$ node app.js 8002
$ node app.js 8003
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
적용완료한 Load Balancer 확인
서버들도 준비되었고 Nginx 세팅도 완료했으니 이제 실제로 요청을 보내 Load Balancing이 제대로 적용되는지 확인해 보겠습니다.
- 현재 Nginx 서버가 로컬호스트에 띄워져있고 listen할 port를 8080으로 설정해두었으니, 브라우저에서 localhost:8080 혹은 host IP:8080에 요청을 보내 확인해보면 됩니다.
- 처음 요청을 보내니 [그림 3-3]와 같이 5248이라는 프로세스 ID가 반환되었습니다. (Node.js server가 실행 되고 있는 프로세스는 컴퓨터마다 다르기 때문에 5248이 아닐 수 있습니다.)
3. 그렇다면 3개의 서버 중 어떤 서버가 요청을 처리했는지 서버 로그를 확인해보겠습니다. [그림 3-4]와 같이 첫번째 요청은 8001 port에 할당 된 서버에서 처리한 것을 확인할 수 있습니다.
계속 요청을 보내보시면 8002,8003,8001,8002..... 이렇게 반복하면서 서버에 요청을 보내게 됩니다.
이렇게 오늘은 nginx 엔진x 에 대하여 배워봤는데요. 사실 저도 아직 적용해보지는 못했습니다. 왜냐하면... 저의 서버는 고작 4명이 사용하는 서버이기 때문에 아직까지는 이런것이 필요없습니다. ㅎㅎ 하지만 미래에는 꼭 사용하는 서버가 되었으면 좋겠습니다!!
'코딩 개발' 카테고리의 다른 글
Node.js - 스케줄러 (0) | 2022.12.13 |
---|---|
2차 Project - BUGBUG (2) | 2022.12.09 |
Proxies & Load Balancing (0) | 2022.12.07 |
Git flow (0) | 2022.11.28 |
Big O (알고리즘) (0) | 2022.11.28 |