Nginx Load Balancing

2024. 3. 12. 15:47Server

서버가 처리량 많아 문제가 생겨

서버를 확장 할 경우에 대표적으로 2가지 방법이 있다

바로 Scale Up과 Scale Out이다

 

먼저 Scale Up은 더 좋은 서버로 갈아주는 것이다

대표적으로 더 코어와 쓰레드가 많고 클럭이 높은 CPU나 더 많은 RAM용량 더 좋은 인터넷 회선으로 변경등이 있다.

이 방법은 간단하고 확실하게 서버의 처리량을 늘릴 수 있지만

돈이 많이 들고 서버가 한 대이기 때문에 그 서버가 터지면 서비스도 다운 된다.

 

Scale Out은 서버를 여러대로 늘리는 것이다.

Scalue Up보다는 고려할 점이 많고 새로운 기술및 관리가 필요하지만

추가적인 확장이 유연하게 가능하고 한 대의 서버가 다운 되더라도 서비스 전체가 다운 되지는 않는다.

 

이번 포스트에서는 서버를 여러대로 늘렸을 때 각각의 서버에 요청을 분배하는 Load Balancing을 Nginx로 구현 하겠다.

 

우선 Nginx는 Docker에 올려서 사용 할 것이기 때문에 세팅을 하겠다

 

 

 

 

Image를 다운 받아서 Container를 올리면

 

 

etc/nginx에 설치 되어 있다

nginx를 사용하려면 nginx.conf를 수정해야 하는데

 

여기서 수정하려고 하면 불편하니 

VsCode등을 사용하기 위해 직접 파일을 하나 만들거나 

docker -cp {container name}:/etc/nginx/nginx.conf {dir}/nginx.conf로 파일을 옮겨주자

ex) docker -cp clever-mayer:/ect/nginx/nginx.conf ./nginx.conf

 

그리고 docker-compose를 이용해서

 

 

 

수정한 nginx.conf를 집어넣어 container를 만들고 포트를 설정 해 주었다.

 

이제 nginx.conf를 수정하여 nginx를 Load Balancer로 사용해 보겠다

 

worker_processes  auto;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;


    sendfile        on;

    keepalive_timeout  65;

    upstream origin {
        server host.docker.internal:5001;
        server host.docker.internal:5002;
    }

    server {
        listen       8000;
        server_name  localhost;

        location / {
            proxy_pass https://origin;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}

 

여러 설정이 있지만 자세한 내용은 학습중이니 우선 중요한 Load Balancing에 대한 부분만 다루겠다

 

http{}안에 upstream과 server{} 그리고 server{}안의 location이다

 

우선 upstream 뒤의 origin은 명칭이다 이건 변수라 여러 이름의 upstream을 만들고 필요할 경우 사용 할 수 있다.

안의 server의 host.docker.internal:5001; 는 nginx를 통과해 가게될 서버의 주소이다.

local에서 실행하면 localhost:5001;이겠지만 docker에서 실행하므로 바꾸어 주었다

 

위 케이스는 두 개의 localhost:5001과 localhost:5002로 나누어져 요청이 전달 된다

 

전달하는 알고리즘도 설정 할 수 있으나 위 예시는 따로 설정을 안 했으니

default 설정인 라운드 로빈으로 설정 되었다.

 

server{}의 listen은 요청을 받는 포트이다 위의 경우에는 8000번 포트로 요청이 들어오면 설정한 서버로 요청이 전달 된다.

 

location / {}안의 proxy_pass는 요청되는 서버 주소이다. 아까 설정한 upstream의 주소가 여기에 들어가서 설정 된다.

 

 

localhost:8000으로 접속하니 설정해둔 서버로 접속이 되었다.

 

 

라운드 로빈으로 설정해서 차례대로 서버에 접속이 된 것을 확인 할 수 있다

'Server' 카테고리의 다른 글

Github Action과 배포 자동화  (1) 2024.11.29
JWT  (0) 2024.01.13
Http의 한계와 WebSocket  (0) 2023.08.16
Session, Cookie, Token  (0) 2023.08.16
Winsock2.h를 이용한 TCP 통신  (0) 2023.08.11