본문 바로가기
  • 포르쉐타고싶다
인포테인먼트 - development/linux

[nginx] nginx에 프록시, 로드밸런싱 설정하기

by 지오ㄴl 2020. 3. 24.

1. 프록시 설정

한 웹 서버 안에는 여러 서버가 있을 수 있다.

그 각각의 서버들도 자기의 서버가 있고 웹서버 안에 있는 이상 메인도메인(퍼블릭 ip) 안에서 프라이빗 ip를 가지고 있는 것이다.

프록시 설정을 하면 퍼블릭 ip를 거친 요청만이 프라이빗 ip로의 요청 마무리를 통해 요청을 통한 원하는 응답을 가질 수 있다.

클라이언트가 서버의 자원을 자기 맘대로 쥐락펴락 못하려면 웹서버의 퍼블릭 ip, 웹 서버 안에서의 프라이빗 ip 를 모두알면 안된다.

 

클라이언트는 퍼블릭 ip만 알고있는 상황에서 요청을 하고, 이 퍼블릭 ip를 거치는 과정에서 여러 보안적 이슈를 해결할 수 있다.

그 다음에 프록시의 역할, 즉 요청하는 프라이빗 ip로의 연결을 대리(proxy)하는것이 바로 프록시 서버의 역할이다.

 

여기서의 보안적 장점, 그리고 안전한 요청만을 받아 웹 서버 안에서 자동으로 요청하는 서버 ip로 연결해준다는 것에서 프록시 설정이 중요해지는 것이다. 

 

2. 로드밸런싱

로드밸런싱도 프록시와 원리는 비슷하다.

웹 서버의 퍼블릭 ip(DNS)로의 요청을 받아 웹 서버 안에서 원하는 서버에다가 그 요청을 전달하는 것이다.

하지만 문맥, 필요한 상황이 정해져있다.

바로 요청들을 웹 서버 안에서 서로 다른 여러 서버에다가 나눈다는 것이 아니고

 

한 웹서버에 같은 서버를 여러개 배치(쌍둥이)하고 수많은 클라이언트의 같은 자원 요청했을 때,

한 서버에다 그 요청을 조지는(?)것이 아니고 여러개의 같은 서버(쌍둥이)에다가 그 요청들을 나누는 것이다.

 

어차피 그 서버들은 쌍둥이, 즉 같은 내용이기 때문에 응답또한 당연히 같다.

중복, 반복되는 요청을 여러 같은 서버들이 나누어 전담함으로써 과부하로 인한 서버에러를 피할 수 있는 것이다.

 

 

한 웹서버에 nginx를 입히고 한 서버에 대한 프록시와 프록시를 이용한 로드밸런싱을 적용시켜 보겠다.

ec2 인스턴스의 ubuntu를 사용한다. nginx를 설치하는 과정은 생략한다.

 

이 절차를 따르는 것은 다음의 상황을 가정한다.(내가 처했던 상황)

- 로컬 컴퓨터에서 서버를 모두 만들어 놓은 상황에서 웹서버에 그 서버를 올려놓은 상황

-  막상 출시했을 때의 트래픽과부하로 인한 서버 안정성이 걱정된다.

-  웹서버의 보안이슈에 대한 여러 방안들(https, reverse proxy 등등)을 적용하고 싶다.

 

큰 흐름은 이렇다

 

1. 본래 올려놓은 서버를 복사해 하나 더 올려놓는다

2. 새로 올린 똑같은 서버의 port를 다른 하나로 바꾼다(원래 올려놨던 서버의 port: 3000 -> 새로 올린 서버의 port : 3001)

3. 이 쌍둥이 두 서버를 실행시킨다(pm2)

4. nginx의 sites-available에 프록시를 설정할 파일을 생성한다

5. 해당 등록했던 서버로 프록시 서버를 설정한다

6. 동시에 쌍둥이지만 서로다른 두 port에 로드밸런싱을 설정한다.

7. 해당 서버에 중복 요청을 시도하고 어떤 서버가 받고있는지 확인한다.

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

1. 본래 올려놓은 서버를 복사해 하나 더 올려놓는다.

ubuntu@localhost :~/ ls
api

ubuntu@localhost :~/ cd api1

ubuntu@localhost :~/api1$ ls
node-server1

이렇게 애초에 올려놓은 서버가 있다고 하자.

 

똑같은 쌍둥이 서버를 api2 폴더에 node-server2로 생성한다

ubuntu@localhost :~/ mkdir api2

ubuntu@localhost :~/ cd api2

ubuntu@localhost :~/api2$ cp ~/api1/node-server1 ~/api2/node-server2

물론 이 부분은 파일질라를 사용해서 하나 더 올려도 된다.

 

2. 새로 올린 똑같은 서버의 port를 다른 하나로 바꾼다(원래 올려놨던 서버의 port: 3000 -> 새로 올린 서버의 port : 3001)

 

이 때, 새로 올린 서버의 port는 3001로 바꿔준다(기존의 port : 3000)

각각 파일이 어떻게 되어있는지 모르므로 포트변경의 정확한 과정은 생략한다.

 

3. 이 쌍둥이 두 서버를 실행시킨다(pm2)

ubuntu@localhost :~/api1/node-server1$ pm2 start bin/www		// 서버하나 실행 

ubuntu@localhost :~/api1/node-server1$ cd ~/api2/node-server2

ubuntu@localhost :~/api2/node-server2$ pm2 start bin/www		//두번째 서버 실행

ubuntu@localhost :~/api2/node-server2$ pm2 list

pm2를 이용해서 실행중인 서버를 리스트로 확인할 수 있다.

 

4. nginx의 sites-available에 프록시를 설정할 파일을 생성한다.

 

nginx안에서 요청을 나누는(라우팅하는)방법은 여러가지가 있지만 나는 sites-available안에 새로운 파일을 만들어서 symlink하는 방식으로 진행하였다. 라우팅할 수 있는 여러 방식을 적용할 수 있는 파일들은 아래와 같다.

  • /etc/nginx: 해당 디렉터리는 Nginx를 설정하는 디렉터리입니다.모든 설정을 이 디렉터리 안에서 합니다.

  • /etc/nginx/nginx.conf: Ngnix의 메인 설정 파일로 Nginx의 글로벌 설정을 수정 할 수 있습니다.

  • /etc/nginx/sites-available: 해당 디렉터리에서 프록시 설정 및 어떻게 요청을 처리해야 할지에 대해 설정 할 수 있습니다.

  • /etc/nginx/sites-enabled: 해당 디렉터리는 sites-available 디렉터리에서 연결된 파일들이 존재하는 곳 입니다.이 곳에 디렉터리와 연결이 되어 있어야 nginx가 프록시 설정을 적용합니다.

  • /etc/nginx/snippets: sites-available 디렉터리에 있는 파일들에 공통적으로 포함될 수 있는 설정들을 정의할 수 있는 디렉터리 입니다.(출처 : https://velog.io/@jeff0720/2018-11-18-2111-%EC%9E%91%EC%84%B1%EB%90%A8-iojomvsf0n%EF%BB%BF)

 

먼저 sites-available에 들어간다.

ubuntu@localhost :~/ cd /etc/nginx/sites-available

 

 

이 폴더에는 기본 라우팅 파일인 default가 있다.

ubuntu@localhost :/etc/nginx/sites-available$ ls
default

 

 

위에서 설명한 방식 중 하나처럼 저 default파일을 수정하여 프록시를 등록해도 되지만

나는 새로운 파일을 만들어서 프록시를 설정해보겠다.( 최대한 디폴트 파일들은 건드리지 않는게 경험상 가장 좋은 것 같다 )

 

 

proxy-server라는 파일을 생성한다.

ubuntu@localhost :/etc/nginx/sites-available$ sudo touch proxy-server

 

5. 해당 등록했던 서버로 프록시 서버를 설정한다.

 

proxy-server 작성 창으로 들어간다.

ubuntu@localhost :/etc/nginx/sites-available$ sudo vi proxy-server

 

먼저 프록시를 설정한다.

지금 적는 것은 맨 처음에 서버가 하나만 올라와 있을 때를 가정했을 때 

브라우저에서 도메인(IP)를 치고 들어왔을 때 웹 서버 퍼블릭ip에서 해당 요청을 확인하고 자동으로 내부의 내 서버에 전달하는

바로 리버스 프록시의 과정이다.

server {
        listen 80;
        server_name example.com; //브라우저에서 이 도메인을 입력하면
        location / {
                proxy_pass http://localhost:3000; //웹 서버 내부에 서버가 있는 프라이빗 주소로 요청을 전달해준다
        }
}

 

6. 동시에 쌍둥이지만 서로다른 두 port에 로드밸런싱을 설정한다.

 

우리의 목표는 프록시 서버 설정과 동시에 그 서버의 쌍둥이 서버들과 로드밸런싱을 해야하기 때문에 더 해줘야 하는 것이 있다.

바로 upstream이다.

 

위에서 입력했던 것을 아래처럼 수정한다.

upstream api-proxy {		//로드밸런싱 블록, 이름을 api-proxy 로 설정하였다.
        server localhost:3000;
        server localhost:3001;
}
server {
        listen 80;
        server_name example.com;
        location / {
                proxy_pass http://api-proxy;		//upstream에서 설정한 로드밸런싱 이름을 적는다.
        }
}

 

 

이렇게 두번의 간단한 절차를 통해

내가 만든 한 서버에게 프록시서버와 로드밸런싱을 적용한 것이다.

 

이제 nginx를 재실행 시켜준다

ubuntu@localhost :/etc/nginx/sites-available$ sudo service nginx restart

 

7. 해당 서버에 중복 요청을 시도하고 어떤 서버가 받고있는지 확인한다.

해당 웹서버에게 내가 만든 서버의 아무 api를 요청해본다.

그 중 하나의 url이 '/boardAPI/board/1'이라고 하자

해당 요청을 4번 중복요청해보자

 

이제 실행중인 서버를 관리하고 있는 pm2의 상태를 보면

ubuntu@localhost :~/ pm2 logs

 

다음과 같이 각 서버에 분산되어 요청이 들어가는 것을 확인할 수 있다.

반응형

댓글