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.
์ด๋ฆ ๋ณํ์ ๋ํ ์๊ฐ์ ํ์ ์ค์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
resolver_timeout 5s;
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)๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋๊ธฐํ๋ฅผ ํ์ฑํํฉ๋๋ค.
์ด ๋ช ๋ น์ ์์ ์ฉ ๊ตฌ๋ ์ ์ผ๋ถ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
Syntax: sticky_cookie_insert name [expires=time] [domain=domain] [path=path];
Default: โ
Context: upstream
์ด ๋ช ๋ น์ ๋ฒ์ 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).