로드 밸런싱을 통해 많은 인터넷 트래픽을 여러 웹 서버로 분산시킬 수 있다.
사실 토이 프로젝트 등에선 로드 밸런싱을 적용할 만큼의 트래픽이 나오지 않는 것이 사실이다. 하지만 WAS가 한 대 뿐이라면 그 WAS가 어떤 원인이든 죽어버리면 전체 서비스 장애로 이어진다. 이를 해결하기 위해 스케일 아웃을 해서 적어도 2대의 WAS가 있는 편이 안전하다고 판단했다.
NGINX로 로드 밸런싱? Nginx를 로드 밸런서로 사용하는 이유는 간단하고 저렴하기 때문이다. L4, L7 스위치 등은 하드웨어로 구성해야하며 가격이 비싸다. 반면 Nginx를 사용하면, 서버에 소프트웨어만 설치하면 되므로 시간과 비용이 절약된다. https://hudi.blog/load-balancing-with-nginx/
http {
upstream backends {
server backend1.example.com;
server backend2.example.com;
server 192.0.0.1 backup;
}
server {
location / {
proxy_pass http://backends;
}
}
}
/
로 들어온 요청이 proxy_pass
로 연결되는 데 이 때 backends
라는 upstream block
안의 주소들에게 분배될 것이다.upstream backend {
# no load balancing method is specified for Round Robin
server backend1.example.com;
server backend2.example.com;
}
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
}
요청이 들어오는 서버가 사용자 정의 키에 의해 결정된다. 사용자 정의 키에는 문자열, 변수 등의 조합이 될 수도 있다.
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
각 요청에 대해 NGINX Plus가 최소 평균 지연 시간과 최소 활성 커넥션을 가진 서버를 선택한다.
upstream backend {
least_time header;
server backend1.example.com;
server backend2.example.com;
}
최소 지연 시간은 다음 세 변수에 의해 계산이 달라진다.
header
- 서버로부터 첫 번째 바이트를 수신하는 시간last_byte
- 서버로부터 전체 응답을 수신하는 시간last_byte inflight
- 불완전한 요청을 고려하여 서버로부터 전체 응답을 수신하는 시간각 요청이 무작위로 서버로 전송된다.
two
매개변수가 정의된 경우, NGINX는 서버 가중치를 고려하여 무작위로 2개의 서버를 선택한 뒤 아래 방법을 사용하여 서버 하나를 선택한다.
least_conn
- 최소 활성 커넥션 수least_time=header
(NGINX Plus) - 서버로부터 응답 헤더를 수신하는 최소 평균 시간least_time=last_byte
(NGINX Plus) - 서버로부터 전체 응답을 수신하기 위한 최소 평균 시간upstream backend {
random two least_time=last_byte;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
server backend4.example.com;
}
upstream backends { # 트래픽을 분산시킬 IP와 Port 정보
server 192.168.2.xxx:8080;
server 192.168.2.yyy:8080;
}
server {
listen 443 ssl;
server_name admin.smody.co.kr;
ssl_certificate /etc/letsencrypt/live/admin.smody.co.kr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/admin.smody.co.kr/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://backends; # upstream 블럭과 매핑
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo nginx -s reload
실행아마존 웹 서비스(AWS Discovery Book)
https://jiwondev.tistory.com/189
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=innolifes&logNo=222078920240
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/