Blog
책 리뷰
Nginx 쿡북

Nginx 쿡북

Nginx에서 업스트림 서버의 문제를 감지하는 방식

  • 패시브 방식
    • 오픈 소스 버전에서 사용
    • 사용자의 요청을 로드 밸런서가 받은 시점에 업스트림 서버와의 연결이나 응답을 확인하는 방식
    • 👉 업스트림서버의 부하를 늘리지 않고 싶을 때 사용
  • 액티브 방식
    • 엔진엑스 플러스에서 제공
    • 로드 밸런서가 주기적으로 연결을 시도하거나 요청을 보내 서버 응답에 문제가 없는지 확인하는 방식

부하 분산

HTTP 부하 분산

  • HTTP는 upstream으로 관리를 한다. (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;
  }
}

TCP 부하 분산

TCP 방식은 stream 블록과 upstream 블록을 사용해서 부하를 분산한다.
아래 코드는 server 블록을 사용해서 3306 포트로 TCP 요청을 받아 읽기 전용 MySQL 서버로 분산하는 코드이며, TCP 방식은 반드시 stream 블록 안에 있어야 한다.

stream 모듈을 이용한 설정은 stream.conf.d 폴더에 따로 모아두는게 좋음

user nginx;
woker_processes auto;
pid /run/nginx.pid;
 
stream {
  include /etc/nginx/conf.d/mysql_read.conf;
  # include /etc/nginx/conf.d/*.conf; 👈 이렇게 해도 됨
}
upstream mysql_read {
  server read1.example.com:3306;
  server read2example.com:3306;
}
 
server {
  listen 3306;
  proxy_pass mysql_read;
}

UDP 부하 분산

stream {
  upstream utp {
    server ntp1.example.com:123 weight=2;
    server ntp2.example.com:123;
  }
 
  server {
    listen 123 udp;
    proxy_pass utp;
  }
}

reuseport

클라이언트와 서버가 패킷을 여러 번 주고받아야 한다면 reuseport 매개변수를 사용하면 된다. 부하분산이 적용된 서비스는 오픈VPN, 음성 인터넷 프로토콜(VoIP), 가상 데스크톱 환경, DTLS가 대표적이다.

👇 아래 예시는 엔진엑스를 통해 오픈VPN에 대한 연결을 관리하고 로컬 환경에서 동작 중인 오픈VPN으로 패킷을 전달해 주는 설정

stream {
  server {
    listen 1195 udp reuseport;
    proxy_pass 127.0.0.1:1194;
  }
}

부하분산 알고리즘

  • round_robin : 기본값
  • least_conn : 연결이 적은 서버를 먼저 활용
upstream be {
  least_conn;
  server backend.example.com;
  server backend1.example.com;
}
  • $remote_addr : 제네릭 해시 알고리즘 사용
upstream be {
  hash $remote_addr;
  server backend.example.com;
  server backend1.example.com;
}
  • least_time : 가장 빠른 응답 시간을 가진 서버에 요청을 보냄

성능 튜닝

keepalive 설정

  • keepalive_requests : 하나의 keepalive 연결에서 처리할 수 있는 요청 수
  • keepalive_timeout : keepalive 연결이 유지되는 시간
http {
  keepalive_requests 320; # 기본 100
  keepalive_timeout 300s; # 기본 75
}

upstream 서버의 keepalive 설정

  • proxy_set_header : Connection 헤더의 기본 값인 close를 빈 문자열로 설정
proxy_set_header Connection "";
 
upstream backend {
  server backend.example.com:80;
  keepalive 32; # 기본 32
}

net.core.somaxconn

커널 설정의 net.core.somaxconn은 서버의 최대 연결 대기 큐를 설정한다.