7월 19, 2021

Ghost 설치 on AWS

Ghost 설치 on AWS

지난 포스트에서 Route53에서 구매한 도메인과 Lightsail 을 연결하고 글을 끝냈습니다. 오늘은 그 뒤를 이어 Lightsail 에 Ghost를 설치하는 이야기입니다.

Lightsail에 생성된 인스턴스에서 터미널 접속 버튼을 눌러 들어갑니다. (또는 private key를 다운받으셔서 ssh 접속하세요.)

인스턴스에 우분투를 설치했으니, 먼저 패키지를 최신으로 업데이트 하기 위하여 아래 명령어를 실행해줍니다.

sudo apt update && sudo apt upgrade

apt update: 최신 패키지 서치 및 기록
apt upgrade: 기록된 패키지 다운로드 및 설치

중간에 '이 정도 용량이 필요하다. 설치하겠냐' 라고 질문이 들어오면 Y를 입력하여 설치를 진행해줍니다. 시간이 조금 걸리네요.

이제 드디어 목표로 했던 서비스들을 설치하나했으나 date 명령어를 입력해보니 현재 시간이랑 안맞네요. 설치를 진행하기에 앞서 서버 시간을 설정해주겠습니다.

date

를 입력했더니 저는 UTC 시간이 출력됩니다.

sudo dpkg-reconfigure tzdata

를 입력하면 옛날 감성 뿜뿜 솟는 설정 창이 표시되는데요, 화살표 방향키를 사용하여 Asia 선택 > 엔터

[그림1] Asia 선택

그 다음 Seoul 선택 > 엔터하세요.

[그림2] Seoul 선택

그럼 현재 타임존이 'Asia/Seoul' 이라고 알려주고 제대로 된 시간이 표시됩니다.


1. 고스트 관리 계정 생성

먼저 고스트 관리자 계정을 생성하고 앞으로는 이 계정으로 진행하겠습니다. 저는 'ghostmng' 라는 계정을 만들어 주었습니다. (혹시라도 'ghost' 라는 이름의 계정은 만드시면 안됩니다. 그 계정은 진짜 Ghost가 사용할 이름이예요. 저희 로컬에 한번 설치해봤으니 아시죠? 찡긋)

sudo adduser ghostmng

ghostmng 계정을 추가합니다. 설정할 패스워드를 입력하시고, 기본정보 입력(디폴트로 설정하시려면 모두 엔터) 후 Y를 입력하여 진행해주세요.

ghostmng 계정에 슈퍼권한(sudo) Group에 append 하도록 수정(usermod) 합니다.

sudo usermod -aG sudo ghostmng

새로 만든 ghostmng 계정으로 접속을 변경합니다.

sudo su ghostmng


2. MySQL 설치

아래 명령어로 mysql 을 설치합니다.

sudo apt install -y mysql-server

시스템이 재기동되면 mysql도 자동으로 시작하도록 등록해주시구요,

sudo systemctl enable mysql

mysql 명령어 입력모드로 전환합니다.

sudo mysql

mysql>

이렇게 mysql 입력 프롬프트가 뜨면, alter 명령어를 사용하여 mysql root 계정에 패스워드를 설정해줍니다. 우리는 서버 내부에서만 DB에 접속할 것이기 때문에 localhost 만 설정하겠습니다.

'내 패스워드' 부분에는 사용하실 패스워드를 입력하세요.

mysql> alter user 'root'@'localhost' identified with mysql_native_password by '내 패스워드';

quit 명령어로 mysql 에서 빠져나오세요.

mysql> quit


3. Node.js 설치

리파지토리에서 node.js 소스를 가지고 옵니다.

sudo curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -

설치를 진행합니다.

sudo apt install -y nodejs

버전을 확인하세요.

node -v

저는 v14.17.2 가 설치되었습니다. Ghost 에서는 Node 12버전도 지원하나, 14버전 사용을 권장합니다.

Supported node versions for self-hosted installs of Ghost
Self-hosted installs of Ghost are recommended to use the supported node versions to ensure you don’t run into any common errors. Find out more information.
고스트 Node.js 설치 문서


4. Nginx 설치

아래 명령어로 Nginx 를 설치해주세요.

sudo apt install nginx


5. Ghost-CLI 설치

Ghost 설치를 도와주는 명령어 툴을 설치합니다.

sudo npm install ghost-cli@latest -g


6. 디렉토리 생성 & Ghost 설치

고스트를 설치할 디렉토리를 만듭니다.

sudo mkdir -p /var/www/myblog

만든 디렉토리는 고스트 관리 계정인 ghostmng 에게 소유권을 지정하구요,

sudo chown ghostmng:ghostmng /var/www/myblog

디렉토리 권한을 775 로 변경합니다.

sudo chmod 775 /var/www/myblog

새로 만든 디렉토리로 이동하여,

cd /var/www/myblog

고스트를 설치합니다.

ghost install

고스트가 설치되면서 질문을 하면 대답해주세요.

? Enter your blog URL: (내 도메인 입력. 저는 https://myongi.net 을 입력했습니다)
? Enter your MySQL hostname: (엔터 누르면 디폴트로 localhost 가 설정됩니다)
? Enter your MySQL username: root
? Enter your MySQL password: (MySQL 설치할때 설정했던 패스워드 입력)
? Enter your Ghost database name: (엔터 누르면 고스트 폴더명_prod 이름으로 데이터베이스가 생성됩니다)
? Do you wish to set up “ghost” mysql user? Y
? Do you wish to set up Nginx? Y
? Do you wish to set up SSL? N (이건 따로 설정할 것이므로 N 입력)
? Do you wish to set up Systemd? Y
? Do you want to start Ghost? Y

[그림3] 고스트가 성공적으로 설치되었습니다.


7. SSL 인증서 설치

Let's Encrypt(https://letsencrypt.org/) 에서 제공하는 인증서를 얻기 위해서 certbot을 설치합니다. Let's Encrypt 에서는 인터넷 보안을 위하여 https 사용을 확인시키기 위해 인증서를 무료로 제공하고 있습니다.

아래 명령어로 certbot 과 Nginx 플러그인을 함께 설치합니다.

sudo apt install certbot python3-certbot-nginx

그 후 사용할 도메인에 대하여 SSL 인증서를 요청합니다. 내도메인 부분에 구입하신 도메인을 입력하세요.

sudo certbot --nginx -d 내도메인

그럼 아래와 같이 동의 여부를 묻는 질문이 나옵니다.

[그림4] 약관에 동의하십니까?

  • 첫번째 질문: 우리 사용 약관에 동의하십니까? > A 입력
  • 두번째 질문: 이메일로 정보를 공유하고 싶은데 수신 동의하십니까? > 저는 N 입력했습니다.
  • 세번째 질문: HTTP 요청이 들어오면 HTTPS로 리다이렉팅 하시겠습니까? > https 만 사용하길 원하므로 2를 입력합니다.

[그림5] https 리다이렉팅은 2번

저는 처음에 Lightsail 인스턴스와 도메인 연결을 안하고 설치를 진행해서 IP 못찾는다고 오류가 났습니다. ㅎㅎ 부랴부랴 도메인 연결 후 진행하느라 두번째 질문 캡쳐는 놓쳐버렸네요;;

Nginx 를 리로드 해줍니다.

sudo systemctl reload nginx

Let's Encrypt 인증서는 무료이지만 대신 유효기간이 90일로 길지가 않습니다. 따라서 예전에는 crontab 에 등록하여 주기적으로 업데이트를 해주어야 했습니다. 하지만 최근의 certbot package 는 시스템 타이머와 cron 작업을 자동으로 추가하므로 우리가 따로 추가 작업을 하지 않아도 됩니다. 대신 시스템 타이머가 제대로 설정되어 있는지 확인해보겠습니다.

sudo systemctl status certbot.timer
[그림6] 제대로 활성화되어 있습니다.

문제없이 제대로 renew 가 되는지 보기 위하여 --dry-run (테스트 실행) 옵션을 붙여 테스트해 봅니다.

sudo certbot renew --dry-run

에러없이 잘 실행되었습니다. 이제 certbot 이 자동으로 인증서를 갱신하고 Nginx를 리로드 할 것입니다.


브라우저에 myongi.net 이라고 입력하니 고스트 사이트가 잘 뜹니다. 아직은 날 것 그대로의 모습이지만요. 고스트 관리자 페이지도 잘 뜨는군요.

하지만 맘에 안드는 2가지가 눈에 들어옵니다.

  1. 브라우저에서 아이피 입력시 Nginx 화면이 뜹니다. 제 서버 OS가 Ubuntu인 것과 Nginx 어느 버전을 사용하는지 아주 친절하게 안내하고 있네요;; (저는 이미 포스트를 적으면서 다 오픈했지만요;)
  2. www 는 서브 도메인이지만, 많은 사람들이 도메인 앞에 www 붙이는 것을 자연스럽게 생각하고 있으므로 www.myongi.net 접속도 가능하게 하고 싶습니다.

위 2가지 문제를 해결하기 위해, 먼저 Lightsail 홈 > 네트워킹 탭 > 내도메인 DNS 영역에서 아까와 동일하게 A 레코드를 추가합니다. 하위 도메인 입력란에 www 를 입력하고, 확인 부분에 내 고정 아이피를 선택하여 추가해주세요.

[그림7] 서브 도메인 www 에 대한 A 레코드 추가

그리고 아까 사용했던 certbot 명령어로 www.myongi.net 도메인에도 SSL 인증서를 받아줍니다.

sudo certbot --nginx -d www.myongi.net

이제 nginx 설정 파일을 수정하러 갑니다. /etc/nginx/sites-available/ 디렉토리로 들어가세요. 저는 아래와 같이 2개 설정 파일이 존재하고 있었습니다.

default
myongi.net.conf

저는 기본 default 설정 파일은 필요가 없기 때문에 삭제.. 하고 싶었지만 만약을 위해 다른 곳에 백업해 두었습니다. 그냥 ghostmng 계정 디렉토리 아래에 옮겨 놓았습니다.

sudo mv default /home/ghostmng/

그리고 내도메인.conf (제 경우 myongi.net.conf) 파일을 열어서 원래 있던 myongi.net 에 대한 서버 설정을 복사했습니다.

[그림8] 내도메인에 대한 nginx 설정 부분

위 부분을 복사했지요. 그리고 바로 그 아래에 붙여넣기를 하고,

server_name
ssl_certificate
ssl_certificate_key

부분에 있는 myongi.net 을 서브 도메인인 www.myongi.net 으로 수정해주었습니다.

[그림9] 이렇게 말이죠.

그리고 www.myongi.net 으로 http 요청이 들어왔을 때 https 로 리다이렉션이 추가되어 있는지 확인하고, 아이피로 요청이 들어왔을 때 'https://내도메인' 요청을 돌려주도록 설정을 추가하였습니다.

[그림10] 설정 확인 및 추가하셔요.
sudo nginx -t

로 설정에 문제가 없나 확인 후, 마지막으로 /etc/nginx/sites-enabled/ 디렉토리에서 default 에 대한 심볼릭 링크도 삭제해 주었습니다.

sudo rm default

그리고 나서 nginx 를 restart 하여 변경된 설정을 적용해 주었습니다.

sudo service nginx restart


휴.. 이제 제가 원하는대로 되었습니다. 저는 브라우저에 캐시가 남아서 캐시 삭제 후 확인했더니 제대로 반영된 것을 볼 수 있었습니다.

어이쿠야! 이게 뭐라고 저는 오늘 하루를 허비했습니다.

다행히 오늘은 제 스토어에 손님이 없어서 하루종일 여기에 시간을 쓸 수 있었습니다. 어쩐지 아침부터 반짝반짝, 날이 참 좋더라구요. 허허 ㅠㅠ