서버에서 들어온 요청을 순서대로 돌아가는 배정하는 방식이다.
클라이언트의 요청을 순서대로 분배하기 때문에 여러 대의 서버가 있고, 서버와의 연결이 오래 지속되지 않는 경우에 활용하기 적합하다.
적용
예시의 server에서 서로 사양이 다르다면 가중치를 다르게 줄 수 있습니다.
더 좋은 사양의 서버에게 높은 가중치를 줄 수 있습니다.
weight가 없으면 default로 1로 설정됩니다.
upstream backend {
server backend1.example.com;
server backend2.example.com weight=4;
server backend3.example.com weight=2;
server backend4.example.com weight=1;
}
클라이언트의 IP 주소를 특정 서버에서 요청을 처리하는 방식이다.
사용자의 IP를 해싱해 로드를 분배하기 때문에 사용자가 항상 동일한 서버로 연결되는 것을 보장한다.
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
server backend4.example.com;
}
요청이 들어온 시점에 가장 적은 연결 상태를 보이는 서버에 우선적으로 트래픽을 분배한다.
자주 세션이 길어지거나, 서버에 분배된 트래픽들이 일정하지 않은 경우에 적합하다.
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
server backend4.example.com;
}
서버의 현재 연결 상태와 응답 시간을 모두 고려하여 트래픽을 분배하는 방식이다.
가장 적은 연결 상태와 가장 짧은 응답 시간을 보이는 서버에 우선적으로 로드를 배분하는 방식이다.
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
server backend4.example.com;
}
요청이 전송되는 서버는 텍스트 문자열, 변수 또는 조합일 수 있는 사용자 정의 키로 결정됩니다.
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
각 요청은 임의로 선택한 서버로 전달됩니다.
# least_conn – The least number of active connections
upstream backend {
random two least_time=last_byte;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
server backend4.example.com;
}
nginx.conf 코드
# nginx/nginx.conf
user nginx;
worker_processes 1;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/mime.types;
default_type application/octet-stream;
upstream nodeApps {
server node-app1:3000;
server node-app2:3000;
server node-app3:3000;
}
server {
listen 80;
server_name http://localhost;
location / {
proxy_pass http://nodeApps;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
sendfile on;
keepalive_timeout 65;
}
nginx.conf
# nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 10;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
node.conf
# conf.d/node.conf
server {
listen 80;
server_name localhost;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://nodeApps;
proxy_redirect off;
}
}
upstream nodeApps {
server 172.20.0.5:3000;
server 172.20.0.6:3000;
server 172.20.0.7:3000;
}