ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Ngnix) 서버 로드밸런싱 하기
    Programing Study/네트워크 2021. 8. 13. 16:18
    728x90
    반응형

    [Docker][ShellScript]Nginx.LoadBalancer-Nodejs : 엔진엑스로 nodejs에 로드밸런싱하기

    http://nginx.org/en/docs/http/ngx_http_upstream_module.html

     

    로드 밸런서라는것을 아는가?

    개념은 위의 그림을 보면 이해할 수 있는데 가령 WAS(Web Application Server)가 한개라고 가정해보자.

    그러면 서버 한대분량의 부하(Load)만 받을 수 있을 것이다.

     

    하지만 사용자가 늘어서 서버 두대를 사용해야할 경우 어떻게 해야할까?

    그 경우에는 보통 위처럼 nginx를 앞에 두고 서버를 nginx에 연결하는 방식으로 만들 것이다.

    즉 nginx는 요청을 받아서 WAS에 중계해주는 역활을 한다.

    그러면 Load가 고르게(Balance)들어가게 될건데 이걸 로드밸런서라고한다.

     

    nginx는 로드밸런서로 사용할 수 있고 이번에는 로드밸런서를 만들어보도록하자.

    생각보다 만드는 방법은 간단하다.

     

    먼저 nginx.conf를 보자.

     

     

    http안에 만들어야하는데 필자는 include를 통해서 가져오게 되어있다.

    안에 직접 만들어도되고 sites-enabled 안에 파일로 넣어도된다.

     

     

    그럼 sites-available밑에 하나 새로 만들어준다.

    이름은 뭐든 상관없는데 기존거를 없애고 새로 만들자.

    필자는 이름을 default라고 하겠다.

     

     

    그 다음 위에 처럼 만들어준다.

     

    upstream 만들기

     

    upstream <업스트림 이름> {

    <로드밸런스 타입: defulat는 round-robin>

    server <host1>:<port1>

    ...

    server <host2>:<port2>

    }

     

    upstream은 강의 상류를 의미하는데 즉 위에서 아래로 뿌려주는 것을 의미한다. 반대는 downstream이다.

    즉 여러군대로 뿌려주는 녀석을 upstream이라고 부른다.

    위에서는 해당 nginx가 여러 서버에 분배해 주므로 upstream 서버라고 부를 수도 있다.

     

    로드밸런스는 부하(Load)를, 즉 접속자를 분산해서 고루고루 보내주는데 어떻게 분배할지 규칙을 알아야한다.

    규칙은 아무것도 적지 않는다면 라운드로빈으로 동작한다.

    즉 그냥 균등하게 분배한다는 것이다.

     

    server {

    ...

    location <url>{

    proxy_pass http://<업스트림 이름>

    }

    ...

    }

     

    그리고 서버의 location에서 로드밸런싱할 url을 선택한다.

    그 후 proxy_pass에 붙혀주면된다.

     

    적용했으면 서버 재시작하고 다시해보자.

     

    새로고침해서 계속 접속해보자.

     

     

    왼쪽이 1번 서버고 오른쪽이 2번 서버인데 부하가 균등하게 분배되서 전달됨을 확인할 수 있다.

     

     

    또 달리 자주쓰는 분배규칙(Load balancing methods)은 ip_hash이다.

    이는 ip를 해시값으로 해서 나눠주는 것이다. 이렇게 분배하게되면 한번접속했던 아이피는 계속 같은 서버를 쓰게된다. 

     

     

    보면 알겠지만 한쪽 서버만 주구장창 쓰는걸 확인할 수 있다.

     

    Load balancing methods(부하 부산 규칙)

     

    round-robin(디폴트) - 그냥 돌아가면서 분배한다.

    hash - 해시한 값으로 분배한다 쓰려면 hash <키> 형태로 쓴다. ex)hash $remote_addr <- 이는 ip_hash와 같다.

    ip_hash - 아이피로 해싱해서 분배한다.

    random - 그냥 랜덤으로 분배한다.

    least_conn - 연결수가 가장 적은 서버를 선택해서 분배, 근데 가중치를 고려함

    least_time - 연결수가 가자 적으면서 평균 응답시간이 가장 적은 쪽을 선택해서분배

     

    http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html

    자세한 설명은 위를 확인하자.

     

     

    그리고 파라메터를 줄 수 있다.

    위의 경우 weight로 가중치를 줄 수 있는데 규칙은 유지하되 2배더 많이 사용한다는 뜻이다.

    그럼 재시작해서 실행해보자

     

     

    보면 알겠지만 두배 더 많이 접속한걸 확인할 수 있다.

     

    Parameter

     

    weight - 가중치를 둬서 더많이 가게 한다.

    max_conns - 최대 연결 한계를 정한다

    max_fails - 최대 실패 한계를 정한다. 최대 실패횟수에 도달하면 서버가 죽은것으로 간주한다.

    fail_timeout - 시간을 정한다. 이 시간을 넘어서도 응답하지 않으면 서버가 죽은것으로 간주한다.

    backup - 이 서버는 백업서버로 간주하고 다른 메인 서버가 죽었을때 동작한다. load balancing methods가 hash나 random일때는 무의미

    down - 표시한 서버는 사용치 않는다.

     

     

     

    728x90
    반응형
Designed by Tistory.