서버의 과부하로 인한 shutdown을 막기 위해 웹서버로 이용하고 있는 Nginx를 로드밸런서로 사용하고자 알아보았습니다.
간단하게 설명하면 서버가 부담하는 부하를 분산해주는 장치 혹은 기술이다.
사업의 규모가 커지고 사용자가 늘게 되면 서버가 부담하는 부하가 늘게 되고 자잘한 에러가 생기거나 서버가 다운될 수 도 있다. 그럴때 이제 백엔드 개발자는 고민이 생긴다.
여기서 필자는 비용적인 부분을 생각해 논리적인 Scale out 방식을 생각했다.
🔮 Scale out을 하기 위해서 무조건 해야 하는 일이 로드밸런싱이다!
🏃♂️ 무중단 서비스 & 배포
L2, L4, L7 로드밸런싱이 있다.
그 중에 L4와 L7 로드밸런싱이 가장 많이 사용되기 때문에 두 종류만 다뤄보도록 하겠다.
기본적으로 Reverse Proxy를 기반으로 동작한다.
로드밸런싱만을 위해 개발된 프로그램이 아니기 때문에 기본적인 로드밸런싱의 기능만이 있지만 그만큼 비용적으로 저렴하고 구축이 쉽다는 장점이 있다.
필자는 Ubuntu를 사용하고 있어 그 기준으로 적도록 하겠다.
/etc/nginx/nginx.conf
http {
include /etc/nginx/site-enabled/*;
}
전체 경로
/etc/nginx/site-enabled/파일 이름
👨💻 추가할 데이터
upstream backend { // backend자리에 이름
least_conn; //알고리즘을 적어준다. (기본: 라운드 로빈)
server localhost:8801;
server localhost:8802; //클라이언트가 Nginx로 요청 시
server localhost:8803; //우회시켜줄 Server 정보
}
server {
listen 80; //클라이언트가 요청하는 포트
location / {
proxy_set_header Host $host; //클라이언트의 호스트 설정
proxy_set_header Connection ""; //upstream서버를 사용하겠다 지정(⭐중요)
proxy_pass http://backend; //설정한 이름으로 요청 보내기
}
}
service nginx reload
방법 | 설명 |
---|---|
라운드로빈(기본값) | 요청을 순서대로 처리한다. |
least_conn(최소 연결) | 각 요청을 서버에 할당된 가중치를 고려해 연결 수가 가장 적은 서버로 전송 |
ip_hash | 요청이 클라이언트 IP주소로 해싱 > 한번 요청 받은 서버가 있을 때 해당 서버에만 요청을 분배 |
least_time | 연결 수가 가장 적으면서 평균 응답시간이 가장 적은 쪽을 선택해서 분배 (Nginx Plus에서만 가능) |