Rocky Linux 9 に Strapi CMS を Nginx リバースプロキシでインストールする方法

Strapi のコミュニティ版を Rocky Linux 9 にインストールし、PostgreSQL、PM2、Nginx(リバースプロキシ)と Let’s Encrypt の SSL を組み合わせて本番環境で稼働させる手順を網羅します。手順ごとにコマンド、注意点、トラブルシュート、運用チェックリストを提供します。
目的と対象読者
このガイドは、Rocky Linux 9 上で Strapi CMS を本番稼働させたい開発者、SRE、サーバー管理者を対象とします。前提条件として sudo 権限を持つ非 root ユーザー、FQDN(例: strapi.example.com)、最低 2GB のメモリが必要です。
重要: 本番環境では必ず十分なバックアップと強力なパスワード、ファイアウォール設定を行ってください。
目次
- 前提条件
- ステップ 1: ファイアウォールの設定
- ステップ 2: PostgreSQL のインストールと設定
- ステップ 3: Node.js のインストール
- ステップ 4: Strapi のインストールとビルド
- ステップ 5: PM2 によるプロセスマネージャ設定
- ステップ 6: Nginx のインストール
- ステップ 7: SSL の取得(Certbot / Let’s Encrypt)
- ステップ 8: Nginx のリバースプロキシ設定
- ステップ 9: Strapi のアップグレード手順
- 運用・セキュリティ強化
- トラブルシュートとテストケース
- 役割別チェックリスト
- ミニ手順: バックアップと復旧
- 決断ツリー(導入・移行の判断)
- 用語集(1 行)
- まとめ
前提条件
- Rocky Linux 9 を実行するサーバー(最小 2GB RAM, 1 CPU)。
- sudo 権限を持つ非 root ユーザー。
- 完全修飾ドメイン名(FQDN)、例: strapi.example.com。
- システムを最新にしておく。
$ sudo dnf update
- 必要なパッケージをインストール(多くは既に存在するかもしれません)。
$ sudo dnf install wget curl nano unzip yum-utils -y
ステップ 1 - ファイアウォールの設定
Rocky Linux は firewalld を使います。状態を確認します。
$ sudo firewall-cmd --state
running
デフォルトの public ゾーンを使い、HTTP/HTTPS を開放します。
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --reload
一時的に Strapi のデフォルトポート 1337 を直接公開して動作確認することもできますが、本番では Nginx をリバースプロキシとして利用するため、最終的に 1337 ポートは閉じることを推奨します。
重要: 最小限の公開ポートのみ開け、管理用インターフェース(SSH 等)は適切に保護してください。
ステップ 2 - PostgreSQL のインストールと設定
Strapi は PostgreSQL 11 以上をサポートします。Rocky Linux 9 には PostgreSQL 13 が入っていますが、ここでは PostgreSQL 15 を利用します。
GPG キー追加とリポジトリ導入:
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null
$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ sudo dnf -qy module disable postgresql
$ sudo dnf install -y postgresql15-server
初期化とサービス起動:
$ sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
$ sudo systemctl enable --now postgresql-15
$ sudo systemctl status postgresql-15
PostgreSQL ユーザーとデータベースの作成:
$ sudo -i -u postgres psql
postgres=# CREATE DATABASE strapidb;
postgres=# CREATE USER strapiuser WITH PASSWORD 'Your_Password';
postgres=# ALTER DATABASE strapidb OWNER TO strapiuser;
postgres=# \q
接続を確認します。
$ psql --username strapiuser --password --host localhost strapidb
Password: # ← 先ほどのパスワードを入力
注: パスワードは強力なランダム文字列を推奨します。環境変数やシークレットマネージャに保管しましょう。
代替案: SQLite を開発用に使えますが、本番では PostgreSQL や MySQL のような RDB を使うべきです。
ステップ 3 - Node.js のインストール
Rocky Linux のデフォルト Node.js は古い場合があります。LTS(この記事執筆時点では v18) を導入します。
$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo dnf install -y nodejs
$ node -v
v18.x.x
重要: Strapi のサポートする Node.js バージョンは公式ドキュメントで確認してください。
ステップ 4 - Strapi のインストールとビルド
npx を使って Strapi プロジェクトを作成します。
$ npx create-strapi-app@latest howtoforge-project
Need to install the following packages:
[email protected]
Ok to proceed? (y) y
インストールタイプは Custom を選び、データベースに PostgreSQL を選択します。対話の例:
? Choose your installation type Custom (manual settings)
? Choose your preferred language JavaScript
? Choose your default database client postgres
? Database name: strapidb
? Host: 127.0.0.1
? Port: 5432
? Username: strapiuser
? Password: Your_Password
? Enable SSL connection: No
プロジェクトディレクトリへ移動し、管理パネルをビルドします。
$ cd howtoforge-project
$ NODE_ENV=production npm run build
起動(開発確認):
$ node ~/howtoforge-project/node_modules/.bin/strapi start
ブラウザで http://
$ sudo firewall-cmd --permanent --remove-port=1337/tcp
$ sudo firewall-cmd --reload
ステップ 5 - PM2 によるプロセスマネージャ設定
手動で node を実行する代わりに PM2 を使用してプロセス管理と systemd 自動起動を行います。
$ cd ~
$ sudo npm install pm2@latest -g
$ sudo nano ecosystem.config.js
例の ecosystem.config.js(cwd は実際のユーザーとディレクトリに合わせて編集):
module.exports = {
apps: [
{
name: 'strapi',
cwd: '/home/navjot/howtoforge-project',
script: 'npm',
args: 'start',
env: {
NODE_ENV: 'production',
DATABASE_HOST: 'localhost',
DATABASE_PORT: '5432',
DATABASE_NAME: 'strapidb',
DATABASE_USERNAME: 'strapiuser',
DATABASE_PASSWORD: 'Your_Password',
},
},
],
};
起動と自動起動設定:
$ pm2 start ecosystem.config.js
$ pm2 save
$ pm2 startup
# 出力された sudo コマンドをコピーして実行(例):
$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u navjot --hp /home/navjot
重要: pm2 起動ユーザーと HOME(–hp)を正しく指定してください。pm2 save を実行しておかないと再起動時にプロセスが復元されません。
ステップ 6 - Nginx のインストール
最新の Nginx を導入するために公式リポジトリを追加します。
$ sudo nano /etc/yum.repos.d/nginx.repo
リポジトリ内容を貼り付けて保存し、インストール:
$ sudo dnf install -y nginx
$ sudo systemctl enable --now nginx
$ sudo systemctl status nginx
ステップ 7 - SSL の取得(Certbot / Let’s Encrypt)
Certbot は snapd 経由でインストールします(Rocky では EPEL が必要)。
$ sudo dnf install -y epel-release
$ sudo dnf install -y snapd
$ sudo systemctl enable --now snapd
$ sudo snap install core && sudo snap refresh core
$ 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
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
$ certbot --version
certbot x.y.z
証明書の取得(Nginx プラグインを利用):
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d strapi.example.com
Diffie-Hellman パラメータを生成します(初回のみ、時間がかかることがあります)。
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
証明書の自動更新テスト:
$ sudo certbot renew --dry-run
注意: certbot の renew は crontab / systemd timer で自動化されます。snap 版を使う場合、snap のパスに注意してください。
ステップ 8 - Nginx のリバースプロキシ設定
/etc/nginx/nginx.conf に server_names_hash_bucket_size を追加:
$ sudo nano /etc/nginx/nginx.conf
# server_names_hash_bucket_size 64; を include の前に追加
新しい仮想ホスト設定を /etc/nginx/conf.d/strapi.conf に作成します(以下は例)。
server {
# Redirect any http requests to https
listen 80;
listen [::]:80;
server_name strapi.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name strapi.example.com;
access_log /var/log/nginx/strapi.access.log;
error_log /var/log/nginx/strapi.error.log;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/strapi.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/strapi.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/strapi.example.com/chain.pem;
ssl_protocols TLSv1.2 TLSv1.3;
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_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:1337;
}
}
設定をテストし、Nginx を再起動します。
$ sudo nginx -t
$ sudo systemctl restart nginx
ブラウザで https://strapi.example.com にアクセスして管理画面を作成します: https://strapi.example.com/admin
ステップ 9 - Strapi のアップグレード
アップグレード前に PM2 を停止し、package.json の Strapi 依存関係を最新に更新します。
$ cd ~
$ pm2 stop ecosystem.config.js
$ cd howtoforge-project
$ nano package.json
dependencies のバージョンを最新(公式リリースを確認)に更新し、インストールして管理パネルを再ビルドします。
$ npm install
$ NODE_ENV=production npm run build
$ cd ~
$ pm2 start ecosystem.config.js
重要: メジャーアップグレード時は必ずリリースノートを確認し、破壊的変更(breaking changes)がないかを確認してください。ステージング環境で検証してから本番へ反映すること。
運用・セキュリティ強化
重要な推奨事項:
- DB アクセスは localhost に限定するか、VPC 内の専用サーバーに配置する。
- 管理者アカウントの 2 要素認証を導入する(可能なプラグインや外部 IdP を検討)。
- Secrets(DB パスワードなど)は環境変数や Vault(HashiCorp など)に保管する。
- ファイルアップロードのサイズ制限とウイルススキャンを検討する。
- 定期的に npm audit と OS のセキュリティ更新を行う。
セキュリティハードニング例:
- Nginx で HTTP ヘッダを追加(Content-Security-Policy, X-Frame-Options など)。
- PostgreSQL の pg_hba.conf を最小特権で設定。
- Fail2ban でブルートフォースから保護。
バックアップと復旧(ミニ手順)
- PostgreSQL のバックアップ:
$ sudo -u postgres pg_dump strapidb > /var/backups/strapidb-$(date +%F).sql
- アップロードファイルのバックアップ(Strapi の public/uploads など)を rsync で定期的に保存。
- 復旧手順を定期的にリハーサル。
トラブルシュートと受け入れ基準
代表的な問題と確認手順:
- 起動しない: pm2 logs を確認し、DB が接続可能かを確認。
- 502 Bad Gateway: Nginx の proxy_pass 宛先(127.0.0.1:1337)が起動中か確認。
- SSL エラー: /etc/letsencrypt/live/yourdomain の権限とファイル存在を確認。
受け入れ基準:
- https://strapi.example.com/admin にアクセスして管理者アカウントでログインできる。
- コンテンツの作成、保存、表示が正常に動作する。
- 自動更新(certbot renew の dry-run)が成功する。
テストケース/受け入れテスト(例)
- 管理者ログイン: 正しい資格情報でログイン成功。誤った場合は失敗。
- API レスポンス: GET /api/articles が 200 を返す。
- ファイルアップロード: 画像アップロードが成功し、表示される。
- サーバー再起動: 再起動後も PM2 が Strapi を自動的に復元する。
役割別チェックリスト
開発者:
- package.json の依存関係を管理
- ステージングでのマイグレーション検証
SRE / 運用:
- pm2 / systemd の自動起動設定
- SSL 更新の監視とログ監視設定
- バックアップの定期実行と復旧検証
セキュリティ担当:
- DB の接続制御とパスワードポリシー
- 外部アクセス制限(WAF など)
決断ツリー(導入・移行の判断)
以下は導入可否の簡易フローです。
flowchart TD
A[新規プロジェクトか?]
A -->|はい| B[Strapi を新規導入]
A -->|いいえ| C[既存 CMS の移行検討]
C --> D{コンテンツ量が多いか}
D -->|多い| E[段階的移行と ETL を計画]
D -->|少ない| F[直接移行スクリプト]
B --> G{チームに Node.js スキル有りか}
G -->|有り| H[Strapi を導入]
G -->|無し| I[ホスティングサービス or エンジニア採用]
移行ヒントと互換性注意点
- Strapi のメジャーバージョン間は破壊的変更が入ることがあるため、必ずリリースノートを読み、ステージングで検証してください。
- プラグインやカスタムコードはアップグレードで壊れる可能性があるため、統合テストを用意してください。
小さな運用 SOP(短縮版)
- 変更はステージングで検証する。
- 重要な変更前は DB とアップロードファイルをバックアップする。
- 本番リリース時はメンテナンスウィンドウを設け、監視を強化する。
1 行用語集
- Strapi: ヘッドレス CMS。API 経由でコンテンツを提供するソフトウェア。
- PM2: Node.js アプリのプロセスマネージャ。systemd 連携で自動起動可能。
- Certbot: Let’s Encrypt のクライアントで証明書発行と更新を自動化。
- FQDN: 完全修飾ドメイン名(例: strapi.example.com)。
よくある失敗例と回避方法
失敗: PM2 の startup コマンドでユーザー名を誤る。 回避: pm2 startup 出力をよく読み、表示されたコマンドをそのまま実行する。
失敗: Nginx 設定の typo により nginx -t が失敗。 回避: 設定変更後に必ず nginx -t でテストする。
失敗: certbot がウェブルートにアクセスできない。 回避: HTTP から HTTPS へ即リダイレクトする設定は一時的に無効化し、証明書発行後にリダイレクトを有効化する。
ソーシャルプレビュー提案
OG タイトル: Rocky Linux 9 に Strapi を Nginx でインストール OG 説明: Strapi と PostgreSQL, PM2, Nginx, Certbot を組み合わせて本番対応の Strapi を構築する完全ガイド。
まとめ
このガイドでは Rocky Linux 9 上に Strapi をインストールし、本番で安全に動かすための主要構成(PostgreSQL、Node.js、PM2、Nginx、Certbot)を説明しました。導入後は定期的なアップデート、バックアップ、監視を実施してください。問題があればログ(pm2 logs、/var/log/nginx/strapi.error.log、PostgreSQL ログ)をまず確認してください。
要点:
- 本番では Nginx + SSL を必ず導入する。
- DB とファイルのバックアップを自動化する。
- アップグレードはステージングで検証する。
以上で Rocky Linux 9 における Strapi 本番導入の手順は完了です。質問や具体的な環境に合わせた最適化が必要な場合は詳細を教えてください。