Upstream
Nginx를 리버스 프록시로 이용하기 위해서는 nginx의 내장 모듈 중의 하나인 upstream 모듈을 사용하면 된다. upstream 모듈은 proxy_pass등의 지시자에 의해 참조되며 nginx가 받은 요청들을 처리할 서버의 집합을 정의할 수 있다.
가정
lou-server1.com, lou-server-2.com, lou-server-3.com이라는 3개의 서버에 각각 웹 애플리케이션이 동작하고 있다고 가정한다.
upstream 지시자 바로 뒤의 'backend' 부분은 서버 집합의 그룹명이다. 나중에 proxy_pass에서 이 이름을 가지고 참조 할 수 있다. upstream 블록안에는 현재 동작중인 서버 목록이 들어가게 된다. server 지시자 뒤에 적어주면 되며, <IP:port> 쌍으로도 적을 수 있다.
아무런 알고리즘을 정해두지 않으면 Round-robin 방식으로 3개의 서버를 돌아가며 Request를 넘긴다.
upstream backend {
server lou-server1.com;
server lou-server2.com;
server lou-server3.com;
}
Load balancing 알고리즘
nginx는 여러가지 Load balancing 알고리즘을 지원한다.
분배하다 기준이 비슷한 정도의 서버가 여러대 있다면 그중에서 Round-robin를 돌린다.
■ hash <key>: 바로 뒤에 따라오는 값에 따라 해싱하여 분배한다. hash $remote_addr; 같은 방식으로 쓸 수 있다.
■ ip_hash: 아이피 해시 값에 따라 분배한다. weight를 고려한다.
■ random : 랜덤으로 분배한다. 하지만 weight(가중치)가 있을경우 weight를 고려한다.
■ least_conn: 가장 활성 연결 수가 적은 곳을 선택한다. weight를 고려한다.
■ least_time: 평균 연결시간이 가장 짧으며 활성 연결 수가 적은 곳을 선택한다. weight 고려한다.
아래는 ip_hash를 적용한 예시이다.
upstream backend {
ip_hash; # <hash | random | least_conn | least_time>
server lou-server1.com;
server lou-server2.com;
server lou-server3.com;
}
server 지시자의 유용한 parameter들
■ backup
server lou-server3.com backup;
backup 파라미터는 해당 서버를 백업 서버로 지정한다. 주요 서버에 장애가 생기면 그때서야 요청이 전달된다.
■ weight=<number>
upstream backend {
server lou-server1.com weight=3;
server lou-server2.com;
server lou-server3.com backup;
}
서버의 가중치를 설정한다. 예시 코드에서 lou-server1.com은 lou-server2.com보다 3배 많은 요청을 분배받게 된다. (lou-server3.com은 백업 서버이므로)
■ max_conns=<number>
upstream backend {
server lou-server1.com weight=3 max_conns=256;
server lou-server2.com;
server lou-server3.com backup;
}
nginx의 각 worker별로 동시 연결수를 설정한다. 기본값은 0이며, 제한이 없음을 의미한다.
■ max_fails=<number>
server lou-server1.com max_fails=3;
설정한 수 만큼 요청이 실패할 경우 다른 서버에게 요청이 넘어간다.
■ fail_timeout=<time(sec)>
server lou-server1.com max_fails=3 fail_timeout=30;
설정한 시간동안 서버가 응답하지 못하면 실패로 간주한다.
적용하기
upstream backend {
server lou-server1.com weight=3;
server lou-server2.com;
server lou-server3.com backup;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
proxy_pass는 location에 맵핑될 URI를 설정한다. 여기서는 방금 정의한 upstream 그룹명인 backend를 적어 80 포트로 들어온 요청들이 upstream 서버를 타도록 설정 했다.
참고자료
https://developer88.tistory.com/299
http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#hash
'프로그래밍 > Network' 카테고리의 다른 글
HTTP Request/Response의 메세지 구조 뜯어보기 (0) | 2022.02.12 |
---|---|
MIME 타입 (0) | 2022.02.12 |
Ngnix의 개념과 작동방식 정리 (feat. Apache) (0) | 2021.10.31 |
[Nginx] Static 파일을 캐싱해서 웹 페이지 로딩 속도를 높이자 (0) | 2021.01.26 |
IP와 Subnet (0) | 2020.11.28 |