Ghost CMS · 8 min read · Oct 14, 2025
Rocky Linux 9 に Ghost CMS をデプロイする方法

Ghost は、プロフェッショナルな外観のブログを作成するのに役立つオープンソースのブログプラットフォームです。2013年に、WordPress が過度に複雑になっていたため、その代替として立ち上げられました。JavaScript で書かれており、Node.js ライブラリによって動作しています。
このチュートリアルでは、Rocky Linux 9 で動作するサーバー上に Nginx と MySQL を使用して Ghost CMS をインストールする方法を探ります。Nginx サーバーを使用してブログをホストし、Let’s Encrypt SSL 証明書を使用してインストールを保護します。
前提条件
- Rocky Linux 9 を実行しているサーバー。
- sudo 権限を持つ非 root ユーザー。
- サーバーを指す完全修飾ドメイン名 (FQDN)。この目的のために、
ghost.example.comをドメイン名として使用します。 - すべてが更新されていることを確認してください。
$ sudo dnf update - 基本的なユーティリティパッケージをインストールします。いくつかはすでにインストールされているかもしれません。
$ sudo dnf install wget curl nano unzip yum-utils -y
ステップ 1 - ファイアウォールの設定
最初のステップはファイアウォールの設定です。Rocky Linux は Firewalld Firewall を使用しています。ファイアウォールの状態を確認します。
$ sudo firewall-cmd --state
running
ファイアウォールは異なるゾーンで動作し、パブリックゾーンがデフォルトで使用されます。ファイアウォールでアクティブなすべてのサービスとポートをリストします。
$ sudo firewall-cmd --permanent --list-services
次の出力が表示されるはずです。
cockpit dhcpv6-client ssh
Wiki.js は機能するために HTTP および HTTPS ポートが必要です。それらを開きます。
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent
変更を適用するためにファイアウォールを再読み込みします。
$ sudo firewall-cmd --reload
ステップ 2 - Nginx のインストール
Rocky Linux 9 には古いバージョンの Nginx が付属しています。最新バージョンをインストールするために公式の Nginx リポジトリをダウンロードする必要があります。
公式の Nginx リポジトリを作成するために、/etc/yum.repos.d/nginx.repo ファイルを作成して開きます。
$ sudo nano /etc/yum.repos.d/nginx.repo
以下のコードを貼り付けます。
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Ctrl + X を押してファイルを保存し、プロンプトが表示されたら Y を入力します。
Nginx サーバーをインストールします。
$ sudo dnf install nginx -y
インストールを確認します。
$ nginx -v
nginx version: nginx/1.22.1
Nginx サーバーを有効にして起動します。
$ sudo systemctl enable nginx --now
サーバーの状態を確認します。
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-10-25 08:27:47 UTC; 2s ago
Docs: http://nginx.org/en/docs/
Process: 1650 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 1651 (nginx)
Tasks: 2 (limit: 5912)
Memory: 1.9M
CPU: 7ms
CGroup: /system.slice/nginx.service
??1651 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??1652 "nginx: worker process"
Oct 25 08:27:47 ghost.example.com systemd[1]: Starting nginx - high performance web server...
ステップ 3 - Node.js のインストール
Ghost インストーラーは動作するために Nodejs を必要とします。Node 16 をインストールするために次のコマンドを実行します。
$ curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -
Node をインストールします。
$ sudo dnf install -y nodejs
Node のインストールを確認します。
$ node --version
v16.18.0
このチュートリアルを書いている時点で、Node 18 がリリースされており、LTS バージョンです。Ghost はまだそれをサポートしていません。最新のサポートされている Node バージョンについては、Ghost のドキュメントを確認してください。Ghost が Node 18 をサポートするようになったら、次のコマンドを使用して Node 18 をインストールします。
$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo dnf install -y nodejs
ステップ 4 - MySQL のインストール
Rocky Linux 9 には最新バージョンの MySQL が付属しています。1つのコマンドでインストールできます。
$ sudo dnf install mysql-server
MySQL のバージョンを確認します。
$ mysql --version
mysql Ver 8.0.30 for Linux on x86_64 (Source distribution)
MySQL サービスを有効にして起動します。
$ sudo systemctl enable mysqld --now
サービスの状態を確認します。
$ sudo systemctl status mysqld
? mysqld.service - MySQL 8.0 database server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-10-25 09:00:26 UTC; 3s ago
Process: 2920 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
Process: 2942 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
Main PID: 3021 (mysqld)
Status: "Server is operational"
Tasks: 39 (limit: 5912)
Memory: 404.4M
CPU: 4.686s
CGroup: /system.slice/mysqld.service
??3021 /usr/libexec/mysqld --basedir=/usr
Oct 25 09:00:18 ghost.example.com systemd[1]: Starting MySQL 8.0 database server...
Oct 25 09:00:18 ghost.example.com mysql-prepare-db-dir[2942]: Initializing MySQL database
Oct 25 09:00:26 ghost.example.com systemd[1]: Started MySQL 8.0 database server.
デフォルトでは、Unix 認証を使用して MySQL シェルにログインできます。しかし、セキュリティ設定ウィザードを実行することはできません。したがって、MySQL バージョン 8.0.28 以上には次のステップが必要です。MySQL シェルに入ります。
$ sudo mysql
次のコマンドを実行して、root ユーザーのパスワードを設定します。数字、大文字、小文字、特殊文字を組み合わせてください。
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPassword12!';
シェルを終了します。このステップの注意点は、Unix 認証を使用して MySQL シェルに再度ログインできなくなることです。
mysql> exit
MySQL セキュアインストールスクリプトを実行します。
$ sudo mysql_secure_installation
Validate Password Component をインストールするかどうかを尋ねられます。これは MySQL で使用されるパスワードの強度をチェックします。インストールするには Y を押します。
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: Y
次に、パスワード検証ポリシーのレベルを設定するように求められます。最も強力な 2 を選択します。その後、root パスワードを作成するように求められます。指定された要件に従ってパスワードを入力します。パスワードで続行するかどうかを尋ねられたら、Y を押して進みます。
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Please set the password for root here.
New password:
Re-enter new password:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
最後に、匿名ユーザーを削除し、リモート root ログインを禁止し、テストデータベースを削除し、特権テーブルを再読み込みするかどうかを尋ねられます。
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.
All done!
これで MySQL のインストールとセキュリティ設定が完了しました。
ステップ 5 - Ghost のインストール
Ghost のインストールは、Ghost-CLI コマンドラインツールとブログパッケージ自体の 3 つのコンポーネントで構成されます。
Ghost-CLI のインストール
Ghost-CLI ツールをインストールするために次のコマンドを実行します。プロセス中に受け取る警告は無視してください。
$ sudo npm install ghost-cli@latest -g
Ghost ディレクトリの準備
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 のインストールは単一のコマンドプロセスです。
$ ghost install
インストール中、CLI ツールはブログを構成するためにいくつかの質問をします。
- このチュートリアルを書いている時点で、Ghost-CLI は Ubuntu 以外の OS をサポートしていません。インストールを続行するかどうかを尋ねられます。Y を押して続行します。
- ブログ URL: https プロトコルを含む完全なブログ URL を入力します。 (
https://ghost.example.com) - MySQL ホスト名: Ghost インストールと MySQL が同じサーバーにあるため、デフォルト値の
localhostを使用するには Enter を押します。 - MySQL ユーザー名: MySQL ユーザー名として
rootを入力します。 - MySQL パスワード: 以前に作成した root パスワードを入力します。
- Ghost データベース名: Ghost データベースの名前を付けます。 (
ghostdb) - Sudo パスワード: 権限のあるコマンドを実行するためにシステムの sudo パスワードを入力します。
- Ghost 用の MySQL ユーザーを設定しますか?: インストーラーは、Ghost 用の別の MySQL ユーザーを作成するかどうかを尋ねます。Y を押して進みます。
- Nginx を設定しますか?: 通常、Ghost-CLI は Nginx インストールを検出し、自動的にブログのために構成します。しかし、現時点では、私たちの Nginx インストールを検出できません。したがって、インストーラーはこのステップを自動的にスキップします。Nginx を手動で構成します。
- SSL を設定しますか?: Nginx の構成をスキップしたため、CLI ツールは SSL の設定もスキップします。
- systemd を設定しますか?: Ghost は、Ghost のためのシステムサービスを設定するかどうかを尋ねます。Y を押して進みます。
- Ghost を開始しますか?: Y を押して Ghost インストールを開始します。サービスは開始されますが、動作させるために Nginx と SSL を構成する必要があります。
ステップ 6 - SSL のインストール
進む前に、Certbot ツールとドメイン用の SSL 証明書をインストールする必要があります。
Certbot をインストールするために、Snapd パッケージインストーラーを使用します。Snapd は常に Certbot の最新の安定版を提供します。
Snapd ツールは、動作するために Epel リポジトリを必要とします。
$ sudo dnf install epel-release -y
Snapd を使用して Certbot をインストールします。Snapd をインストールします。
$ sudo dnf install snapd -y
Snap サービスを有効にして起動します。
$ sudo systemctl enable snapd.socket --now
Snapd が動作するために必要なリンクを作成します。
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
snapd のバージョンが最新であることを確認します。
$ sudo snap install core
$ sudo snap refresh core
Certbot をインストールします。
$ sudo snap install --classic certbot
Certbot コマンドが /usr/bin ディレクトリで実行できるように、シンボリックリンクを作成します。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
SSL 証明書を生成します。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d ghost.example.com
上記のコマンドは、サーバーの /etc/letsencrypt/live/ghost.example.com ディレクトリに証明書をダウンロードします。
Diffie-Hellman グループ 証明書を生成します。
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
SSL 更新が正常に機能しているかどうかを確認するために、プロセスのドライランを行います。
$ sudo certbot renew --dry-run
エラーが表示されなければ、すべて設定完了です。証明書は自動的に更新されます。
ステップ 7 - Nginx の設定
編集のために /etc/nginx/conf.d/ghost.conf ファイルを作成して開きます。
$ sudo nano /etc/nginx/conf.d/ghost.conf
ghost.conf ファイルに以下のコードを貼り付けます。すべての ghost.example.com のインスタンスをあなたのドメインに置き換えます。
## enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name ghost.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ghost.example.com;
access_log /var/log/nginx/ghost.access.log;
error_log /var/log/nginx/ghost.error.log;
client_max_body_size 20m;
http2_push_preload on; # Enable HTTP/2 Server Push
ssl_certificate /etc/letsencrypt/live/ghost.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ghost.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/ghost.example.com/chain.pem;
ssl_session_timeout 1d;
# Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
ssl_protocols TLSv1.2 TLSv1.3;
# Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
# prevent replay attacks.
#
# @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
ssl_early_data on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
add_header X-Early-Data $tls1_3_early_data;
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;
}
}
# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data {
"~." $ssl_early_data;
default "";
}
上記の設定により、すべての 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 reload nginx
ステップ 8 - SELinux の設定
Nginx がネットワークに接続できるようにします。
$ sudo setsebool -P httpd_can_network_connect 1
ステップ 9 - サイトを実行する
これで、ウェブブラウザで https://ghost.example.com を開いてインストールを確認できます。成功したインストールを示すページが表示されます。

ステップ 10 - セットアップを完了する
Ghost ブログの設定を完了するには、ブラウザで https://ghost.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": "'Acme Support' [email protected]",
"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 メールサービスを使用しています。これは非常に安価で、EC2 サービスを使用している場合は生涯無料です。
Mailgun を使用してニュースレターサービスを利用したい場合は、次のコードを代わりに入力します。
"mail": {
"from": "'Acme Support' [email protected]",
"transport": "SMTP",
"options": {
"service": "Mailgun",
"host": "smtp.mailgun.org",
"port": 587,
"secure": true,
"auth": {
"user": "[email protected]",
"pass": "1234567890"
}
}
},
Ctrl + X を押してファイルを保存し、プロンプトが表示されたら Y を入力します。
完了したら、変更を適用するために Ghost アプリケーションを再起動します。
$ ghost restart
ニュースレター設定を構成するには、設定 >> メールニュースレター セクションに移動します。

Mailgun 設定 リンクをクリックして展開します。
Mailgun のリージョン、ドメイン、API キーを入力します。

右上の 保存 ボタンをクリックして設定を保存します。
ニュースレター配信をテストするには、任意の投稿を開き、その設定を開いて メールニュースレター オプションをクリックします。次に、テストメールを送信して、機能するかどうかを確認します。エラーが表示されなければ、ニュースレター配信が正常に機能していることを意味します。
ステップ 12 - Ghost の更新
Ghost の更新には、マイナー更新とメジャー更新の 2 種類があります。
マイナー更新を実行する場合は、最初に完全バックアップを取ります。
$ cd /var/www/html/ghost
$ ghost backup
更新コマンドを実行してマイナー更新を行います。
$ ghost update
メジャー更新を行うには、Ghost の公式の詳細な更新ガイドに従う必要があります。現在のバージョンと更新したいメジャーバージョンによって手順が異なります。
結論
これで、Nginx を使用して Rocky Linux 9 サーバーに Ghost CMS をセットアップする方法に関するチュートリアルが完了しました。質問やフィードバックがあれば、下のコメントで共有してください。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。