통합검색

Linux

[nginx] reverse proxy 에서 프록시 캐시서버(CDN) 적용하기 (centos 7)



사진등 용량이 큰 리소스를 별도 서버에서 reverse proxy하여 웹사이트에 노출시키고 있다면
접속자에게 1M 용량의 이미지를 노출시킬 때 프록싱간 in/out bound 를 합쳐 트래픽을 총 3M를 소진하게 되는데,
접속자를 통해 한번 호출된 파일을 프록시 서버에 캐시파일로 저장해 두고 반환한다면 out-bound 트래픽 1M만 소진하게 되어
트래픽을 1/3 수준으로 절감할 수 있다.

이를 Cache server (CDN)이라고 하며,
nginx 에서는 간단한 설정으로 캐시서버 구축이 가능하다.

 
[!]캐시서버가 필요하게 된 배경[/!]
내가 운영중인 사진 블로그는 웹서버와 사진이 보관된 스토리지 서버가 분리되어 있으며, 글 마다 노출되는 사진 파일이 총 10M이상 된다.
접속자 한명이 블로그 글 하나를 조회하게 되면 프록시 서버와 스토리지서버(사진이 보관된)간 통신하는 과정에
총 30M 이상의 트래픽을 소진하게 되는데 100명의 접속자가 글을 조회 한다면 3G 이상의 트래픽을 유발 시킨다.
 
[접속자]  <-- out 10M 소진 -- [프록시서버] <-- in/out 20M --> [스토리지서버]
블로그 글에서 제공되는 사진은 10M지만, 총 30M 트래픽을 소진하게 됨.
 

따라서, 캐시서버를 구축하여 이미지 파일을 프록시서버에 보관하게 된다면
트래픽이 스토리지 서버까지 다녀올 필요가 없기 때문에 클라이언트에게 out-bound 되는 1G만 소진하면 된다.


[!]nginx.conf 설정[/!]
먼저, 캐시와 temp등의 경로 설정을 위해 nginx.conf 파일을 수정한다.
 
# /etc/nginx/nginx.conf
 
vi로 설정 파일을 열어 아래와 같이 설정한다.
 
...
http {
    ...
    proxy_cache_path /etc/nginx/cache/ levels=1:2 keys_zone=cache_zone:40m inactive=7d max_size=100m;
    proxy_temp_path /etc/nginx/cache_temp/;

    include /etc/nginx/conf.d/*.conf;
    ...
}
 
1) proxy_cache_path : 캐시 저장소 경로를 설정한다.
- levels : 하위 디렉토리의 깊이
- key_zone : 캐시존 이름
- inactive : 캐시 파일이 정해진 기간만큼 사용되지 않는다면 캐시에서 제거

2) proxy_temp_path : temp 파일이 저장될 경로를 설정한다.



[!]vietualhost 설정[/!]
특정 호스팅에 캐시를 적용하기 위해 conf 파일을 열어 세부 설정을 한다.
 
# vi /etc/nginx/conf.d/000.net.conf
(virtual host 설정을 위해 생성한 conf 파일을 연다.)
 
virtual host 의 conf 파일을 vi로 연 다음
아래와 같이 작성한다.
 
server {
    location / {
        ...
        # cache
        proxy_cache cache_zone;

        # cache data 7일 동안 보관
        expires 7d;

        # cache 업데이트 충돌시 잠금시간
        proxy_cache_lock_timeout 5s;

        # cache method 설정
        proxy_cache_methods GET HEAD POST;

        # cache 결과코드를 20분동안 보관
        proxy_cache_valid  200 401 301 304 20m;

        # cache 상태를 헤더로 보여줌. (MISS, HIT 등)
        add_header X-Proxy-Cache $upstream_cache_status;

        # cache-control 설정
        add_header Cache-Control "public";

        # 다음 클라이언트 헤더 무시
        proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
        ...
    }
}
 
설정이 완료 되었다면 nginx 를 재시작 한다.
 
# systemctl restart nginx
 

[!]브라우저에서 캐싱 여부 확인하기[/!]
설정을 모두 마쳤다면, 프록싱이 적용된 사이트를 접속하여 브라우저 작업관리자를 통해 캐싱 여부를 확인해본다.

1)  최초 요청으로 캐싱되지 않은 이미지가 노출된 경우 > X-Proxy-Caches : MISS 노출




2) 캐싱이 적용된 이미지인 경우 > X-Proxy-Caches : HIT 노출