OCIのARMインスタンスの無料枠で、Nginxをフリバースプロキシに使用したWordPressを、podmanなコンテナで実行したかった。
んだけど、NginxのコンテナとWordPressのコンテナとを別個のdocker-composeにしている事例を見つけられなかったから、自分でまとめてみた。
はじめに
Nginxコンテナでリバースプロキシして、サブドメインごとに複数のコンテナに振り分ける構成を想定。
この構成で複数サイトを運用する場合は、サイトごとにWPコンテナを追加する。
今回はarm64のインスタンスだったけど、x64/amd64な環境でも同じ手順でいけそうな気はする。
想定しているユーザレベル
分からないことがあれば自分でググる程度のユーザを想定
VCNの設定
仮想クラウドネットワークのセキュリティリストで、80番と443番のポートを開放しておくこと。
※SSLで22番以外のポートを使用する場合は、該当のポートも開放しておくこと。
実行環境等
インスタンス
Oracle Cloud Infrastructure
OCI Ampere A1 Compute Always Free
AlmaLinux OS 9.2.20230516 AArch64
主要なアプリケーション
Podman
docker-compose
Nginxのコンテナ
MySQLのコンテナ
PHP+WordPressのコンテナ
手順
初期設定
以下、コンソールでの作業。
sshクライアントは、お好みのもので。
rootのパスワードを設定
sudo passwd root
以下の作業はsuで行う
(ルートレスの設定が面倒だった)
su
タイムゾーンをJSTに変更
timedatectl status
timedatectl set-timezone Asia/Tokyo
timedatectl status
anacronからcronに切り替え
dnf -y install cronie-noanacron
dnf -y remove cronie-anacron
nanoをインストール(viやvimを使う人は、その方向で)
dnf -y install nano
export VISUAL=/usr/bin/nano
export EDITOR=/usr/bin/nano
SSHのポート番号を22から変更し、rootでのログインを禁止する(お好みで)
# SSHのポート番号と、rootでのログイン設定を編集
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
nano /etc/ssh/sshd_config
# SELINUXにsshのポート番号を追加
semanage port -a -t ssh_port_t -p tcp XXXX
# ファイアウォールのsshポート番号を変更
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
nano /etc/firewalld/services/ssh.xml
# ファイアウォールの設定を反映させて、sshdを再起動
firewall-cmd --reload
systemctl restart sshd
あれこれインストール
システムをアップデート
dnf -y update
podman関連のインストール
dnf -y install podman podman-plugins podman-docker podman-remote
touch /etc/containers/nodocker
podman --version
docker-composeのインストール
curl -L https://github.com/docker/compose/releases/download/v2.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
systemctl enable --now podman.socket
systemctl status podman.socket
SELINUXの設定
setsebool -P container_manage_cgroup on
コンテナのpull元からredhatを削除
cp /etc/containers/registries.conf /etc/containers/registries.conf.orig
nano /etc/containers/registries.conf
gitでリポジトリをクローンする
gitをインストール
dnf -y install git
リポジトリ「wp-nginx」のクローンをローカルに保存する。
cd /srv/
git clone https://github.com/SlipperyRider/wp-nginx.git
コンテナ間通信用のネットワークを作成
podman network create containya-network
nginxのコンテナの起動前準備
cd /srv/wp-nginx/nginx
chcon -R -h -t container_file_t ./
nginxの設定ファイルを編集
/srv/wp-nginx/nginx/conf.d/wp.conf の server_name を各自の環境に合わせて編集する。
証明書を配置
証明書を未取得の場合は、certbot等を使って証明書を取得しておく。
証明書のデータ・ボリュームを作成
podman volume ls
podman volume create nginx-certific8s
データ・ボリュームの場所を確認
podman volume inspect nginx-certific8s
※Mountpointに設定された場所を確認する
証明書をデータ・ボリューム・コンテナに配置
ls /var/lib/containers/storage/volumes/nginx-certific8s/_data
cp -H /etc/letsencrypt/live/domain.nya/fullchain.pem /var/lib/containers/storage/volumes/nginx-certific8s/_data/
cp -H /etc/letsencrypt/live/domain.nya/privkey.pem /var/lib/containers/storage/volumes/nginx-certific8s/_data/
証明書のパーミッションを400に設定
chmod 400 /var/lib/containers/storage/volumes/nginx-certific8s/_data/fullchain.pem
chmod 400 /var/lib/containers/storage/volumes/nginx-certific8s/_data/privkey.pem
WordPressのコンテナの起動前準備
cd /srv/wp-nginx/wp/
chcon -R -h -t container_file_t ./
データ・ボリュームを作成
podman volume create nginx-html-wp
podman volume create wp-db-data
各コンテナを起動
cd /srv/wp-nginx/wp/
docker-compose up -d
cd /srv/wp-nginx/nginx/
docker-compose up -d
コーヒー、紅茶、喫猫などで一息。
WordPressの初期設定とか
https://wordpress.domain.nya/(例) でWordPressにアクセス。
以降は、いつものWordPressの設定。
データベースへの接続設定を要求された場合は、.envの記述に合わせる事。
cat wp-nginx/wp/.env
ログのローテーションを設定
ホスト側のlogrotateにnginxコンテナ向けの設定を追加
logrotateの対象を確認
ll /etc/logrotate.d/
nginx用の設定を登録
cd /srv/wp-nginx/nginx/
cp ./nginx.logrotate /etc/logrotate.d/nginx
テスト(強制 logrotate)と結果の確認
logrotate -f /etc/logrotate.conf
ll ./logs/
“access.log”、“error.log”とは別に“access.log-yyyymmdd”、“error.log-yyyymmdd”ができていれば、OK。
余談
セキュリティ上、fail2banとかも設定した方がいいかも。