우분투 서버
설치 분류

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

컨텐츠 정보

  • 24,554 조회
  • 36 댓글
  • 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

관련자료

댓글 36 / 4 페이지

efvewvrev님의 댓글

오라클 무료 클라우드는 1TB평생 무료이면 저장장치가 hdd아닌가요??우성짱 사이트를 이미지로딩이 잘 되는거 보면 속도가 전체 부족한게 아니네요.

침고로 취미로 여러 사이트 만들어 뒀는데. 이참에 DB서버를 분리해봤습니다. .  관리하기도 편한것 같고 좋네요.

우성짱님의 댓글의 댓글

아마도 HDD겠죠. 그런데 네트워크 속도제한이 있어서 그건 큰 상관없을거예요. 속도도 이미지 치고는 준수하다고 생각합니다. 제일 중요한건 평생 무료죠 ㅎㅎ

DB서버는 한번도 분리한적없는데 대단하십니다.

efvewvrev님의 댓글의 댓글

DB서버는 phpmyadmin 때문에 다 설치하고 mysql config파일에 되부 접속가능 IP를 0.0.0.0로 셋팅 했습니다. (web IP를 적으니 에러가 나더라구요)
그래서 DB 유져에 계정으로 web서버 IP로만 로그인 할수 있도록 했습니다.

web서버에 워드프레스, 그누보드 config파일에 localhost 를 DB서버 IP로만 바꿔주면 됐습니다. 초보인 저도 성공했습니다. ^^
인테넷에서는 DB서버 분리는 나중에 해도 된다고 하지만 저는 분리해두면 변할것 같고
서버별로 부하는 확인할수 있으니 업그레이시 좋은것 같습니다.
(참고로 저는 좀 오버 입니다. 접속량이 너무 없는 관계로...^^;;)

추가적을 수순 DB서버로 셋팅을 하고 phpmyadmin을 외부IP설정해서 접속하는 방법이 있는데 하다 포기 했네요..
그러고 보니 Portainer도  다른 서버를 컨트롤 하는 방법이 있는지 모르겠네요.

우성짱님의 댓글의 댓글

DB 서버는 큰 사이트의 경우 필수적으로 해주더라구요.

phpmyadmin은 그냥 nginx 리버스 프록시로 IP 제한할 수 있습니다.

포테이너가 외부도 작업 가능한지는 모르겠네요. 뭔가 원격으로 할 수 있는 기능은 있더라구요.

efvewvrev님의 댓글

오늘 사이트 한개 활성화가 너무 안되서 이미지 캐시서버 분리했고 삭제 예정이네요...
캐시서버 분리해도 이미지 잘나오고 너무 좋습니다.
캐시 서버가 필요한 그날을 위해 좋은 경험이였습니다. 서버 텨지는 그날도 왔으면 하네요..ㅎㅎ

우성짱님의 댓글의 댓글

아쉽네요 ㅠㅠ 캐시서버가 필요하면 좋을텐데요. ㅎㅎ

이 방법이 좋은건 서버 쪽 설정만 수정하면 바로 복원되는 것입니다.

그래서 저도 믿고 잘 쓰고 있어요!

꼭 필요해질 날이 올거라고 믿어요!
전체 34 / 1 페이지
RSS

최근글


새댓글


알림 0