프로그래밍/Network

[Nginx] 리버스 프록시로 사용하기 (백업 서버 설정, 로드 밸런싱)

Lou Park 2021. 11. 5. 01:15

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 

http://nginx.org/en/docs/http/ngx_http_upstream_module.html