ngx_http_upstream_module

ngx_http_upstream_module ๋ชจ๋“ˆ์€ proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass ๋ฐ grpc_pass ๋ช…๋ น์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„ ๊ทธ๋ฃน์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.keepalive connections

์˜ˆ์ œ ๊ตฌ์„ฑ

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

์ฃผ๊ธฐ์ ์ธ ์ƒํƒœ ๊ฒ€์‚ฌ๋ฅผ ํฌํ•จํ•˜๋Š” ๋™์ ์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๊ทธ๋ฃน์€ ์ƒ์—…์šฉ ๊ตฌ๋…์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

resolver 10.0.0.1;

upstream dynamic {
    zone upstream_dynamic 64k;

    server backend1.example.com      weight=5;
    server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
    server 192.0.2.1                 max_fails=3;
    server backend3.example.com      resolve;
    server backend4.example.com      service=http resolve;

    server backup1.example.com:8080  backup;
    server backup2.example.com:8080  backup;
}

server {
    location / {
        proxy_pass http://dynamic;
        health_check;
    }
}

Directives

Syntax:  upstream name { ... }
Default: โ€”
Context: http

์„œ๋ฒ„ ๊ทธ๋ฃน์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๋‹ค์–‘ํ•œ ํฌํŠธ์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, TCP ๋ฐ UNIX-๋„๋ฉ”์ธ ์†Œ์ผ“์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๋Š” ์„œ๋ฒ„๋Š” ํ˜ผํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์˜ˆ:

upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com  backup;
}

๊ธฐ๋ณธ์ ์œผ๋กœ ์š”์ฒญ์€ ๊ฐ€์ค‘์น˜๊ฐ€ ๋งค๊ฒจ์ง„ ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์—์„œ 7๊ฐœ์˜ ์š”์ฒญ์€ ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. 5๊ฐœ์˜ ์š”์ฒญ์€ backend1.example.com์œผ๋กœ ์ด๋™ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ์„œ๋ฒ„๋กœ 1๊ฐœ์˜ ์š”์ฒญ์ด ๊ฐ๊ฐ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€์˜ ํ†ต์‹  ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์š”์ฒญ์€ ๋‹ค์Œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋˜๊ณ , ์ž‘๋™ํ•˜๋Š” ์„œ๋ฒ„๊ฐ€ ๋ชจ๋‘ ์‹œ๋„๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์„œ๋ฒ„๋กœ์˜ ์ „๋‹ฌ์ด ๊ณ„์† ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์–ด๋–ค ์„œ๋ฒ„์—์„œ๋„ ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๋งˆ์ง€๋ง‰ ์„œ๋ฒ„์™€์˜ ํ†ต์‹  ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

Syntax:  server address [parameters];
Default: โ€”
Context: upstream

์„œ๋ฒ„์˜ ์ฃผ์†Œ์™€ ๊ธฐํƒ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์†Œ๋Š” ํฌํŠธ ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ๋„๋ฉ”์ธ ์ด๋ฆ„ ๋˜๋Š” IP ์ฃผ์†Œ๋กœ ๋˜๋Š” “unix:” ์ ‘๋‘์‚ฌ ๋‹ค์Œ์— ์ง€์ •๋˜๋Š” UNIX-๋„๋ฉ”์ธ ์†Œ์ผ“ ๊ฒฝ๋กœ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํŠธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ํฌํŠธ 80์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ IP ์ฃผ์†Œ๋กœ ํ™•์ธํ•˜๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„์€ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

weight=number
๋Š” ์„œ๋ฒ„์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’์€ 1).

max_conns=number

ํ”„๋ก์‹œ ์„ค์ •๋œ ์„œ๋ฒ„(1.11.5)์— ๋Œ€ํ•œ ์ตœ๋Œ€ ๋™์‹œ ํ™œ์„ฑ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์œผ๋กœ ์ œํ•œ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทธ๋ฃน์ด ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผํ•˜์ง€ ์•Š์œผ๋ฉด ์ œํ•œ์ด ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค๋‹น ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์œ ํœด keepalive ์—ฐ๊ฒฐ, ์—ฌ๋Ÿฌ ์ž‘์—…์ž ๋ฐ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ํ”„๋ก์‹œ ์„ค์ •๋œ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ „์ฒด ํ™œ์„ฑ ๋ฐ ์œ ํœด ์—ฐ๊ฒฐ ์ˆ˜๋Š” max_conns ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

max_fails=number

fail_timeout ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์„ค์ •๋œ ๊ธฐ๊ฐ„์— ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ์„œ๋ฒ„์™€์˜ ์‹คํŒจํ•œ ํ†ต์‹  ์‹œ๋„ ์ˆ˜๋ฅผ ์„ค์ •ํ•˜์—ฌ fail_timeout ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋„ ์„ค์ •๋˜๋Š” ๊ธฐ๊ฐ„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์„œ๋ฒ„๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํŒจํ•œ ์‹œ๋„ ์ˆ˜๋Š” 1๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. 0 ๊ฐ’์€ ์‹œ๋„ ๊ณ„์‚ฐ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ์‹œ๋„๋กœ ๊ฐ„์ฃผ๋˜๋Š” ๊ฒƒ์€ proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, memcached_next_upstream ๋ฐ grpc_next_upstream ๋ช…๋ น์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

fail_timeout=time

๋‹ค์Œ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„์™€์˜ ์‹คํŒจํ•œ ํ†ต์‹  ์‹œ๋„์˜ ์ง€์ •๋œ ํšŸ์ˆ˜๊ฐ€ ์ผ์–ด๋‚˜ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋กœ ๊ฐ„์ฃผํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๊ฐ„
  • ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋กœ ๊ฐ„์ฃผ๋˜๋Š” ๊ธฐ๊ฐ„

๊ธฐ๋ณธ์ ์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” 10์ดˆ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

backup

์„œ๋ฒ„๋ฅผ ๋ฐฑ์—… ์„œ๋ฒ„๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ์š”์ฒญ์ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๋Š” hash, ip_hash ๋ฐ random ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

down

์„œ๋ฒ„๋ฅผ ์˜๊ตฌ์  ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ƒ์—…์šฉ ๊ตฌ๋…์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

resolve

์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” IP ์ฃผ์†Œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  nginx(1.5.12)๋ฅผ ์žฌ์‹œ์ž‘ํ•  ํ•„์š” ์—†์ด ์—…์ŠคํŠธ๋ฆผ ๊ตฌ์„ฑ์„ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทธ๋ฃน์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ํ™•์ธ์ž ๋ช…๋ น์ด http ๋ธ”๋ก ๋˜๋Š” ํ•ด๋‹นํ•˜๋Š” ์—…์ŠคํŠธ๋ฆผ ๋ธ”๋ก์— ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

route=string

์„œ๋ฒ„ ๊ฒฝ๋กœ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

service=name

DNS SRV ๋ ˆ์ฝ”๋“œ์˜ ํ™•์ธ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์„œ๋น„์Šค ์ด๋ฆ„(1.9.13)์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ์„œ๋ฒ„์— ๋Œ€ํ•œ resolve ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๊ณ  ํฌํŠธ ๋ฒˆํ˜ธ ์—†์ด ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์ด๋ฆ„์— ์ (“.”)์ด ์—†์„ ๊ฒฝ์šฐ, RFC๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์ด๋ฆ„์„ ์ƒ์„ฑํ•˜๊ณ  TCP ํ”„๋กœํ† ์ฝœ์„ ์„œ๋น„์Šค ์ ‘๋‘์‚ฌ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, _http._tcp.backend.example.com SRV ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

server backend.example.com service=http resolve;

์„œ๋น„์Šค ์ด๋ฆ„์— ์ ์ด ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จ๋˜๋ฉด ์ด๋ฆ„์€ ์„œ๋น„์Šค ์ ‘๋‘์‚ฌ์™€ ์„œ๋ฒ„ ์ด๋ฆ„์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, _http._tcp.backend.example.com ๋ฐ server1.backend.example.com SRV ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด ๋ช…๋ น์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

server backend.example.com service=_http._tcp resolve;
server example.com service=server1.backend resolve;

์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ SRV ๋ ˆ์ฝ”๋“œ(๋™์ผํ•˜๊ฒŒ ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์˜ ์šฐ์„ ์ˆœ์œ„ ๊ฐ’์„ ๊ฐ€์ง„ ๋ ˆ์ฝ”๋“œ)๋Š” ๊ธฐ๋ณธ ์„œ๋ฒ„๋กœ ํ™•์ธ๋˜๊ณ  ๋‚˜๋จธ์ง€ SRV ๋ ˆ์ฝ”๋“œ๋Š” ๋ฐฑ์—… ์„œ๋ฒ„๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. backup ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์„œ๋ฒ„์— ๋Œ€ํ•ด ์ง€์ •๋˜๋Š” ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ SRV ๋ ˆ์ฝ”๋“œ๋Š” ๋ฐฑ์—… ์„œ๋ฒ„๋กœ ํ™•์ธ๋˜๊ณ  ๋‚˜๋จธ์ง€ SRV ๋ ˆ์ฝ”๋“œ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

slow_start=time

๋น„์ •์ƒ ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ด ๋˜๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋กœ ๊ฐ„์ฃผ๋œ ๊ธฐ๊ฐ„ ํ›„์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ ๊ฒฝ์šฐ ์„œ๋ฒ„๊ฐ€ 0์—์„œ ๋ช…๋ชฉ ๊ฐ’์œผ๋กœ ๊ฐ€์ค‘์น˜๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋А๋ฆฐ ์‹œ์ž‘์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๋Š” hash, ip_hash ๋ฐ random ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

drain

์„œ๋ฒ„๋ฅผ”๋“œ๋ ˆ์ด๋‹” ๋ชจ๋“œ(1.13.6)๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ์—์„œ๋Š” ์„œ๋ฒ„์— ๋ฐ”์ธ๋”ฉ๋œ ์š”์ฒญ๋งŒ ํ”„๋ก์‹œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 1.13.6 ์ด์ „์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ API ๋ชจ๋“ˆ๋กœ๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Syntax:  zone name [size];
Default: โ€”
Context: upstream
This directive appeared in version 1.9.0.

์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์— ๊ณต์œ ๋˜๋Š” ๊ทธ๋ฃน์˜ ๊ตฌ์„ฑ ๋ฐ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ์ด๋ฆ„ ๋ฐ ํฌ๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ทธ๋ฃน์ด ๋™์ผํ•œ ์˜์—ญ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ํฌ๊ธฐ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ƒ์—…์šฉ ๊ตฌ๋…์˜ ์ผ๋ถ€๋กœ ๊ทธ๋Ÿฌํ•œ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ nginx๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ํ•„์š” ์—†์ด ํŠน์ •ํ•œ ์„œ๋ฒ„์˜ ์„ค์ •์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์€ API ๋ชจ๋“ˆ(1.13.3)์„ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ 1.13.3 ์ด์ „์—๋Š” upstream_conf๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ํŠน์ˆ˜ํ•œ ์œ„์น˜๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ตฌ์„ฑ์„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Syntax:  state file;
Default: โ€”
Context: upstream
This directive appeared in version 1.9.7.

๋™์ ์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๊ทธ๋ฃน์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ํŒŒ์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:

state /var/lib/nginx/state/servers.conf; # path for Linux
state /var/db/nginx/state/servers.conf;  # path for FreeBSD

์ƒํƒœ๋Š” ํ˜„์žฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ์„œ๋ฒ„์˜ ๋ชฉ๋ก์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์€ ๊ตฌ์„ฑ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๋•Œ ์ฝํžˆ๊ณ  ์—…์ŠคํŠธ๋ฆผ ๊ตฌ์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ฝ˜ํ…์ธ ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์€ ์„œ๋ฒ„ ๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๋‹ค์‹œ ๋กœ๋“œ ๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์—…๊ทธ๋ ˆ์ด๋“œ ๋™์•ˆ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์€ ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์€ ์ƒ์—…์šฉ ๊ตฌ๋…์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Syntax:  hash key [consistent];
Default: โ€”
Context: upstream
This directive appeared in version 1.7.2.

ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋งคํ•‘์ด ํ•ด์‹œ๋œ ํ‚ค ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์„œ๋ฒ„ ๊ทธ๋ฃน์— ๋Œ€ํ•ด ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋Š” ํ…์ŠคํŠธ, ๋ณ€์ˆ˜ ๋ฐ ๊ทธ ์กฐํ•ฉ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฃน์— ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ฃน์—์„œ ์„œ๋ฒ„๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ํ‚ค๊ฐ€ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ๋‹ค์‹œ ๋งคํ•‘๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ Cache::Memcached Perl ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

Syntax:  ip_hash;
Default: โ€”
Context: upstream

๊ทธ๋ฃน์—์„œ ํด๋ผ์ด์–ธํŠธ IP ์ฃผ์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ์š”์ฒญ์ด ๋ถ„์‚ฐ๋˜๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ IPv4 ์ฃผ์†Œ์˜ ์ฒ˜์Œ 3๊ฐœ์˜ ์˜ฅํ…Ÿ ๋˜๋Š” ์ „์ฒด IPv6 ์ฃผ์†Œ๊ฐ€ ํ•ด์‹ฑ ํ‚ค๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋™์ผํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ•ญ์ƒ ๋™์ผํ•œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์€ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ๋™์ผํ•œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋  ํ™•๋ฅ ์ด ๊ฐ€์žฅ ๋†’์Šต๋‹ˆ๋‹ค.

IPv6 ์ฃผ์†Œ๋Š” ๋ฒ„์ „ 1.3.2 ๋ฐ 1.2.2๋ถ€ํ„ฐ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ IP ์ฃผ์†Œ์˜ ํ˜„์žฌ ํ•ด์‹ฑ์„ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ down ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:

upstream backend {
    ip_hash;

    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
}
Syntax:  keepalive connections;
Default: โ€”
Context: upstream
This directive appeared in version 1.1.4.

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์˜ ์บ์‹œ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

connections ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ฐ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค์˜ ์บ์‹œ์—์„œ ๋ณด์กด๋˜๋Š” ์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์œ ํœด keepalive ์—ฐ๊ฒฐ์˜ ์ตœ๋Œ€ ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ตœ์†Œ ์ตœ๊ทผ ์‚ฌ์šฉ ์—ฐ๊ฒฐ์ด ๋‹ซํž™๋‹ˆ๋‹ค.

ํŠนํžˆ keepalive ๋ช…๋ น์ด nginx ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ด ์ˆ˜ ์žˆ๋Š” ์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ „์ฒด ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ํŠน๋ณ„ํžˆ ์ฃผ๋ชฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. connections ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„๊ฐ€ ์ƒˆ๋กœ์šด ์ˆ˜์‹  ์—ฐ๊ฒฐ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ˆซ์ž๋ฅผ ์ž‘๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ keepalive ๋ช…๋ น ์•ž์—์„œ ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

keepalive ์—ฐ๊ฒฐ์ด ์žˆ๋Š” memcached ์—…์ŠคํŠธ๋ฆผ์˜ ์˜ˆ์ œ ๊ตฌ์„ฑ:

upstream memcached_backend {
    server 127.0.0.1:11211;
    server 10.0.0.2:11211;

    keepalive 32;
}

server {
    ...

    location /memcached/ {
        set $memcached_key $uri;
        memcached_pass memcached_backend;
    }

}

HTTP์˜ ๊ฒฝ์šฐ proxy_http_version ๋ช…๋ น์€ “1.1”๋กœ ์„ค์ •๋˜์–ด์•ผ ํ•˜๊ณ  “Connection” ํ—ค๋” ํ•„๋“œ๋Š” ์ง€์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

upstream http_backend {
    server 127.0.0.1:8080;

    keepalive 16;
}

server {
    ...

    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}

๋˜๋Š”, HTTP/1.0 ์˜๊ตฌ ์—ฐ๊ฒฐ์€ “Connection: Keep-Alive” ํ—ค๋” ํ•„๋“œ๋ฅผ ์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

FastCGI ์„œ๋ฒ„์˜ ๊ฒฝ์šฐ keepalive ์—ฐ๊ฒฐ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด fastcgi_keep_conn์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

upstream fastcgi_backend {
    server 127.0.0.1:9000;

    keepalive 8;
}

server {
    ...

    location /fastcgi/ {
        fastcgi_pass fastcgi_backend;
        fastcgi_keep_conn on;
        ...
    }
}

SCGI ๋ฐ uwsgi ํ”„๋กœํ† ์ฝœ์—๋Š” keepalive ์—ฐ๊ฒฐ์˜ ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค.

Syntax:  keepalive_requests number;
Default: keepalive_requests 1000;
Context: upstream
This directive appeared in version 1.15.3.

ํ•˜๋‚˜์˜ keepalive ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์š”์ฒญ ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ ์š”์ฒญ ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ํ›„ ์—ฐ๊ฒฐ์ด ๋‹ซํž™๋‹ˆ๋‹ค.

๊ฐ ์—ฐ๊ฒฐ์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋ ค๋ฉด ์ •๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐ์„ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ง€๋‚˜์น˜๊ฒŒ ์š”์ฒญ ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ 1.19.10 ์ด์ „์—๋Š” ๊ธฐ๋ณธ๊ฐ’์ด 100์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Syntax:  keepalive_time time;
Default: keepalive_time 1h;
Context: upstream
This directive appeared in version 1.19.10.

์š”์ฒญ์ด ํ•˜๋‚˜์˜ keepalive ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๊ฐ„์— ๋„๋‹ฌํ•˜๊ณ  ๋‚˜๋ฉด ํ•˜์œ„ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

Syntax:  keepalive_timeout timeout;
Default: keepalive_timeout 60s;
Context: upstream
This directive appeared in version 1.15.3.

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์œ ํœด keepalive ์—ฐ๊ฒฐ์ด ๊ณ„์† ์—ด๋ ค ์žˆ๋Š” ์‹œ๊ฐ„์ œํ•œ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Syntax:  ntlm;
Default: โ€”
Context: upstream
This directive appeared in version 1.9.2.

NTLM ์ธ์ฆ์„ ํ†ตํ•œ ํ”„๋ก์‹œ ์‚ฌ์šฉ ์š”์ฒญ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ “Negotiate” ๋˜๋Š” “NTLM”์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” “๊ถŒํ•œ ๋ถ€์—ฌ” ํ—ค๋” ํ•„๋“œ ๊ฐ’์„ ๊ฐ€์ง„ ์š”์ฒญ์„ ์ „์†กํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์€ ๋™์ผํ•œ ์—…์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ํ”„๋ก์‹œ ์„ค์ •๋˜์–ด ์ธ์ฆ ์ปจํ…์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

NTLM ์ธ์ฆ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์— ๋Œ€ํ•œ keepalive ์—ฐ๊ฒฐ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. proxy_http_version ๋ช…๋ น์€ “1.1”๋กœ ์„ค์ •๋˜์–ด์•ผ ํ•˜๊ณ  “Connection” ํ—ค๋” ํ•„๋“œ๋Š” ์ง€์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

upstream http_backend {
    server 127.0.0.1:8080;

    ntlm;
}

server {
    ...

    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}

๊ธฐ๋ณธ ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ ๋ถ„์‚ฐ ์žฅ์น˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ntlm ๋ช…๋ น ์•ž์—์„œ ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Syntax:  least_conn;
Default: โ€”
Context: upstream
This directive appeared in versions 1.3.1 and 1.2.2.

๊ทธ๋ฃน์—์„œ ์ตœ์†Œ ํ™œ์„ฑ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ์„œ๋ฒ„๋กœ ์š”์ฒญ์ด ์ „๋‹ฌ๋˜๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•˜์—ฌ ์„œ๋ฒ„์˜ ๊ณ„์ • ๊ฐ€์ค‘์น˜๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ€์ค‘์น˜๊ฐ€ ๋งค๊ฒจ์ง„ ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ์ฐจ๋ก€๋กœ ์‹œ๋„๋ฉ๋‹ˆ๋‹ค.

Syntax:  least_time header | last_byte [inflight];
Default: โ€”
Context: upstream
This directive appeared in version 1.7.10.

๊ทธ๋ฃน์—์„œ ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์ ๊ณ  ์ตœ์†Œ ํ™œ์„ฑ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ์„œ๋ฒ„๋กœ ์š”์ฒญ์ด ์ „๋‹ฌ๋˜๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•˜์—ฌ ์„œ๋ฒ„์˜ ๊ณ„์ • ๊ฐ€์ค‘์น˜๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ€์ค‘์น˜๊ฐ€ ๋งค๊ฒจ์ง„ ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ์ฐจ๋ก€๋กœ ์‹œ๋„๋ฉ๋‹ˆ๋‹ค.

header ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜๋ฉด ์‘๋‹ต ํ—ค๋”๋ฅผ ์ˆ˜์‹ ํ•œ ์‹œ๊ฐ„์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. last_byte ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜๋ฉด ์ „์ฒด ์‘๋‹ต์„ ์ˆ˜์‹ ํ•œ ์‹œ๊ฐ„์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. inflight ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜๋ฉด(1.11.6) ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์š”์ฒญ๋„ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์€ ์ƒ์—…์šฉ ๊ตฌ๋…์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Syntax:  queue number [timeout=time];
Default: โ€”
Context: upstream
This directive appeared in version 1.5.12.

์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์ฆ‰์‹œ ์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์š”์ฒญ์€ ๋Œ€๊ธฐ์—ด์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์€ ๋™์‹œ์— ๋Œ€๊ธฐ์—ด์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์š”์ฒญ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์ด ๊ฐ€๋“ ์ฐจ๊ฑฐ๋‚˜ ์š”์ฒญ์„ ์ „๋‹ฌํ•  ์„œ๋ฒ„๋ฅผ timeout ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ง€์ •๋œ ๊ธฐ๊ฐ„ ๋‚ด์— ์„ ํƒํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 502(์ž˜๋ชป๋œ ๊ฒŒ์ดํŠธ์›จ์ด) ์˜ค๋ฅ˜๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

timeout ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์€ 60์ดˆ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์žฅ์น˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ queue ๋ช…๋ น ์•ž์—์„œ ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Syntax:  random [two [method]];
Default: โ€”
Context: upstream
This directive appeared in version 1.15.1.

๊ทธ๋ฃน์—์„œ ์š”์ฒญ์ด ์ž„์˜๋กœ ์„ ํƒ๋œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•˜์—ฌ ์„œ๋ฒ„ ๊ฐ€์ค‘์น˜๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

two ๋งค๊ฐœ๋ณ€์ˆ˜ ์˜ต์…˜์€ ๋ฌด์ž‘์œ„๋กœ 2๊ฐœ์˜ ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ ์ง€์ •๋œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•˜๋„๋ก nginx์— ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์€ ์ตœ์†Œ ํ™œ์„ฑ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ์„œ๋ฒ„์— ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋Š” least_conn์ž…๋‹ˆ๋‹ค.

least_time ๋ฐฉ๋ฒ•์€ ์ตœ์†Œ ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„๊ณผ ์ตœ์†Œ ํ™œ์„ฑ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ์„œ๋ฒ„์— ์š”์ฒญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. least_time=header๊ฐ€ ์ง€์ •๋˜๋ฉด ์‘๋‹ต ํ—ค๋” ์ˆ˜์‹  ์‹œ๊ฐ„์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. least_time=last_byte๊ฐ€ ์ง€์ •๋˜๋ฉด ์ „์ฒด ์‘๋‹ต ์ˆ˜์‹  ์‹œ๊ฐ„์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

least_time ๋ฐฉ๋ฒ•์€ ์ƒ์—…์šฉ ๊ตฌ๋…์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Syntax:  resolver address ... [valid=time] [ipv6=on|off] [status_zone=zone];
Default: โ€”
Context: upstream
This directive appeared in version 1.17.5.

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์˜ ์ด๋ฆ„์„ ์ฃผ์†Œ๋กœ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฆ„ ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

resolver 127.0.0.1 [::1]:5353;

์ฃผ์†Œ๋Š” ํฌํŠธ ์˜ต์…˜์„ ํฌํ•จํ•˜๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„ ๋˜๋Š” IP ์ฃผ์†Œ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํŠธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ 53 ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ž„ ์„œ๋ฒ„๋Š” ์ˆœํ™˜ ๋ฐฉ์‹์œผ๋กœ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ nginx๋Š” ํ™•์ธํ•˜๋Š” ๋™์•ˆ IPv4 ๋ฐ IPv6 ์ฃผ์†Œ๋ฅผ ๋ชจ๋‘ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. IPv6 ์ฃผ์†Œ ์กฐํšŒ๋ฅผ ์›ํ•˜์ง€ ์•Š์œผ๋ฉด ipv6=off ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ nginx ์บ์‹œ๋Š” ์‘๋‹ต์˜ TTL ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์  valid ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

resolver 127.0.0.1 [::1]:5353 valid=30s;

DNS ์Šคํ‘ธํ•‘์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ ์ ˆํ•˜๊ฒŒ ๋ณดํ˜ธ๋˜๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์—์„œ DNS ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

status_zone ๋งค๊ฐœ๋ณ€์ˆ˜ ์˜ต์…˜์€ ์ง€์ •๋œ ์˜์—ญ์—์„œ ์š”์ฒญ ๋ฐ ์‘๋‹ต์˜ DNS ์„œ๋ฒ„ ํ†ต๊ณ„ ์ˆ˜์ง‘์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์€ ์ƒ์—…์šฉ ๊ตฌ๋…์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Syntax:  resolver_timeout time;
Default: resolver_timeout 30s;
Context: upstream
This directive appeared in version 1.17.5.

์ด๋ฆ„ ๋ณ€ํ™˜์— ๋Œ€ํ•œ ์‹œ๊ฐ„์ œํ•œ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Syntax:  sticky cookie name [expires=time] [domain=domain] [httponly] [samesite=strict|lax|none] [secure] 
         [path=path];
         sticky route $variable ...;
         sticky learn create=$variable lookup=$variable zone=name:size [timeout=time] [header] [sync];
Default: โ€”
Context: upstream
This directive appeared in version 1.5.7.

์„ธ์…˜ ์„ ํ˜ธ๋„๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋™์ผํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ์„œ๋ฒ„ ๊ทธ๋ฃน์˜ ๋™์ผํ•œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cookie

์ฟ ํ‚ค ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋˜๋ฉด ์ง€์ •๋œ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ nginx๊ฐ€ ์ƒ์„ฑํ•œ HTTP ์ฟ ํ‚ค๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

upstream backend {
    server backend1.example.com;
    server backend2.example.com;

    sticky cookie srv_id expires=1h domain=.example.com path=/;
}

์•„์ง ํŠน์ •ํ•œ ์„œ๋ฒ„์— ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‚˜์˜จ ์š”์ฒญ์€ ๊ตฌ์„ฑ๋œ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ ํƒ๋œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•˜๋Š” ์ถ”๊ฐ€ ์š”์ฒญ์€ ์ง€์ •๋œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„์ง ๋ฐ”์šด๋”ฉ๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ์ƒˆ๋กœ์šด ์„œ๋ฒ„๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋ฐฉ์‹์€ ํ•ญ์ƒ ์ด๋ฏธ ๋ฐ”์ธ๋”ฉ๋œ ์š”์ฒญ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ถ€ํ•˜๋ฅผ ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐํ•˜๋ ค๊ณ  ํ•˜๋ฏ€๋กœ ํ™œ์„ฑ ๋ฐ”์ธ๋”ฉ๋œ ์š”์ฒญ ์ˆ˜๊ฐ€ ๋งŽ์€ ์„œ๋ฒ„๋Š” ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์„ค์ •๋˜๊ฑฐ๋‚˜ ๊ฒ€์‚ฌ๋˜๋„๋ก ์ฟ ํ‚ค์˜ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฟ ํ‚ค ๊ฐ’์€ IP ์ฃผ์†Œ ๋ฐ ํฌํŠธ์˜ MD5 ํ•ด์‹œ ๋˜๋Š” UNIX-๋„๋ฉ”์ธ ์†Œ์ผ“ ๊ฒฝ๋กœ์˜ 16์ง„์ˆ˜ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฒ„ ๋ช…๋ น์˜ “route” ๋ช…๋ น์ด ์ง€์ •๋˜๋Š” ๊ฒฝ์šฐ ์ฟ ํ‚ค ๊ฐ’์€ “route” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.

upstream backend {
    server backend1.example.com route=a;
    server backend2.example.com route=b;

    sticky cookie srv_id expires=1h domain=.example.com path=/;
}

์ด ๊ฒฝ์šฐ “srv_id” ์ฟ ํ‚ค์˜ ๊ฐ’์€ a ๋˜๋Š” b๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

expires=time

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.  ํŠน์ˆ˜ ๊ฐ’ max๋กœ ์ธํ•ด ์ฟ ํ‚ค๋Š” “2037๋…„ 12์›” 31์ผ 23:55:55 GMT”์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ์ฟ ํ‚ค๋Š” ๋ธŒ๋ผ์šฐ์ € ์„ธ์…˜์ด ๋๋‚  ๋•Œ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

domain=domain

์ฟ ํ‚ค๊ฐ€ ์„ค์ •๋˜๋Š” ๋„๋ฉ”์ธ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์—๋Š” ๋ณ€์ˆ˜(1.11.5)๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

httponly

HttpOnly ํŠน์„ฑ์„ ์ฟ ํ‚ค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(1.7.11).

samesite=strict | lax | none

SameSite ํŠน์„ฑ์„ ๋‹ค์Œ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง„ ์ฟ ํ‚ค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(1.19.4). Strict, Lax ๋˜๋Š” None.

secure

Secure ํŠน์„ฑ์„ ์ฟ ํ‚ค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(1.7.11).

path=path

์ฟ ํ‚ค๊ฐ€ ์„ค์ •๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ƒ๋žต๋˜๋ฉด ํ•ด๋‹นํ•˜๋Š” ์ฟ ํ‚ค ํ•„๋“œ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

route

๊ฒฝ๋กœ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋˜๋ฉด ํ”„๋ก์‹œ ์„ค์ •๋œ ์„œ๋ฒ„๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ ์ˆ˜์‹  ์‹œ ํด๋ผ์ด์–ธํŠธ์— ๊ฒฝ๋กœ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ํ›„์† ์š”์ฒญ์€ ์ฟ ํ‚ค ๋˜๋Š” URI์— ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •๋ณด๊ฐ€ ์„œ๋ฒ„ ๋ช…๋ น์˜ “route” ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋น„๊ต๋˜์–ด ์š”์ฒญ์ด ํ”„๋ก์‹œ ์„ค์ •๋˜์–ด์•ผ ํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. “route” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ๊ฒฝ๋กœ ์ด๋ฆ„์€ IP ์ฃผ์†Œ ๋ฐ ํฌํŠธ์˜ MD5 ํ•ด์‹œ์˜ 16์ง„์ˆ˜ ํ‘œํ˜„ ๋˜๋Š” UNIX-๋„๋ฉ”์ธ ์†Œ์ผ“ ๊ฒฝ๋กœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ์„œ๋ฒ„์—์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์š”์ฒญ์— ๋ผ์šฐํŒ… ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ตฌ์„ฑ๋œ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒˆ ์„œ๋ฒ„๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

๊ฒฝ๋กœ ๋ฐฉ๋ฒ•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” ์ผ์น˜ํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ:

map $cookie_jsessionid $route_cookie {
    ~.+\.(?P<route>\w+)$ $route;
}

map $request_uri $route_uri {
    ~jsessionid=.+\.(?P<route>\w+)$ $route;
}

upstream backend {
    server backend1.example.com route=a;
    server backend2.example.com route=b;

    sticky route $route_cookie $route_uri;
}

์—ฌ๊ธฐ์—์„œ ๊ฒฝ๋กœ๋Š” ์š”์ฒญ์— ์žˆ๋Š” ๊ฒฝ์šฐ “JSESSIONID” ์ฟ ํ‚ค์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด URI์˜ ๊ฒฝ๋กœ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

learn

upstream backend {
   server backend1.example.com:8080;
   server backend2.example.com:8081;

   sticky learn
          create=$upstream_cookie_examplecookie
          lookup=$cookie_examplecookie
          zone=client_sessions:1m;
}

์ด ์˜ˆ์—์„œ ์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„๋Š” ์‘๋‹ต์—์„œ ์ฟ ํ‚ค “EXAMPLECOOKIE”๋ฅผ ์„ค์ •ํ•˜์—ฌ ์„ธ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•˜๋Š” ์ถ”๊ฐ€ ์š”์ฒญ์€ ๋™์ผํ•œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„์ง ๋ฐ”์šด๋”ฉ๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ์ƒˆ ์„œ๋ฒ„๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ create ๋ฐ lookup์€ ๊ฐ๊ฐ ์ƒˆ ์„ธ์…˜์ด ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ธฐ์กด ์„ธ์…˜์ด ๊ฒ€์ƒ‰๋˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชจ๋‘ ํ•œ ๋ฒˆ ์ด์ƒ ์ง€์ •๋  ์ˆ˜ ์žˆ๊ณ  ์ด ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์„ธ์…˜์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅ๋˜๊ณ  ์ด ์˜์—ญ์˜ ์ด๋ฆ„ ๋ฐ ํฌ๊ธฐ๋Š” zone ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ์˜์—ญ์€ 64๋น„ํŠธ ํ”Œ๋žซํผ์˜ ์•ฝ 4,000๊ฐœ ์„ธ์…˜์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. timeout ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •๋œ ์‹œ๊ฐ„ ๋™์•ˆ ์•ก์„ธ์Šค๋˜์ง€ ์•Š์€ ์„ธ์…˜์€ ์˜์—ญ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹œ๊ฐ„์ œํ•œ์€ 10๋ถ„์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

header ๋งค๊ฐœ๋ณ€์ˆ˜(1.13.1)๋ฅผ ํ†ตํ•ด ์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์—์„œ ์‘๋‹ต ํ—ค๋”๋ฅผ ์ˆ˜์‹ ํ•œ ์งํ›„์— ์„ธ์…˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sync ๋งค๊ฐœ๋ณ€์ˆ˜(1.13.8)๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๋™๊ธฐํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์€ ์ƒ์—…์šฉ ๊ตฌ๋…์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์€ ๋ฒ„์ „ 1.5.7 ์ดํ›„ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ํ•ด๋‹นํ•˜๋Š” ๊ณ ์ • ๋ช…๋ น์ด ๋Œ€์‹  ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

sticky cookie name [expires=time] [domain=domain] [path=path];

์ž„๋ฒ ๋””๋“œ ๋ณ€์ˆ˜

ngx_http_upstream_module ๋ชจ๋“ˆ์€ ๋‹ค์Œ ํฌํ•จ๋œ ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

$upstream_addr

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์˜ IP ์ฃผ์†Œ ๋ฐ ํฌํŠธ ๋˜๋Š” UNIX-๋„๋ฉ”์ธ ์†Œ์ผ“์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘์— ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜๋ฉด ํ•ด๋‹น ์ฃผ์†Œ๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: e.g. “192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”. “X-Accel-Redirect” ๋˜๋Š” error_page์— ์˜ํ•ด ํ•œ ์„œ๋ฒ„ ๊ทธ๋ฃน์—์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„ ๊ทธ๋ฃน์œผ๋กœ ๋‚ด๋ถ€ ๋ฆฌ๋””๋ ‰์…˜์ด ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค๋ฅธ ๊ทธ๋ฃน์˜ ์„œ๋ฒ„ ์ฃผ์†Œ๋Š” ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: “192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”. ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†์œผ๋ฉด ๋ณ€์ˆ˜๊ฐ€ ์„œ๋ฒ„ ๊ทธ๋ฃน์˜ ์ด๋ฆ„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

$upstream_bytes_received

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์—์„œ ์ˆ˜์‹ ๋œ ๋ฐ”์ดํŠธ ์ˆ˜ (1.11.4). ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ์˜ ๊ฐ’์€ $upstream_addr ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์™€ ๊ฐ™์ด ์‰ผํ‘œ ๋ฐ ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

$upstream_bytes_sent

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์— ์ „์†ก๋œ ๋ฐ”์ดํŠธ ์ˆ˜(1.15.8). ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ์˜ ๊ฐ’์€ $upstream_addr ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์™€ ๊ฐ™์ด ์‰ผํ‘œ ๋ฐ ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

$upstream_cache_status

์‘๋‹ต ์บ์‹œ ์•ก์„ธ์Šค ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค(0.8.3). ์ƒํƒœ๋Š” “MISS”, “BYPASS”, “EXPIRED”, “STALE”, “UPDATING”, “REVALIDATED” ๋˜๋Š” “HIT”๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$upstream_connect_time

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ๋ณด๋‚ธ ์‹œ๊ฐ„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค(1.9.1). ์‹œ๊ฐ„์€ ๋ฐ€๋ฆฌ์ดˆ ํ•ด์ƒ๋„๋กœ ์ดˆ ๋‹จ์œ„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. SSL์˜ ๊ฒฝ์šฐ ํ•ธ๋“œ์…ฐ์ดํฌ์— ๋ณด๋‚ธ ์‹œ๊ฐ„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ์˜ ์‹œ๊ฐ„์€ $upstream_addr ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์™€ ๊ฐ™์ด ์‰ผํ‘œ ๋ฐ ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

$upstream_cookie_name

“Set-Cookie” ์‘๋‹ต ํ—ค๋” ํ•„๋“œ์—์„œ ์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ ์ง€์ •๋œ ์ด๋ฆ„์˜ ์ฟ ํ‚ค(1.7.1). ๋งˆ์ง€๋ง‰ ์„œ๋ฒ„์˜ ์‘๋‹ต์—์„œ ์˜จ ์ฟ ํ‚ค๋งŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

$upstream_header_time

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์—์„œ ์‘๋‹ต ํ—ค๋”๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ฐ ๋ณด๋‚ธ ์‹œ๊ฐ„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค(1.7.10). ์‹œ๊ฐ„์€ ๋ฐ€๋ฆฌ์ดˆ ํ•ด์ƒ๋„๋กœ ์ดˆ ๋‹จ์œ„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‘๋‹ต์˜ ์‹œ๊ฐ„์€ $upstream_addr ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์™€ ๊ฐ™์ด ์‰ผํ‘œ ๋ฐ ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

$upstream_http_name

์„œ๋ฒ„ ์‘๋‹ต ํ—ค๋” ํ•„๋“œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, “Server” ์‘๋‹ต ํ—ค๋” ํ•„๋“œ๋Š” $upstream_http_server ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ—ค๋” ํ•„๋“œ ์ด๋ฆ„์„ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™์€ “$http_” ์ ‘๋‘์‚ฌ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์„œ๋ฒ„์˜ ์‘๋‹ต์—์„œ ์˜จ ํ—ค๋” ํ•„๋“œ๋งŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

$upstream_queue_time

์—…์ŠคํŠธ๋ฆผ ๋Œ€๊ธฐ์—ด์—์„œ ์š”์ฒญ์ด ๋ณด๋‚ธ ์‹œ๊ฐ„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค(1.13.9). ์‹œ๊ฐ„์€ ๋ฐ€๋ฆฌ์ดˆ ํ•ด์ƒ๋„๋กœ ์ดˆ ๋‹จ์œ„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‘๋‹ต์˜ ์‹œ๊ฐ„์€ $upstream_addr ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์™€ ๊ฐ™์ด ์‰ผํ‘œ ๋ฐ ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

$upstream_response_length

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์—์„œ ์–ป์€ ์‘๋‹ต์˜ ๊ธธ์ด๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.(0.7.27). ๊ธธ์ด๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‘๋‹ต์˜ ๊ธธ์ด๋Š” $upstream_addr ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์™€ ๊ฐ™์ด ์‰ผํ‘œ ๋ฐ ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

$upstream_response_time

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜๋Š” ๋ฐ ๋ณด๋‚ธ ์‹œ๊ฐ„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์€ ๋ฐ€๋ฆฌ์ดˆ ํ•ด์ƒ๋„๋กœ ์ดˆ ๋‹จ์œ„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‘๋‹ต์˜ ์‹œ๊ฐ„์€ $upstream_addr ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์™€ ๊ฐ™์ด ์‰ผํ‘œ ๋ฐ ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

$upstream_status

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์—์„œ ์–ป์€ ์‘๋‹ต์˜ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‘๋‹ต์˜ ์ƒํƒœ ์ฝ”๋“œ๋Š” $upstream_addr ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์™€ ๊ฐ™์ด ์‰ผํ‘œ ๋ฐ ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†์œผ๋ฉด ๋ณ€์ˆ˜๊ฐ€ 502(์ž˜๋ชป๋œ ๊ฒŒ์ดํŠธ์›จ์ด) ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

$upstream_trailer_name

์—…์ŠคํŠธ๋ฆผ ์„œ๋ฒ„์—์„œ ์–ป์€ ์‘๋‹ต์ด ๋๋‚˜๋Š” ๋ถ€๋ถ„๋ถ€ํ„ฐ ํ•„๋“œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค(1.13.10).