[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 - 표시한 서버는 사용치 않는다.
'DevOps > WebServer' 카테고리의 다른 글
[WebServer][nginx]로그 보고 수정하기-(3) (0) | 2019.07.11 |
---|---|
[WebServer][nginx]root디렉터리 변경하기-(2) (0) | 2018.08.08 |
[WebServer][nginx]운영체제별 nginx 설치하기-(1) (0) | 2018.07.23 |