nginx proxy를 이용해 많은 contents를 cache할려면, 아래와 같은 hierarchy구조를 고려하여야 한다.
my (edge cache server)의 disk 의 용량이 한계가 있기 때문에 아래와 같이 relay 계층을 추가하고, consistance hash구조로 만들면 relay-my에는 서로다른 contents를 수용할 수 있어 분산처리 및 많은 contents를 보유한 서비스에 대한 cache 효율을 높일 수 있다.
아래와 같이 edge서버에는 my.conf 에 proxy_pass http://relay-my를 추가하고, upstream블락에 consistant hash를 구성하면 3개의 서버로 트래픽 분산 및 서버추가 삭제가 용의하다.
이때 relay서버의 hash를 $host$uri로 설정하면 서로 다른 contents를 보유하게되고, 이렇게 하면 cache효율을 높일 수 있다.
$ cat my.conf
server {
listen 80;
server_name my;
location / {
proxy_cache my_zone;
proxy_cache_key $host$uri$is_args$args;
proxy_pass http://relay-my;
resolver 127.0.0.1 valid=5s;
add_header X-CACHE-STATUS $upstream_cache_status;
add_header X-CACHE-UPSTREAM $upstream_addr;
proxy_no_cache 1;
}
}
upstream relay-my {
hash $host$uri consistent;
server relay-my resolve;
}
relay-my에서 origin을 갈때는 hash 알고리즘을 사용하면 backup을 구성할 수 없으므로, 디폴트값인 round-robin으로 구성해야한다.
server {
listen 80;
server_name relay-my;
location / {
proxy_cache my_zone;
proxy_cache_key $host$uri$is_args$args;
proxy_pass http://org;
resolver 127.0.0.1 valid=5s;
add_header X-CACHE-STATUS $upstream_cache_status;
add_header X-CACHE-UPSTREAM $upstream_addr;
proxy_no_cache 1;
}
}
upstream org {
server org resolve;
server org-backup backup resolve;
}
위 설정은 test를 위해 모두 no-cache설정을 하였다.
relay응답은 모두 org (192.168.1.100)으로 응답하고, edge에서는 $uri별로 192.168.2.100, 192.168.2.101, 192.168.2.102로 분산처리됨을 확인 할 수 있다.
$ for i in {1..10}; do curl -Is my/$i.json | grep UPSTREAM ;done
X-CACHE-UPSTREAM: 192.168.1.100:80 > relay 응답
X-CACHE-UPSTREAM: 192.168.2.102:80 > edge 응답
X-CACHE-UPSTREAM: 192.168.1.100:80
X-CACHE-UPSTREAM: 192.168.2.100:80
X-CACHE-UPSTREAM: 192.168.1.100:80
X-CACHE-UPSTREAM: 192.168.2.100:80
X-CACHE-UPSTREAM: 192.168.1.100:80
X-CACHE-UPSTREAM: 192.168.2.101:80
X-CACHE-UPSTREAM: 192.168.1.100:80
X-CACHE-UPSTREAM: 192.168.2.100:80
X-CACHE-UPSTREAM: 192.168.1.100:80
X-CACHE-UPSTREAM: 192.168.2.100:80
X-CACHE-UPSTREAM: 192.168.1.100:80
X-CACHE-UPSTREAM: 192.168.2.101:80
X-CACHE-UPSTREAM: 192.168.1.100:80
X-CACHE-UPSTREAM: 192.168.2.100:80
X-CACHE-UPSTREAM: 192.168.1.100:80
X-CACHE-UPSTREAM: 192.168.2.100:80
X-CACHE-UPSTREAM: 192.168.1.100:80
X-CACHE-UPSTREAM: 192.168.2.102:80
이 때 org서버(192.168.1.100)을 장애상황으로 만들면, backup서버인 192.168.1.101로 upstream이 변경된 걸 확인할 수 있다.
$ for i in {1..10}; do curl -Is my/$i.json | grep UPSTREAM ;done
X-CACHE-UPSTREAM: 192.168.1.101:80
X-CACHE-UPSTREAM: 192.168.2.100:80
X-CACHE-UPSTREAM: 192.168.1.101:80
X-CACHE-UPSTREAM: 192.168.2.101:80
X-CACHE-UPSTREAM: 192.168.1.101:80
X-CACHE-UPSTREAM: 192.168.2.101:80
X-CACHE-UPSTREAM: 192.168.1.101:80
X-CACHE-UPSTREAM: 192.168.2.100:80
X-CACHE-UPSTREAM: 192.168.1.101:80
X-CACHE-UPSTREAM: 192.168.2.101:80
X-CACHE-UPSTREAM: 192.168.1.101:80
X-CACHE-UPSTREAM: 192.168.2.102:80
X-CACHE-UPSTREAM: 192.168.1.101:80
X-CACHE-UPSTREAM: 192.168.2.101:80
X-CACHE-UPSTREAM: 192.168.1.101:80
X-CACHE-UPSTREAM: 192.168.2.101:80
X-CACHE-UPSTREAM: 192.168.1.101:80
X-CACHE-UPSTREAM: 192.168.2.102:80
X-CACHE-UPSTREAM: 192.168.1.101:80
X-CACHE-UPSTREAM: 192.168.2.100:80
즉, relay upstream으로 구성 시에는 consistant hash로 구성하고, org upstream으로 구성 시에는 round-robin으로 구성하는 것이 좋고, 서버관리를 효율적으로 하기위해서는 모두 upstream dynamic server를 통해 dns로 구성하는 것이 바람직하다.
'nginx' 카테고리의 다른 글
nginx gzip, brotli (ngx_gzip, ngx_brotli) 설정 (0) | 2024.04.29 |
---|---|
How to purge the Nginx cache (0) | 2023.06.19 |
nginx upstream module - part 3 (dns lookup) (0) | 2023.06.19 |
nginx upstream module - part2 (0) | 2023.06.19 |
Consistant hash (0) | 2023.06.16 |