Cloudflare CDN 구성해보기
Cloudflare에서 제공하는 무료 CDN을 설정하고 적용 확인하는 방법을 공유합니다.
CDN(Content Delivery Network)는 최근에 큰 화두 중 하나이다. 사진에서 영상으로 컨텐츠의 주권이 넘어가면서 상대적으로 고용량인 영상 데이터를 많은 사용자에게 제공해야하는 상황이다. 사진, 영상 등의 파일들은 흔히들 '정적(Static)' 파일로 분류한다.
정적 파일들은 한 번 올라오면 파일 내용이 변하지 않는다는 특성이 있어 운영하는데 있어 웹 서버 단에 Cache-Control Header를 달게 하는 등의 옵션을 통해 동일 파일을 여러 번 전달하여 불필요한 트래픽을 발생시키는 일을 막는다.
이런 최적화도 결국에는 한 번 요청이 들어오는 것이기 때문에 스트리밍 서비스 등을 하는 업체는 다른 방법을 찾아야한다. 여기에서 나오는 개념이 CDN이다.
CDN은 이 정적 파일들을 다른 서버에 캐싱해두고 사용자가 특정 정적 파일을 요구하면 제공해준다. 여기서 언급한 '다른 서버'는 한 곳이 아닌 여러 곳에 분산 시켜서 사용자 기준 빠른 서버에 접속하여 가져오도록 한다. 이를 통해서 딜레이를 감소시키는 효과도 발생하게 된다. Nginx의 경우 CDN이 연결을 대행해주기 때문에 TCP Connection의 절약의 효과도 보게 된다.
대중들이 사용하는 대규모 동영상 서비스의 경우, 응당 자체 CDN과 캐시 서버를 별도로 구축해야한다. 단순히 무료 CDN 서비스를 통해서는 데이터의 캐싱이 원활하지 못 할 것이다. 하지만, 이 글이 올라온 블로그와 같이 규모가 작은 사이트라면 무료 CDN 서비스를 사용해도 큰 문제가 없을 것이라 생각된다.
이번 글에서 무료 CDN으로 Cloudflare를 소개하고자 한다. 흔히들 많이 사용하고 있는 CDN 서비스 중 하나이다. Cloudflare는 최앞단에서 일부 요청을 CDN 쪽으로 돌려서 부하를 분산하고 있다. 그래서 그런지 도메인의 네임서버를 Cloudflare 쪽으로 이전해야한다는 전제조건이 있다.
이제 본격적으로 설정해보겠다. 사실 별거 없다.
전제 조건
- CDN을 사용하고자 하는 도메인의 네임서버는 Cloudflare를 사용하여야한다.
- CDN을 사용하고자 하는 서브 더메인의 DNS Record가 'Proxied'로 설정되어 있어야한다.
나는 여태 'Proxied'가 아닌 'DNS Only'로 설정되어 있어서 CDN 설정이 먹지 않았다. 멍청했다.
DNS Record 확인

도메인 설정 페이지에 진입한 이후, 왼쪽의 DNS -> Records 탭으로 진입하여 사용할 서브 디렉토리에 Proxy가 적용되었는지 확인한다. 사진처럼 'Proxied'라고 기재되어 있어야한다.
Caching 옵션 설정
그 다음 본격적으로 Caching 옵션을 설정해보겠다. 왼쪽의 Caching -> Configurations에 진입한다.

크게 2개의 설정을 건드리면 된다. 밑의 설정들은 본인에게 맞게 바꾸면 된다.
Purge Cache의 경우에는 Cloudflare가 저장하고 있는 캐시를 지우라는 뜻이라서 당장은 의미가 없다.
Caching Level의 경우 본인의 사이트 특성에 맞게 설정하면 된다.
- No query string: URL에 ?로 시작하는 param이 없는 정적 파일만 캐싱한다.
- Ignore query string: URL에 ?로 시작하는 param을 무시하고 캐싱한다. 만일, param 값에 따라서 다른 정보를 제공하는 경우에는 이 설정을 해선 안 된다.
- Standard: 대부분의 경우 권장하는 설정으로 URL에 ?로 시작하는 param 마다 각각 따로 캐싱을 한다. 본인의 사이트가 param와 상관 없이 같은 컨텐츠를 제공하는 경우에는 캐시 Hit 율이 낮아질 수 있다.
Browser Cache TTL의 경우, 대부분 'Respect Existing Headers'를 추천하나 아예 설정한 내용이 없는 경우에 Cloudflare 측에서 Override를 할 수 있다. 이 값은 브라우저에서 얼마 동안 캐싱해둘지에 대한 내용이다.
내 사이트의 경우에는 지속적으로 들어오기 보다는 검색을 통해서 단발성으로 들어오기 때문에 이 값이 길던 짧던 큰 의미가 없을 것으로 보인다.
Cache 규칙 설정
그 다음 본격적으로 Cache 규칙을 설정해보겠다.

규칙은 10개까지 생성할 수 있다. 규칙을 생성할려면 '+ Create rule'를 누른다.

기본적으로 탬플릿을 제공하는데 사실 규칙 자체는 간단한다.
먼저, 특정 패턴을 적용 시킬건지 모든 요청에 대해서 캐싱을 할건지를 정한다.
- 특정 패턴을 적용 시킬거라면, 'Custom filter expression'을 전체 요청을 캐싱할거라면 'All inconimg requests'를 선택한다.
다음, 특정 패턴만 적용시키는 경우 다양한 옵션을 제공하므로 옵션을 선택하여 본인에게 맞는 룰을 작성한다.

그 다음은 본인의 상황에 맞게 설정하면 된다.
그 다음, Enable 처리를 하면 작동이 시작된다. 하지만, 특성상 전파되는데 시간이 걸릴 수 있다. 나 같은 경우에는 DNS Only -> Proxied로 변경되면서 시간이 지체된 모양이다.
적용 확인 방법
실제로 적용되었는지 확인하는 방법은 의외로 간단한다. 브라우저의 개발자 콘솔을 확인하면 되는데, 개발자 도구의 Network 탭에서 요청을 하나 보내보고, 정적 파일에 대한 요청의 Response를 보면된다.

이때 Header에 Cf-로 시작되는 것들이 보이는데 이게 Cloudflare에서 추가한 Header이다. 'Cf-Cache-Status'를 참고하면 되는데, MISS로 되어 있으면 Cloudflare에 캐시가 없어서, 원본 서버에서 가져왔음을 뜻한다.

Cloudflare 서버에서 데이터를 가져왔다면, 방금 이야기한 Header의 값이 HIT로 표시됨을 확인할 수 있다.
무료 버전의 제약사항
다만 아래의 제약사항이 있으므로 참고하기 바란다.
- Cache 관련 대시보드 미제공. 이 부분은 Pro 이상의 요금제로 업그레이드 해야한다.
- Cache Reserve 미제공. 즉, Caching 된 컨텐츠를 갖고 있을지 말지를 자동으로 결정함.
Cache Reserve 라는 기능은 캐싱용으로 R2 Storage를 만들어 기존 Cloudflare에서 자체적으로 캐싱하는 경우에는 내부 정책에 의해 관리되지만, R2 Storage를 만들어서 관리를 하면 상대적으로 더 오래 보존된다는 장점이 있다고 한다. 다만, R2 Storage을 사용한 만큼 요금이 나오게 된다. (I/O 요금, 저장 요금 등) 즉, Pro 이상의 요금제에 들 필요는 없다.
이 글을 통해 Cloudflare CDN을 입문하고자 하는 분과 더불어 기존에 CDN을 설정했지만 실제로 적용이 되지 않는 경우에 트러블 슈팅에 도움이 되었으면 좋겠다.