nginx

nginx proxy hierarchy

꺼비72 2023. 6. 19. 18:11
반응형

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