우분투 서버
설치 분류

그누보드 이미지 및 동영상 캐시 서버 구축 방법

컨텐츠 정보

  • 44,464 조회
  • 47 댓글
  • 0 추천
  • 목록

본문

3232235777_6cAnykfz_71dc5c356a51e01b2087e3fd947c0b05b38c0889.png




그누보드의 /data 폴더에 있는 이미지 및 동영상을 캐시 서버에서 트래픽을 나눌 수 있는 방법입니다.


이미지나 동영상이 많아서 트래픽이 많이 나온다면, 본 서버에서는 CPU 및 DB가 좋은 서버(국내)를 쓰고,


이미지 캐시 서버는 용량 및 트래픽이 높은 서버(해외 또는 국내 저렴한 서버)를 선택하면 비용 절약 및 속도에 도움이 될 것입니다.


현재 제 홈페이지의 이미지도 모두 cdn.wsgvet.com 에서 불러오고 있습니다.



준비사항



1. 본서버(실제 파일이 있는 서버, Origin Server)가 Nginx 또는 Apache로 구성되어 있을 것


https://www.wsgvet.com/ubuntu/126


위 링크처럼 편하게 그누보드를 Nginx에 올릴 수 있습니다.


Apache는 substitute 모듈을 활성화하면 됩니다.


밑에 설정 방법을 알려드리겠습니다.



2. 이미지 캐시서버 도메인의 IP를 캐시서버로 가리킬 것


클라우드플레어 같은 DNS셋팅에서 이미지캐시 서버의 도메인과 IP를 연결시켜야 합니다.


cdn.example.com 같은 서브도메인도 되고,  example2.com 처럼 완전히 다른 도메인이어도 상관없습니다.



3. 이미지 캐시서버는 Ubuntu 20.04 LTS 또는 CentOS 8 로 설정하기


다른 운영체제는 구현하지 않았습니다.



4. 80, 443 포트 방화벽을 열 것


Nginx가 80, 443 포트만 사용하므로 열어야 합니다.


80포트는 SSL 인증서 갱신에 반드시 필요합니다.


다른 포트는 닫아도 됩니다.



5. 이미지 캐시서버의 사용자(User)가 sudo 권한을 가질 것


아마 거의 가지고 있을 것입니다.



설치경로


/home/docker-cdn-webserver


위 경로에 설치됩니다.



스케쥴러


crontab에 3가지가 있습니다.


1. SSL 인증서 갱신 매일 검증 : 인증서 유효기간이 1달 남으면 자동으로 재발급 받고 Nginx를 재기동합니다.


2. Docker 이미지 최신화 : Certbot, Nginx, PHP의 Docker 최신버전이 나오면 자동으로 다운 받고 재기동합니다.


3. 캐시버서가 받은 이미지 및 동영상 파일 삭제 : #으로 비활성화 해뒀습니다. 일정기간이 지난 후 삭제하고 싶다면 #을 제거하고, 옵션을 수정할 수 있습니다. 상세설정 방법은 제일 밑에 참고사항의 Lael님 블로그에 있습니다.



설치방법


1. Ubuntu 20.04 LTS



sudo apt update -y && sudo apt upgrade -y && sudo apt install curl git cron -y && sudo apt autoremove -y


위 명령어로 패키지를 최신화하고, curl, git, cron 필수패키지를 설치합니다.


 


curl -o dc https://raw.githubusercontent.com/woosungchoi/docker-cdn-webserver/master/dc && bash dc setup && rm -f dc


위 명령어로 설치 스크립트를 다운받고 실행합니다.



2. CentOS 8



sudo yum -y update && sudo yum install -y curl git crontabs


위 명령어로 패키지를 최신화하고, curl, git, cron 필수패키지를 설치합니다.



curl -o dcc https://raw.githubusercontent.com/woosungchoi/docker-cdn-webserver/master/dcc && bash dcc setup && rm -f dcc


위 명령어로 설치 스크립트를 다운받고 실행합니다.


---


공통 설치진행방법


1. Enter your Origin domain :


위 내용은 본서버(실제 파일이 있는 서버, Origin Server)의 도메인을 물어보는 것입니다.


서브도메인은 빼고 넣어주세요. (예 : mydomain.com)



2. Enter your CDN domain : 


캐시서버의 도메인을 넣어주세요. (예 : cdn.mydomain.com)



3. Enter your Email address for SSL certificate :


Certbot의 인증서 등록을 위한 Email을 넣어주세요.



3가지를 입력했다면 자동으로 설치됩니다. 대략 5분이면 설치된 패키지가 나오면서 끝날 것입니다.


이미지 캐시서버는 끝났습니다. 참 쉽죠? 



---


본서버 설정방법


본서버(실제 파일이 있는 서버, Origin Server) 설정만 수정하면 됩니다.


(1) Nginx 웹서버 설정방법


https://www.wsgvet.com/ubuntu/126


위와 같은 방법으로 Nginx에 그누보드를 올린 것을 예시로 들어보겠습니다.


./gnuboard/nginx/conf.d/gnuboard.conf


위 파일을 열어보면



server {
        listen 80;
        listen [::]:80;


        server_name www.mydomain.com mydomain.com;


        # Useful for Let's Encrypt
        location /.well-known/acme-challenge/ { root /usr/share/nginx/html; allow all; }


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name www.mydomain.com mydomain.com;


        # www로 들어왔을 때 www를 제거해주는 역할입니다.
        if ($host != 'mydomain.com' ) {
                rewrite ^/(.*)$  https://mydomain.com/$1;
        }


        root /var/www/web/gnuboard;


        include /etc/nginx/conf.d/basic;
        include /etc/nginx/conf.d/gnuboard-rewrite;
}


대략 위와 같이 나와있을 것입니다.



sub_filter_once off;
    sub_filter 'https://mydomain.com/data/file/' 'https://cdn.mydomain.com/data/file/';
    sub_filter 'https://mydomain.com/data/editor/' 'https://cdn.mydomain.com/data/editor/';


위 내용을 넣으면 됩니다.


mydomain.com은 본서버의 도메인이고, cdn.mydomain.com은 이미지 캐시서버의 도메인입니다.




server {
        listen 80;
        listen [::]:80;


        server_name www.mydomain.com mydomain.com;


        # Useful for Let's Encrypt
        location /.well-known/acme-challenge/ { root /usr/share/nginx/html; allow all; }


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name www.mydomain.com mydomain.com;


        # www로 들어왔을 때 www를 제거해주는 역할입니다.
        if ($host != 'mydomain.com' ) {
                rewrite ^/(.*)$  https://mydomain.com/$1;
        }


        root /var/www/web/gnuboard;


        sub_filter_once off;
            sub_filter 'https://mydomain.com/data/file/' 'https://cdn.mydomain.com/data/file/';
            sub_filter 'https://mydomain.com/data/editor/' 'https://cdn.mydomain.com/data/editor/';


        include /etc/nginx/conf.d/basic;
        include /etc/nginx/conf.d/gnuboard-rewrite;
}


대략 위와 같이 될 것입니다.



sudo docker exec nginx nginx -s reload


위 명령어를 내려주면 본서버의 Nginx가 재시작됩니다.


---



sudo systemctl nginx reload


Nginx를 서버에 직접 설치했다면  위와 같이 nginx를 재기동 해주면 됩니다.


이제 끝났습니다. 본서버의 썸네일, 이미지, 동영상 파일이 모두 CDN 도메인으로 대치되었을 것입니다.



(2) Apache 웹서버 설정방법



sudo a2enmod substitute


위 명령어로 substitute 모듈을 활성화한 후



sudo systemctl restart apache2


위 명령어로 아파치 웹서버를 재시작해줍니다.


/etc/apache2/sites-enabled/


위 폴더에 있는 자신의 아파치 설정파일에서



<Location "/">
	AddOutputFilterByType SUBSTITUTE text/html
	Substitute "s|https://mydomain.com/data/file/|https://cdn.mydomain.com/data/file/|i"
	Substitute "s|https://mydomain.com/data/editor/|https://cdn.mydomain.com/data/editor/|i"
</Location>


위 내용을 적당히 넣어주면 됩니다.


mydomain.com은 본서버의 도메인이고, cdn.mydomain.com은 이미지 캐시서버의 도메인입니다.



sudo systemctl reload apache2


그리고 위 명령어로 아파치를 재기동하면 됩니다.


이제 끝났습니다. 본서버의 썸네일, 이미지, 동영상 파일이 모두 CDN 도메인으로 대치되었을 것입니다.


감사합니다.



참고사항


이미지 캐시 서버 구축하기 (나만의 CloudFlare 구축하기)


깃허브 소스 : https://github.com/woosungchoi/docker-cdn-webserver


깃허브 소스 : https://github.com/woosungchoi/my-image-cdn


아파치 substitute 모듈 설명 : https://httpd.apache.org/docs/2.4/mod/mod_substitute.html

관련자료

댓글 47 / 5 페이지

상동닭집님의 댓글

안녕하세요. 최근 계속 적용하면서 시행착오를 겪고 있습니다.
몇가지 여쭤볼게 있어서요ㅎㅎ
집 컴터랑 회사 컴터로 구축해서 테스트 중인데 다 적용한 후에 이미지 서버에 이미지를 안올려도 url만 적어도 알아서 이미지가 업로드되서 불러들여지는건가요? 아니면 따로 이미지를 이동 시켜놓은 후 url로 불러들이는 건가요?
그리고 어떻게 이미지서버가 잘 적용됐는지 알까요?

자료들 설명 너무 잘 해주셔서 초보지만 시도해볼 수 있었습니다. 너무너무 감사드려요! :)

우성짱님의 댓글의 댓글

라엘님 블로그에 자세히 설명되어 있습니다. 간단하게 설명드리면 본서버의 이미지 경로가 캐시서버로 변경되는데요. 캐시서버에 요청이 들어오면 본서버의 이미지가 캐시서버에 저장됩니다. 그 후에 웹페이지에 이미지나 동영상이 출력이 됩니다. 만약에 미리 저장되어 있다면 캐시서버에서 바로 이미지나 동영상이 불러와집니다.

테스트는 그냥 홈페이지 이미지 경로가 잘 나오는지 확인해보면 됩니다.

상동닭집님의 댓글의 댓글

답변 정말 감사합니다. :)
혹시 그러면 말씀하신 이미지 경로라는게..임의적으로 지정을 해줘야 하는건가요?
아니면 G5_IMG_URL 이런 느낌으로 저장이 되어있는건가요?
계속 테스트 중인데 공유기랑 맞물려있어서 안되는거같아 (실력미흡) 앞서 댓글에 나온 오라클 클라우드로 다시 재구축해서 테스트 해보려고 합니다.
새해 복 많이 받으세요! ;)

우성짱님의 댓글의 댓글

본문에 있는 서버 설정 이외에 따로 건드릴 것은 없습니다. 물론 그누보드가 아니라면 임의로 이미지경로를 바꿔줘야겠지만요.

상동닭집님의 댓글의 댓글

다른 일이 생겨 그동안 못 봤었네요ㅠ
얼추 가닥이 잡히는 것 같습니다. 또 한번 시도해봐야겠어요.
정말 감사드리구 설 잘 보내시길 바랍니다. :)
전체 34 / 1 페이지
RSS

최근글


새댓글


알림 0