내 블로그는 ghost 블로그인데, 기본적으로 제공되는 커맨드라인으로 설치하기 위한 권장 조건을 내가 사용하고 있는 서버 환경이 충족하지 못하였기 때문에 수동으로 설치하게 되었다.

혹시 같은 문제를 갖고 있는 사람들을 위해 그 방법을 소개해본다.

ghost 공식 사이트는 https://ghost.org/


#서버에 접속 한 다음 최신 파일 다운로드 하기

 
우선 터미널로 자신의 서버에 SSH로 접속을 한다. 적당한 경로에서 필요한 파일을 다운로드 한다.

curl -L https://ghost.org/zip/ghost-latest.zip -o ghost-latest.zip

다운로드가 끝나면 압축을 풀어준다. ghost 라는 폴더에 압축을 푸는 커맨드는 아래와 같다.

unzip ghost-latest.zip -d ghost

 

#필요한 패키지들 설치

 
압축을 푼 폴더로 이동한 후 필요한 패키지 파일들을 설치해준다. yarn 혹은 npm을 이용하여 설치가 가능한데, 난 서버에 nodeJS가 설치되어있었기 때문에 npm을 이용하였다.

npm install

이걸로 필요한 패키지들이 알아서 설치된다. 서버 설정에 따라서는 npm 앞에 sudo를 붙여줘야 할 수도 있다.

 

#기본 설정하기

 
우선 설정파일은 ghost의 루트 경로에 있어야한다. 이미 기본적으로 들어있는 파일이 있기 때문에 그걸 루트 디렉토리로 복사해주기만 하면 된다.

cp core/server/config/env/config.production.json config.production.json

그럼 이제 config.production.json의 내용을 vim이든 nano든 자기가 쓰기 편한 에디터로 수정해준다. 난 nano를 사용했다.

nano config.production.json

서버 설정에 따라서는 앞에 sudo를 붙여줘야만 내용을 수정할 수 있다. 파일을 열어서 아래 내용처럼 수정을 해주면 된다.

{
    "url": "<블로그에 연결 할 도메인 주소>",
    "server": {
        "port": 2368,
        "host": "127.0.0.1"
    },
    "database": {
        "client": "sqlite3",
        "connection": {
            "filename": "content/data/ghost.db"
        }
    },
    "auth": {
        "type": "password"
    },
    "paths": {
        "contentPath": "content/"
    },
    "logging": {
        "level": "info",
        "rotation": {
            "enabled": true
        },
        "transports": ["file", "stdout"]
    }
}

첫번째는 url. 자기의 도메인이 example.com 일 경우, 두가지 방법이 있다. "http://example.com" 혹은 "https://example.com". 여기서 SSL통신을 강제할 경우 https로 시작되는 도메인 주소를 적으면 되지만, 대신 그에 맞게 http 서버의 호스트 설정을 해줘야한다.

아파치 기준으로 버츄얼 호스트 설정은 다음과 같다.

<VirtualHost *:443>
    RequestHeader set X-Forwarded-Proto "https"
    ProxyPreserveHost On
    ServerName example.com

    SSLEngine On
    SSLCertificateFile <SSL 인증서 파일 경로>
    SSLCertificateKeyFile <SSL 인증서 키 경로>

    <Location/>
        SSLRequireSSL
    </Location>

    ProxyPass / http://127.0.0.1:2368/
    ProxyPassReverse / http://127.0.0.1:2368/
</VirtualHost>

중요한 부분은 RequestHeader set X-Forwarded-Proto "https" 부분이다. 여기를 설정해주지 않으면 무한 리디렉션 루핑이 발생하여 제대로 된 접속이 되지 않는다. 난 이걸 설정 안해서 도메인으로 접속해도 계속 https://127.0.0.1:2368 로 리디렉션 되서 애를 먹었다.

리디렉션 루핑이 일어나는 이유는 url에 http로 시작되는 주소를 적을 경우, 고스트에서 클라이언트에게 모든 통신 리퀘스트를 https로 다시 보내라고 강제하기 때문이다. Proxy를 사용하여 2368 포트에 돌아가는 앱을 443 포트에 뿌려줄 때, X-Forwarded-Proto가 설정되지 않았을 경우, 클라이언트가 http 통신으로 리퀘스트를 보내면 다음과 같은 일이 일어난다.

  1. 클라이언트가 http 요청을 프록시에 보낸다.
  2. 프록시는 서버에 http 요청을 보낸다
  3. 서버는 http 말고 https로 다시 보내라고 클라이언트에게 보낸다
  4. 클라이언트는 https 요청을 프록시에 보낸다.
  5. 프록시는 https로 온 클라이언트의 요청을 해독하여 ProxyPass에 지정된 2368 포트에 돌아가고 있는 서버 (고스트 서버)에 http로 요청을 보내게 된다. (http://127.0.0.1:2368) 서버 내부의 커뮤니케이션에는 SSL이 설정되지 않으니 http로 요청을 보낼 수 밖에 없다.
  6. 2368 포트에 돌고 있는 서버(고스트 서버)에선 https로 다시 보내라고 클라이언트에게 보낸다.
  7. 5번과 6번이 무한반복.

여기서 리퀘스트 헤더에 X-Forwarded-Proto "https"를 설정해주면 위의 5번째 스탭에서 다음과 같이 변한다.

  1. 프록시는 https로 온 클라이언트의 요청을 해독하여 ProxyPass에 지정된 2368 포트에 돌아가고 있는 서버에 http로 요청을 보내지만, 이 때 2368번 포트에서 돌아가고 있는 서버는 리퀘스트 헤더에 있는 X-Forwarded-Proto "https"라는 걸 보고 실제로 클라이언트가 보낸 요청은 https로 보낸거기 때문에 리스폰스를 돌려줘도 안전하다는 걸 알 수 있다.
  2. 2368번 서버에서 요청받은 데이터를 클라이언트에게 전송한다.

대충 이런 원리다.

두번째로 확인할 건 데이터베이스. 고스트가 지원하는 건 mysql 혹은 sqlite3. 서버에 mysql이 설치되어 있으면 그에 따른 설정을 하면 되고, mysql을 쓰기 귀찮거나 설치가 안되어있는 사람은 간단하게 sqlite3를 사용하면 된다. 위 설정은 sqlite3로 설정이 되어있다.

물론 sqlite3도 설치를 해야하지만 npm을 이용하여 설치만 하고 따로 설정 할 필요가 없기 때문에 mysql 보다 쓰긴 쉽다. 트레픽이 많은 사이트가 아니라면 sqlite3으로도 충분하지만 트레픽이 많은 사이트라면 mysql을 쓰는 것이 권장된다.

 

#Knex migrator 설치

 
ghost를 구동하기 위해서는 knex migrator 라는 패키지가 필요하다. 왜 필요하냐면 ghost에서 사용하는 데이터베이스 테이블 스키마를 생성하기 위함이다. npm으로 설치가 가능하다.

npm i -g knex-migrator

설치가 끝나면 ghost 루트 경로에서 아래 커맨드를 실행 해 준다.

NODE_ENV=production knex-migrator init

그러면 필요한 테이블들이 알아서 생성된다.

 

#ghost 구동

 
프로덕션 모드로 구동해줘야 한다. ghost 루트 경로에서 커맨드를 실행해야한다.

NODE_ENV=production node index.js

이걸로 모든 준비 끝. 이제 제대로 접속되는지 확인해주면 된다. 백그라운드에서 node 서버가 계속 돌아가게 할 경우, 난 forever 라는 패키지를 사용하는데, 그럴 경우는 다음 커맨드를 사용하면 된다.

NODE_ENV=production forever start index.js

이렇게 해주면 SSH 통신을 끝낸 후에도 계속 구동이 된다.


나는 기존에 사용하던 서버에 추가적으로 설치하기 위해서 수동으로 설치했지만, ghost 블로그를 사용하기 위해서 클라우드 서버를 따로 준비한다면, 본인이 이용하는 클라우드 서비스의 ghost 전용 서버 이미지 파일을 설치하면 더 간단하게 ghost를 설치할 수 있다.

ghost-cli를 이용해서 설치하는 법은 공식 사이트의 메뉴얼 (영문)을 참조하자.

https://docs.ghost.org/docs/install