[Nginx] 엔진엑스로 CDN(Content Delivery Network)서버 구축 하기

이전시간에는 엔진엑스로 다운로드 서버를 구축해 보았습니다. 파일 다운로드 서버를 구축하고 싶은 분들은
[Nginx] 파일 및 사진 다운로드 서버 만들기 및 다운로드 속도 제한 방법 글을 참고하시기 바랍니다.

CDN서버란?

이 글을 시작하기 전에 CDN 이란 무엇인지 가볍게 알아보겠습니다.
CDN 서버란? Content Delivery Network 의 약자로 사용자에게 웹 콘텐츠를 효율적으로 제공할 수 있는 서버의 분산 네트워크입니다

CDN서버를 사용하는 이유

그럼 CDN 서버를 사용하는 이유는 뭘까요?
예를 들어 미국에 있는 방문자가 제 블로그를 방문한다고 가정해 보겠습니다. 저의 블로그에 요청을 전송하면 미국에 있는 방문자가 이 블로그를 보는데 매우 많은 딜레이가 발생하며 이는 웹 페이지를 이용하는 사용자에게 매우 악영향을 미칩니다. (사용자 이탈, 사용자 피로도 증가) 등을 이유로 사이트 평가가 낮아질 수 있습니다. 이를 해결하기 위해서 CDN 서버를 사용하는 것입니다.
더 자세한 내용은 https://en.wikipedia.org/wiki/Content_delivery_network이 글을 참고하세요.

CDN 서버 예시 (사진출처: 위키백과)

이제부터 엔진엑스로 CDN 서버를 구축해 보겠습니다. 우선 엔진엑스 서버가 구축되 있어야 되겠죠? 엔진엑스가 설치되지 않았으면 자신의 OS에 맞게 엔진엑스를 먼저 설치하시고 이 강좌를 따라해 주세요.

CDN 서버는 https 프로토콜을 사용하는 것이 좋습니다. 사이트가 https 방식일 때 http CDN 서버를 사용하면 “콘텐츠가 안전하지 않음”이 표시될 수 있기 때문입니다. Let’s Encrypt 인증서 발급은 엔진엑스 [Nginx] Let’s Encrypt 인증서 무료로 발급받고 적용하기 글을 참고해 주세요.

저는 CDN용 서브 도메인을 하나 생성했습니다. 여러분은 자신의 도메인에 맞게 수정하시면 됩니다. CDN 서버용 .conf 파일을 생성해 주겠습니다. conf 파일 위치는 Ubuntu 기준 /etc/nginx/sitees-avablie/ 내부에 생성하는 것이 좋습니다. 엔진엑스 가상도메인 설정을 모르신다면, 엔진엑스 [Nginx] 루트 폴더 설정하기 및 가상도메인 설정 글을 참고해 주세요.

#####################################################################
# ================= REDREDGROUP Content Delivery Network location
#####################################################################
server {  //http 연결시 https로 디라이렉션 코드
        server_name cdn.yourname.com; //cdn도메인 이름
        listen 80; // 80번 포트로 들어오는 연결을
 
        if ($host = cdn.yourname.com){ //만약 들어오는 가상 호스트 이름이 cdn.yourname.comd이라면
            return 301 https://$host$request_uri;      https://요청url로 디라이랙션 
           }
        return 404;
}


server {
        listen 443 ssl http2;
        server_name cdn.yourname.com;
        server_tokens off;
        ssl_certificate "/etc/letsencrypt/live/cdn.yourname.com/fullchain.pem"; //Let's Encrypt 인증서 경로
        ssl_certificate_key "/etc/letsencrypt/live/cdn.yourname.com/privkey.pem"; //Let's Encrypt 인증서 경로

        root /var/www/cdn_content/; //파일 경로

    location ~* \.(?:manifest|appcache|html?|xml|json)$ {
        expires -1;
    }

// 이미지 관련 확장자로  캐쉬 만료 기간은 1달로 잡았습니다.
    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
        expires 1M;
        access_log off;
        add_header Cache-Control "public";
    }


// css 및 js 확장자  캐쉬 만료 기간은 1년으로 설정 하였습니다. 
    location ~* \.(?:css|js)$ {
        expires 1y;
        add_header 'Access-Control-Allow-Origin' '*';
        access_log off;
        add_header Cache-Control "public";
    }


//폰트 경로 몇 확장자 (해더에  Access-Control-Allow-Origin 를 넣어줘야 외부 웹페이지에서 읽을 수 있습니다.)
    location ~* \.(eot|otf|ttf|woff|woff2)$ { 
        add_header Access-Control-Allow-Origin *;
    }

        location / { //cdn.yourname.com index 경로로 들어왔을때 보여질 페이지
        alias   /var/www/cdn_content/; //페이지 경로
            autoindex   off; // 폴더 구조를 볼 수 있는 구문 off 시 정확한 경로를 입력해야만 접속 가능
            index  index.html; // index경로로 들어왔을 때 보여줄 페이지 이름
            access_log      /var/log/nginx/cdn_content/cdn_access.log; //엑세스 로그 위치
            error_log       /var/log/nginx/cdn_content/cdn_error.log; //에러 로그 위치
            charset utf-8; //문자셋 UTF8 설정
        }
}

이렇게 conf 파일을 하나 생성하신 후 Ubuntu Server 20.04 LTS 기준 sudo ln -s /etc/nginx/sites-avablie/cdn_server.conf /etc/nginx/sites-enabled/
이렇게 입력 후 엔터를 눌러 sites-enabled 디랙토리에 cdn_server.conf 바로가기를 생성해 주었습니다.

저는 cdn 서버에 자바스크립트 파일, css파일, 폰트 파일 등을 미리 넣어두었습니다.

이렇게 잘 불러와진 모습입니다. 이제 이 주소를 html head 태그 내부에 붙여넣어주면 끝입니다

그리고 부트스트랩같은 파일을 불러올 땐 미리 해쉬값을 생성해 놓아 해쉬값을 같이 붙어넣어주는게 좋습니다. 파일이 위변조 되어 악성코드가 추가되는걸 막기 위해서 입니다. 제가 사용하는 사이트를 추천드립니다. url만 입력하면 바로 해쉬값과 태그가 함께 나와서 그냥 붙어넣어주시면 됩니다.

https://www.srihash.org/

이렇게 해서 CDN 서버를 구축해 보았습니다. 저는 CDN 서버를 구축하여 다른 프로젝트에서도 사용할 예정이라 따로 지우지 않고 사용할 예정입니다.

댓글에 피드백 , 궁금하신점은 언재나 환영입니다. 감사합니다.

0 0 votes
Article Rating
Subscribe
Notify of
guest

2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
러브박스
러브박스
1 year ago

안녕하세요. 웹폰트 사용을 위한 cdn 서버 구축을 해보고자 합니다. 해당 페이지를 보고 따라한다면 웹폰트를 서버에 올려두고 웹페이지에서 jquery 불러오듯이 웹폰트를 불러들여와 사용할 수 있게 되는 것 맞나요? 맞다면 긴 여정이 될듯하지만 os부터 다시 깔아보려 합니다.