웹사이트 검색

Debian 12에서 Nginx를 사용하여 Ghost Blog를 배포하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - UFW 방화벽 구성
  3. 2단계 - Nginx 설치
  4. 3단계 - Node.js 설치
  5. 4단계 - Docker를 사용하여 MySQL 설치
  6. 5단계 - 고스트 설치

    1. Ghost-CLI 설치
    2. 고스트 디렉터리 준비
    3. 고스트 설치
  7. 6단계 - SSL 설치
  8. 7단계 - Nginx 구성
  9. 9단계 - 사이트 실행
  10. 10단계 - 설정 완료
  11. 11단계 - 메일러 구성
  12. 12단계 - Ghost 업데이트
  13. 결론

Ghost는 전문적인 블로그를 만드는 데 도움이 되는 오픈 소스 블로그 플랫폼입니다. WordPress의 대안으로 2013년에 출시되었습니다. JavaScript로 작성되었으며 Node.js 라이브러리로 구동됩니다.

이 튜토리얼에서는 Debian 12 기반 서버에 Nginx 및 MySQL을 사용하여 Ghost CMS를 설치하는 방법을 살펴보겠습니다. Let's Encrypt SSL 인증서를 사용하여 설치를 보호합니다.

전제 조건

    최소 2GB RAM을 갖춘 Debian 12를 실행하는 서버.

    sudo 권한이 있는 루트가 아닌 사용자입니다.

    서버를 가리키는 example.com과 같은 FQDN(정규화된 도메인 이름).

    모든 것이 업데이트되었는지 확인하세요.

    $ sudo apt update 
    $ sudo apt upgrade
    

    시스템에 필요한 패키지가 거의 없습니다.

    $ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y
    

    이러한 패키지 중 일부는 이미 시스템에 설치되어 있을 수 있습니다.

1단계 - UFW 방화벽 구성

첫 번째 단계는 방화벽을 구성하는 것입니다. 데비안에는 기본적으로 ufw(복잡하지 않은 방화벽)가 함께 제공됩니다.

방화벽이 실행되고 있는지 확인하세요.

$ sudo ufw status

다음과 같은 결과가 출력되어야 합니다.

Status: inactive

방화벽을 활성화할 때 방화벽이 현재 연결을 끊지 않도록 SSH 포트를 허용합니다.

$ sudo ufw allow OpenSSH

HTTP 및 HTTPS 포트도 허용합니다.

$ sudo ufw allow http
$ sudo ufw allow https

방화벽 활성화

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

방화벽 상태를 다시 확인해 보세요.

$ sudo ufw status

비슷한 출력이 표시됩니다.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

2단계 - Nginx 설치

Debian 12는 이전 버전의 Nginx와 함께 제공됩니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 다운로드해야 합니다.

Nginx의 서명 키를 가져옵니다.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Nginx의 안정 버전용 저장소를 추가합니다.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

시스템 저장소를 업데이트합니다.

$ sudo apt update

Nginx를 설치합니다.

$ sudo apt install nginx

설치를 확인합니다. Debian에서 명령을 실행하려면 sudo가 필요합니다.

$ sudo nginx -v
nginx version: nginx/1.24.0

Nginx 서버를 시작합니다.

$ sudo systemctl start nginx

3단계 - Node.js 설치

Ghost Installer가 작동하려면 Nodejs가 필요합니다. 첫 번째 단계는 Nodesource GPG 키를 가져오는 것입니다.

$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg

다음으로 Nodesource 저장소 파일을 생성합니다. Ghost가 권장하는 현재 LTS(Long Term Support) 버전인 Node 18x를 설치하겠습니다.

$ NODE_MAJOR=18
$ echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

시스템 저장소 목록을 업데이트합니다.

$ sudo apt update

노드를 설치하세요.

$ sudo apt install nodejs -y

노드 설치를 확인하세요.

$ node --version
v18.18.2

4단계 - Docker를 사용하여 MySQL 설치

데비안은 더 이상 MySQL과 함께 제공되지 않습니다. 대신 MariaDB와 함께 제공됩니다. Ghost는 MySQL만 지원합니다. MariaDB와 작동하도록 Ghost를 조정할 수 있지만 권장되지는 않습니다. 이 튜토리얼을 작성하는 시점에는 MySQL의 공식 리포지토리가 Debian 12용으로 업데이트되지 않았으므로 Docker를 사용하여 설치하겠습니다.

Docker GPG 키를 가져옵니다.

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

Docker 저장소 파일을 만듭니다.

$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

시스템 저장소 목록을 업데이트합니다.

$ sudo apt update

Docker 및 Docker Compose를 설치합니다.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

기본적으로 Docker에는 루트 권한이 필요합니다. docker 명령을 실행할 때마다 sudo를 사용하지 않으려면 사용자 이름을 docker 그룹에 추가하세요.

$ sudo usermod -aG docker $(whoami)

이 변경 사항을 활성화하려면 서버에서 로그아웃했다가 동일한 사용자로 다시 로그인해야 합니다. 또는 다음 명령을 사용해야 합니다.

$ su - ${USER}

사용자가 Docker 그룹에 추가되었는지 확인합니다.

$ groups
navjot wheel docker

이제 Docker가 설치되었으므로 MySQL용 Docker 작성 파일을 생성해야 합니다. MySQL docker용 디렉터리를 만듭니다.

$ mkdir ~/mysql

편집할 docker-compose.yml 파일을 만들고 엽니다.

$ nano docker-compose.yml

그 안에 다음 코드를 붙여넣으세요.

services:
  database:
    image: container-registry.oracle.com/mysql/community-server:latest
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghostpassword
      MYSQL_DATABASE: ghostdb
    ports:
      - "3306:3306"
    volumes:
      - ./mysql:/var/lib/mysql

메시지가 표시되면 Ctrl + X를 누르고 Y를 입력하여 파일을 저장합니다.

여기서는 Ghost 데이터베이스에 대한 루트 비밀번호와 MySQL 자격 증명을 설정했습니다. 컨테이너가 실행될 때 생성됩니다.

MySQL 컨테이너를 시작합니다.

$ docker compose up -d

Docker 컨테이너의 상태를 확인하세요.

$ docker ps
CONTAINER ID   IMAGE                                                         COMMAND                  CREATED         STATUS         PORTS                                                        NAMES
ec42fb205f1e   container-registry.oracle.com/mysql/community-server:latest   "/entrypoint.sh mysq…"   4 seconds ago   Up 2 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060-33061/tcp   mysql

Ghost는 포트 3306을 사용하여 MySQL 컨테이너에 연결하고 해당 컨테이너에서 작업을 수행할 수 있습니다.

5단계 - 고스트 설치

작업을 단순화할 수 있는 Docker를 사용하여 Ghost를 설치할 수도 있지만 여기서는 수행하지 않습니다.

Ghost 설치는 세 가지 구성 요소, 즉 Ghost 블로그와 블로그 패키지 자체에 대한 업데이트를 설치하고 관리하는 Ghost-CLI 명령줄 도구로 구성됩니다.

Ghost-CLI 설치

Ghost-CLI 도구를 설치하려면 다음 명령을 실행하십시오.

$ sudo npm install ghost-cli@latest -g

고스트 디렉토리 준비

Ghost 루트 디렉토리를 생성하십시오.

$ sudo mkdir -p /var/www/html/ghost

디렉터리의 소유권을 현재 사용자로 설정합니다.

$ sudo chown $USER:$USER /var/www/html/ghost

올바른 디렉토리 권한을 설정하십시오.

$ sudo chmod 755 /var/www/html/ghost

Ghost 디렉토리로 전환하십시오.

$ cd /var/www/html/ghost

고스트 설치

Ghost 설치는 단일 명령 프로세스입니다.

$ ghost install

설치하는 동안 CLI 도구는 블로그를 구성하기 위해 몇 가지 질문을 합니다.

  • 블로그 URL: https 프로토콜과 함께 전체 블로그 URL을 입력하세요. (https://example.com)
  • MySQL 호스트 이름: Ghost 설치와 MySQL이 동일한 서버에 있으므로 localhost의 기본값을 사용하려면 Enter 키를 누르세요.
  • MySQL 사용자 이름: MySQL 사용자 이름으로 ghost를 입력합니다.
  • MySQL 비밀번호: 이전에 docker 파일에 생성한 루트 비밀번호를 입력합니다.
  • Ghost 데이터베이스 이름: docker 파일에 구성된 데이터베이스(ghostdb)의 이름을 입력합니다.
  • Sudo 비밀번호: 관리 작업을 수행하려면 sudo 비밀번호를 요청합니다.
  • Nginx를 설정하시겠습니까? 일반적으로 Ghost-CLI는 Nginx 설치를 감지하고 블로그에 맞게 자동으로 구성합니다. 그러나 이는 OS 패키지를 사용하여 설치된 Nginx에서만 작동합니다. Nginx 저장소를 사용하여 설치했기 때문에 Ghost는 이를 감지할 수 없으며 자동으로 건너뜁니다.
  • SSL을 설정하시겠습니까?: Nginx 구성을 건너뛰었으므로 CLI 도구도 SSL 설정도 건너뜁니다.
  • systemd를 설정하시겠습니까?: Ghost는 Ghost에 대한 시스템 서비스를 설정할 것인지 묻습니다. 계속하려면 Y를 누르세요.
  • Ghost를 시작하시겠습니까?: Ghost 설치를 시작하려면 Y를 누르세요. 그러나 Nginx와 SSL이 아직 구성되지 않았기 때문에 작동하지 않습니다.

6단계 - SSL 설치

계속하기 전에 Certbot 도구를 설치하고 도메인에 대한 SSL 인증서를 설치해야 합니다.

Certbot을 설치하기 위해 Snapd 패키지 설치 프로그램을 사용합니다. Snapd는 항상 최신 안정 버전의 Certbot을 보유하고 있습니다. 하지만 데비안에는 Snapd가 설치되어 있지 않습니다. 먼저 설치하세요.

$ sudo apt install snapd

snapd 버전이 최신인지 확인하세요.

$ sudo snap install core
$ sudo snap refresh core

Certbot을 설치하세요.

$ sudo snap install --classic certbot

다음 명령을 사용하여 /usr/bin 디렉터리에 대한 심볼릭 링크를 생성하여 Certbot 명령을 실행할 수 있는지 확인하세요.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

설치를 확인합니다.

$ certbot --version
certbot 2.7.1

SSL 인증서를 생성합니다.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d example.com

위 명령은 서버의 /etc/letsencrypt/live/example.com 디렉터리에 인증서를 다운로드합니다.

Diffie-Hellman 그룹 인증서를 생성합니다.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Certbot 갱신 스케줄러 서비스를 확인해보세요.

$ sudo systemctl list-timers

실행 예정인 서비스 중 하나로 snap.certbot.renew.service를 찾을 수 있습니다.

NEXT                        LEFT          LAST                        PASSED       UNIT                       ACTIVATES
Tue 2023-10-17 00:00:00 UTC 14h left    Mon 2023-10-16 00:00:18 UTC 9h ago       dpkg-db-backup.timer         dpkg-db-backup.service
Mon 2023-10-16 19:12:00 UTC 9h left     Mon 2023-10-16 07:27:11 UTC 2h 17min ago snap.certbot.renew.timer     snap.certbot.renew.service
Mon 2023-10-16 20:49:14 UTC 11h left    Mon 2023-10-16 07:48:12 UTC 1h 56min ago apt-daily.timer              apt-daily.service

SSL 갱신이 제대로 작동하는지 확인하려면 프로세스를 연습 실행해 보세요.

$ sudo certbot renew --dry-run

오류가 표시되지 않으면 모든 준비가 완료된 것입니다. 인증서는 자동으로 갱신됩니다.

7단계 - Nginx 구성

편집을 위해 /etc/nginx/conf.d/ghost.conf 파일을 생성하고 엽니다.

$ sudo nano /etc/nginx/conf.d/ghost.conf

ghost.conf 파일에 다음 코드를 붙여넣습니다. example.com의 모든 인스턴스를 귀하의 도메인으로 바꾸세요.

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  location / { 
  	return 301 https://$server_name$request_uri; 
  }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;
    
  access_log /var/log/nginx/ghost.access.log;
  error_log /var/log/nginx/ghost.error.log;
  client_max_body_size 20m;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
  ssl_prefer_server_ciphers off;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:10m;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
  resolver_timeout 2s;

  ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:2368;
  }
}

위 구성은 모든 HTTP 요청을 HTTPS로 리디렉션하고 Ghost 서비스의 프록시 역할을 하여 도메인을 통해 서비스를 제공합니다.

메시지가 표시되면 Ctrl + X를 누르고 Y를 입력하여 파일을 저장합니다.

편집을 위해 /etc/nginx/nginx.conf 파일을 엽니다.

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.

server_names_hash_bucket_size  64;

메시지가 표시되면 Ctrl + X를 누르고 Y를 입력하여 파일을 저장합니다.

Nginx 구성을 확인하세요.

$ sudo nginx -t

오류가 표시되지 않으면 문제가 없다는 뜻입니다. 구성을 적용하려면 Nginx 서버를 다시 시작하세요.

$ sudo systemctl restart nginx

9단계 - 사이트 실행

이제 웹 브라우저에서 https://example.com을 열어 설치를 확인할 수 있습니다. 성공적인 설치를 나타내는 다음 페이지가 나타납니다.

10단계 - 설정 완료

Ghost 블로그 설정을 완료하려면 브라우저에서 https://example.com/ghost를 방문하세요. 블로그 도메인 끝에 있는 추가 /ghost는 Ghost의 관리자 패널로 리디렉션되거나 이 경우 처음으로 액세스하기 때문에 설정으로 리디렉션됩니다.

여기에서는 관리자 계정을 만들고 블로그 제목을 선택해야 합니다.

세부정보를 입력하고 계정 만들기 및 게시 시작 버튼을 클릭하여 계속 진행하세요.

다음으로, 첫 번째 게시물 작성, 사이트 사용자 정의, 회원 가져오기 등의 옵션이 제공되는 다음 화면으로 이동하게 됩니다.

대시보드를 직접 탐색하고 이동하려면 Ghost 관리자 탐색을 선택하겠습니다. 설정이 끝나면 Ghost의 관리 패널이 나타납니다.

어두운 모드로 전환하려면 설정 페이지 하단의 설정 기어 버튼 옆에 있는 토글 스위치를 클릭하면 됩니다.

기본 게시물이 표시됩니다. 게시를 취소하거나 삭제하고 게시를 시작할 수 있습니다.

11단계 - 메일러 구성

Ghost는 블로그 플랫폼 역할뿐만 아니라 뉴스레터 관리자 역할도 합니다. 일상적인 작업의 경우 모든 트랜잭션 메일 서비스를 사용하여 Ghost와 함께 메일을 보낼 수 있습니다. 그러나 Ghost를 통해 뉴스레터를 보내려는 경우 지원되는 유일한 공식 대량 메일러는 Mailgun입니다. 다른 뉴스레터 서비스를 사용할 수도 있지만 이를 위해서는 Ghost의 Zapier 통합 기능을 사용해야 합니다.

먼저 거래 이메일에 대한 SMTP 서비스를 구성해 보겠습니다. 이를 위해 편집을 위해 /var/www/html/ghost/config.production.json 파일을 엽니다.

$ nano /var/www/html/ghost/config.production.json

다음 줄을 찾으십시오.

 "mail": {
    "transport": "Direct"
  },

다음 코드로 바꾸세요.

"mail": {
    "from": "'HowtoForge Support' [email ",
    "transport": "SMTP",
    "options": {
        "host": "YOUR-SES-SERVER-NAME",
        "port": 465,
        "service": "SES",
        "auth": {
            "user": "YOUR-SES-SMTP-ACCESS-KEY-ID",
            "pass": "YOUR-SES-SMTP-SECRET-ACCESS-KEY"
        }
    }
},

여기서는 저렴하고 월별 요금이 필요하지 않은 Amazon SES Mail 서비스를 사용하고 있습니다.

메시지가 표시되면 Ctrl + X를 누르고 Y를 입력하여 파일을 저장합니다. 완료되면 변경 사항을 적용하려면 Ghost 응용 프로그램을 다시 시작하십시오.

$ ghost restart

뉴스레터 설정을 구성하려면 설정 >> 이메일 뉴스레터 섹션을 방문하세요.

확장하려면 Mailgun 구성 링크를 클릭하세요.

Mailgun 지역, 도메인 및 API 키를 입력하세요.

설정을 저장하려면 오른쪽 상단의 저장 버튼을 클릭하세요.

뉴스레터 전달을 테스트하려면 새 테스트 게시물을 작성하고 게시를 누른 다음 이메일만 옵션을 선택하세요. 게시물도 게시하려면 게시 및 이메일 옵션을 선택하세요.

계속하려면 계속, 최종 검토 버튼을 클릭하세요. 다음 페이지에서는 최종 확인을 위해 다시 묻습니다.

뉴스레터를 보내려면 지금 바로 이메일 보내기 버튼을 클릭하세요. 메일이 전송되면 다음과 같은 메시지를 받게 됩니다.

해당 게시물의 이메일을 확인하세요.

12단계 - Ghost 업데이트

Ghost 업데이트에는 사소한 업데이트와 주요 업데이트의 두 가지 유형이 있습니다.

먼저, 마이너 업데이트를 실행하려면 전체 백업을 수행하세요. 모든 게시물, 회원, 테마, 이미지, 파일 및 리디렉션 파일의 백업을 생성합니다.

$ cd /var/www/html/ghost
$ ghost backup

업데이트 명령을 실행하여 부분 업데이트를 수행합니다.

$ ghost update

주요 업데이트를 수행하려면 Ghost의 공식 세부 업데이트 가이드를 따라야 합니다. 현재 사용 중인 버전과 업데이트하려는 주요 버전에 따라 단계가 달라집니다.

결론

이것으로 Nginx를 사용하여 Debian 12 서버에 Ghost CMS를 설정하는 방법에 대한 튜토리얼을 마칩니다. 질문이나 의견이 있으면 아래 댓글로 공유해 주세요.

관련기사: