이론
upstream 블록과 http 모듈을 이용해 http 서버 간에 부하 분산
upstream backend {
server 10.10.12.45:80 weight=1;
server app.example.com:80 weight=2;
server spare.example.com:80 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
프라이머리 서버(server 지시자와 weight 매개변수로 가중치를 설정한 서버) 두 대
server 10.10.12.45:80 weight=1;
server app.example.com:80 weight=2;
위 서버들에 연결이 불가능 할 시
백업으로 지정한 서버 사용
server spare.example.com:80 backup;
목적지 풀(서버 그룹/팜) : 유닉스 소켓, IP 주소, DNS 레코드 가능
upstream 대상은 server 지시자로 설정
upstream 블록과 stream 모듈을 이용해 TCP 서버 간에 부하 분산
stream {
upstream mysql_read {
server read1.example.com:3306 weight=5;
server read2.example.com:3306;
server 10.10.12.34:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_read;
}
}
3306포트로 TCP 요청을 받아 읽기 전용 복제본 두 대로 구성된 MySQL 서버로 부하 분산
기본 설정 파일 경로인 conf.d 폴더는 http 블록에 포함됨
stream 모듈을 이용한 이 설정은 stream.conf.d라는 별도 폴더를 생성하는게 좋다고 함
# /etc/nginx/nginx.conf 설정 파일, stream 블록 추가
user nginx;
worker_processes auto;
pid /run/nginx.pid;
...
stream {
include /etc/nginx/stream.conf.d/*.conf;
}
# /etc/nginx/stream.conf.d/mysql_read.conf 설정 파일
upstream mysql_read {
server read1.example.com:3306 weight=5;
server read2.example.com:3306;
server 10.10.12.34:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_read;
}
http 모듈이 HTTP 프로토콜을 완전히 이해하도록 특별히 설계된 반면 stream 모듈은 패킷의 전달 경로 결정과 부하분산에 더 중점을 둔다는 정도로 이해하면 적당하겠습니다.
nginx에서 TCP 부하분산은 stream 모듈을 이용해 정의
TCP 부하분산 파트의 내용 이해가 조금 어렵게 느껴진다
upstream이 중복돼는데 저 부분이 많이 헷갈리는 것 같다.