Proxy, Load Balancer

정인호·2022년 10월 16일
0

위코드-개념정리

목록 보기
19/19

Proxy

proxy는 프론트엔드 서버와 백엔드 서버 사이에서 여러 작업을 수행해 넘겨주는 역할을 한다.

proxy는 두가지로 나뉜다.

Forward Proxy

forward proxy의 예시로는 VPN을 들 수 있다. VPN은 사내 내부 서버에 접근할 때 보안상의 이유로 특정 IP로만 접속 가능하도록 하기 위해 사용하거나, 한국 IP로는 접속이 불가능한 쇼핑몰을 접속하기 위해 특정 국가의 IP를 이용하기 위해서 사용한다. 이런 VPN은 proxy에서 실제 요청 서버에 대한 IP를 가리고 보내주는 것 이다.
다른 예시로는 캐싱이 있다. 클라이언트에서 동일한 요청을 여러번 보낼 때 매번 서버에서 같은 요청에 대한 응답처리를 반복할 필요 없이 Forward Proxy 서버에서 캐싱해두고 같은 요청에 대한 응답을 Proxy에서 바로 보내주어 불필요한 통신을 없애고 리소스 낭비를 줄일수 있다.

Reverse Proxy

프라이빗 네트워크의 서버에 대한 접근을 제어한다. 데이터 암호화 및 암호 해독, 인증 작업, 정보 캐싱 및 Load Balancer 역할을 수행 할 수 있다.
클라이언트가 접근하고자 하는 서버의 실제 위치를 masking하여 실제 서버의 위치를 숨겨서 클라이언트가 아닌 백엔드 서버에 대한 익명성을 제공해주는 역할을 한다.

리버스 프록시는 수백만명의 방문자가 있는 서비스에 로드 밸런서로 활용 될 수 있다. 로드밸런서는 서버를 여러개로 두고 요청이 들어왔을때 수많은 요청들을 순차적으로 여러 서버에 분산시켜서 트래픽을 없애주는 역할을 한다.
만약 여러개의 서버중 하나의 서버가 에러가 나도 나머지 서버가 잘 작동하면 서비스는 아무 문제없이 돌아가는 장점이 있다.

리버스 프록시는 리버스 프록시를 통해서만 네트워크에 액세스 할 수 있게하여 악의적인 공격을 차단하는 등 웹사이트에 보안을 추가하는 역할도 해준다.

Load Balancer

위에서 설명했기 때문에 간단하게 추가적으로 설명하면, 특정 서비스가 처음에는 사용자가 많지 않아 원활하게 돌아가다가 갑자기 사용자수가 급증하게 됐을 때 우리는 두가지 방법을 택할 수가 있는데,

Scale-up

첫번째로는 scale up방식이다. 이는 기존에 사용하던 컴퓨터를 교체해 고성능 컴퓨터로 바꾸는 것을 의미한다. 이는 많은 비용과 시간이 들고 서비스를 잠시 중단해야하는 단점이 있다.

Scale-out

두번째는 scale out방식으로 Load Balancer를 사용하는 것이다. 이 방법은 비용도 들지 않고, 시간도 들지 않으며, 무엇보다 서비스를 중단하지 않고 운영할수 있는(Down Time없이) 장점이 있다. 또한 한개의 서버가 작동하지 않아도 다른 서버로 작동시키고 그 동안 해당 서버의 에러를 잡을 수도 있다.

nginx

Load Balancer를 사용하기 위해 Nginx 서버를 사용해보았다.

brew install nginx

nginx를 다운받고(ubutu는 sudo apt install nginx),

vim /usr/local/etc/nginx/nginx.conf

를 입력해서 vim을 수정한다(ubuntu는 vim /etc/nginx/nginx.conf). 해당 명령어를 입력하면 nginx.conf파일이 열린다. 안에 내용을 다 삭제한뒤에
http {
server {
listen 8080;
}
}

events { } 로 내용을 바꿔준다.

sudo nginx

를 입력해서 nginx 서버를 실행시킨후, 검색창에 localhost:8080으로 접속했을때 Welcome to nginx라는 문구가 뜨면 성공이다.
서버를 종료하고 싶으면 sudo nginx -s stop를 입력한다.

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}`);
});

app.js에 process에서 요청하는 port번호로 서버를 동작시키고, process id를 반환해주는 get요청 콜백함수를 기재한다. terminal에 node app.js 8001을 입력하면 8001port가 실행된다. 이런식으로 여러개의 server를 실행시킬 수 있다. 이제 load balancer를 적용시키기 위해 vim /usr/local/etc/nginx/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 { }

events { }
아까 작성한 코드에 upstream과 proxy_pass를 추가해서 8080포트로 요청이 들어오면 proxy_pass를 통해 backend로 넘어가고 upstream에 기재되어 있는 서버들로 분산되어 요청이 들어간다. 이렇게 내용을 수정한후,
terminal에

sudo nginx -s reload

를 입력해서 내용을 저장하고, localhost:8080으로 접속하면 접속할때 마다 8001, 8002, 8003포트로 순서대로 분산되어 접속되고 그에 따른process id가 반환된다.

profile
경제학과를 졸업후 개발에 뛰어든 햇병아리입니다.

0개의 댓글