우선 Nginx는 Proxy server 역할도 있지만, Load Balancing 역할도 할 수 있습니다.
사용해보고 싶었던 기술 중 자동적인 Nginx Health Check는 Nginx Plus 버전에서만 사용 가능하다고 합니다.
하지만 Health Check를 수동으로 체크하는 방법 또한 있습니다!
여기서는 HTTP 로드 밸런싱에 대해 알아보겠습니다!
upstream : 업스트림 서버는 Nginx를 통해 트래픽을 분산할 서버 그룹을 의미합니다.
backend : 서버 그룹을 의미하고, 이름을 backend로 지정했습니다. 다른 이름을 붙여주셔도 상관 없습니다.
server : 각각의 서버를 등록할 때, 맨 앞에 사용하는 지시자입니다.
아래와 같이 입력하게 되면 균등하게 oddong1 -> oddong2 -> oddong3
순서대로 트래픽이 분산됩니다.
upstream backend {
server oddong1.example.com;
server oddong2.example.com;
server oddong3.example.com;
}
weight : 로드 밸런싱 가중치
default = 1
여기서 6개의 트래픽이 날라온다고 가정해보면, 5개는 1번 서버로, 나머지 1개는 2번 서버로 트래픽이 분산됩니다.
그리고 만약 1, 2번 서버가 다운되면 그 때 backup으로 설정해놓은 서버에 트래픽이 이동되게 됩니다.
upstream backend {
server oddong1.example.com weight=5; # 다른 서버보다 5배의 트래픽을 할당받는다.
server oddong2.example.com;
server oddong3.example.com;
}
backup : 백업 서버로 할당됨. 앞의 두 개의 서버가 다운되지 않는 한 트래픽을 할당받지 않는다.
여기서 만약 1, 2번 서버가 다운되면 그 때 backup으로 설정해놓은 서버에 트래픽이 이동되게 됩니다.
upstream backend {
server oddong1.example.com weight=5; # 다른 서버보다 5배의 트래픽을 할당받는다.
server oddong2.example.com;
server oddong3.example.com backup;
}
모든 웹 트래픽은 위에서 설정한 backend
서버 그룹으로 흘러가고, Nginx는 로드 밸런싱을 위한 Proxy server
역할을 할 것이기 때문에 다음과 같이 설정해주면 됩니다.
server {
location / {
proxy_pass http://backend;
}
}
max_fails : 헬스 체크의 최대 실패 횟수
fail_timeout : 실패에 대한 타임아웃
다음 예는 Nginx가 서버에 요청을 보내지 못하거나 10초 동안 3번의 응답을 받지 못하면 서버를 30초 동안 사용할 수 없는 것으로 표시됩니다.
upstream backend {
server oddong1.example.com max_fails=3 fail_timeout=10s; # A
server oddong2.example.com max_fails=3 fail_timeout=10s; # B
server oddong3.example.com backup; # C
}
upstream backend {
server oddong1.example.com weight=3; # A
server oddong2.example.com; # B
server oddong3.example.com backup; # C
}
server {
location / {
proxy_pass http://backend;
}
}
아래 사진은 테스트해보면서 느꼈던 건뎅 그냥 같이 총총,,
트래픽을 각 서버들에게 균등하게 나누어 배분하는 기법입니다.
특정 서버에 트래픽을 더 전달하고 싶다면 앞서 얘기한 weight 속성을 사용하면 됩니다.
만약 보내고 싶지 않다면 down 변수를 사용해 트래픽을 할당하지 않는 방법 또한 있습니다.
upstream backend {
# no load balancing method is specified for Round Robin
server oddong1.example.com;
server oddong2.example.com;
}
or
upstream backend {
# no load balancing method is specified for Round Robin
server oddong1.example.com weight=5;
server oddong2.example.com;
}
or
upstream backend {
# no load balancing method is specified for Round Robin
server oddong1.example.com weight=5;
server oddong2.example.com down;
}
트래픽을 받은 시점에 활성화된 connection이 제일 적은 서버에게 트래픽을 분산하는 기법입니다.
upstream backend {
least_conn;
server oddong1.example.com;
server oddong2.example.com;
}
클라이언트 IP의 해시 값으로 트래픽을 분산시키는 기법입니다. 동일한 클라이언트의 요청은 동일한 서버에게 전달됩니다.
IPv4는 첫 3자리로 해시값을 구하기에 같은 대역의 클라이언트는 같은 서버에게 트래픽이 할당됩니다.
upstream backend {
ip_hash;
server oddong1.example.com;
server oddong2.example.com;
}
사용자가 설정한 다양한 변수를 조합해 트래픽을 분산하는 방법입니다. 예를 들어 요청하는 웹 페이지의 URL이나, 사용자의 IP 주소와 포트 번호의 조합, 일반적인 문자열, 변수의 조합 등 다양합니다.
upstream backend {
hash $request_uri consistent;
server oddong1.example.com;
server oddong2.example.com;
}
참고자료 📩