勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

AlmaLinux9系にホスト側NginxとPodmanコンテナ環境を構築する方法

  サーバー Podman

AlmaLinux8系から9系に移行し、さらにLAMP環境からPodmanコンテナ環境に変更したい。ホスト側にはNginx / Cockpit / FTPサーバを、コンテナ側はapache-php / mariadb / mailpitを導入したい。あとは時刻同期等の細かい所も設定する方法をまとめてメモ。

 

やりたいこと

  • AlmaLinux8系から9系に移行
  • OS側は時刻同期やkdumpのメモリ確保停止等、細かい設定も分かる範囲で全部行う
  • Cockpitを導入し、セキュリティ対応と必要なアプリケーションも導入したい
  • コンテナ側はapache-php(同梱版) / mariadb / mailpitを導入
  • メモリ1GBのVPSなのでサーバが落ちないようにチューニングしたい

 

環境について

VPS

今回はKAGOYA CLOUD VPSのCPU1コア / メモリ1GBプランで作業した。SSH接続は公式案内の通り以下でログインできる。

  • 接続ポート -> 22
  • ユーザ名 -> root
  • パスワード or 秘密鍵 -> インスタンス作成時に選択したもの

ホスト(VPS)側

  • AlmaLinux release 9.8 (Olive Jaguar)

 

各種サーバ構築・設定

SELinuxの無効化

# SELinuxの設定状況を確認
getenforce

# 以下出力内容
Enforcing

# grubbyコマンドでSELinuxを無効化
grubby --update-kernel ALL --args selinux=0

# SELinuxの設定ファイルを開く
vi /etc/selinux/config

以下変更を行い「:wq」で上書き保存。

# 変更前
SELINUX=enforcing

# 変更後
SELINUX=disabled

以下で再起動及び設定状況を確認する。

# サーバの再起動
reboot

# SELinuxの設定状況を確認
getenforce

# 以下出力内容
Disabled

コマンド履歴のログ化

過去にメモしたがSSH接続後のコマンド履歴を以下でログ化する。

# ログ保存用ディレクトリの作成
mkdir -p /var/log/ssh_session

# パーミッション変更
chmod 777 /var/log/ssh_session

# スティッキービートの設定
chmod +t /var/log/ssh_session

# シェルスクリプトを作成
vi /etc/profile.d/ssh_script.sh

シェルスクリプトは以下内容で作成する。

# SSH接続されているもしくはローカルログイン時に実行
if [ -n "$SSH_CONNECTION" ] || [ "$TERM" != "" ]; then

    # ログの保存場所
    LOG_DIR="/var/log/ssh_session"

    # SSH接続元IPを取得。もしローカルログインで空なら "local" という文字にする
    CLIENT_IP=$(echo "$SSH_CLIENT" | awk '{print $1}')
    : "${CLIENT_IP:=local}"

    # ログディレクトリ及びファイル名
    LOG_FILE="$LOG_DIR/${USER}_${CLIENT_IP}.log"

    # コマンド実行直前にログを記録する関数
    log_ssh_command() {

        # 現在実行しようとしているコマンド($BASH_COMMAND)がプロンプト表示処理や自分自身の関数ではない場合
        if [ "$BASH_COMMAND" != "$PROMPT_COMMAND" ] && [ "$BASH_COMMAND" != "log_ssh_command" ]; then

            # ログファイルにコマンド内容を書き込み
            echo "$(date "+%Y-%m-%d %H:%M:%S") [${USER}] $BASH_COMMAND" >> "$LOG_FILE"
        fi
    }

    # ユーザーがコマンドを実行する直前にlog_ssh_commandを実行
    trap 'log_ssh_command' DEBUG

fi

引き続き以下の通り進める。

# 全てのユーザーにシェルスクリプトの実行権限を追加
chmod +x /etc/profile.d/ssh_script.sh

# 一旦SSH接続を終了
exit

SSHで再接続すると以下ディレクトリ内にログが保存されるようになっている筈。

/var/log/ssh_session

Swap領域の追加

Kagoyaサーバでメモリ1GB / AlmaLinux9の場合、Swap領域は1GBで設定されていた。ここに2GB追加する。

# swapファイルの作成
dd if=/dev/zero of=/swapfile2 bs=1M count=2048

# 作成したファイルをswap領域に指定
mkswap /swapfile2

# 設定ファイルに追記
echo '/swapfile2 swap swap defaults 0 0' >> /etc/fstab

# 再起動
reboot

# 認識されているか確認
free -m

# 以下のようにSwap欄が3GBになっていればOK
               total        used        free      shared  buff/cache   available
Mem:             763         272         403           8         210         490
Swap:           3071           0        3071

ユーザー追加・設定

# ユーザーの追加
useradd test_user

# パスワード設定
passwd test_user

# スーパーユーザー権限追加
usermod -aG wheel test_user

# (必要に応じて)rootユーザーのパスワード設定
passwd root

SSH接続用のポートを変更

# SSH接続用ポートのファイアウォール開放
firewall-cmd --permanent --add-port=7777/tcp

# ファイアウォール再起動
firewall-cmd --reload

# 設定確認
firewall-cmd --list-all

# ports欄に7777があればOK
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 7777/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

# SSH設定ファイルを開く
vi /etc/ssh/sshd_config

以下変更を行い「:wq」で上書き保存。

#書き換え前
#Port 22

#書き換え後
Port 7777

以下で再起動。

# SSH再起動
systemctl restart sshd

尚、この時点で設定したポートでSSH接続できるが、念のため起動中のRLoginは開いたまま、新しいタブ等で接続を試みること。

時刻同期設定

# dnfのアップデート
dnf -y update

# chronyのインストール
dnf -y install chrony

# 設定ファイルを開く
vi /etc/chrony.conf

以下変更を行い「:wq」で上書き保存。

# 2行目の以下をコメントアウト
pool 2.cloudlinux.pool.ntp.org iburst

# 以下を追記
pool ntp.nict.jp iburst

以下でアスタリスク(*)が付いている項目があるか確認する。尚、反映されるまで数秒~数十秒程度がかかる場合あり。

# chronyの再起動
systemctl restart chronyd

# 設定状況確認
chronyc sources

MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^+ ntp-a2.nict.go.jp             1   6    17    41    +59us[  +62us] +/- 4697us
^* ntp-k1.nict.jp                1   6    17    41    -38us[  -36us] +/- 2069us
^+ ntp-b3.nict.go.jp             1   6    17    41    +58us[  +58us] +/- 4644us
^- ntp-b2.nict.go.jp             1   6    17    41   +128us[ +128us] +/- 4716us

タイムゾーン設定

# タイムゾーン設定
timedatectl set-timezone Asia/Tokyo

# 日時確認
date

kdumpのメモリ確保停止

以下のどちらかのパターンでkdumpのメモリ確保を停止する。ちなみにメモリ確保のみを停止してもカーネル更新後にrebootすると書き換えられる可能性があるため、削除した方がいいかも。

kexex-tools自体を削除するパターン

dnf remove -y kexec-tools

kdump用のメモリを確保しないように設定するパターン

# kdumpを停止
systemctl disable --now kdump.service

# OS起動時にkdump用のメモリを確保しないように設定
grubby --update-kernel=ALL --args="crashkernel=0"

# 設定を反映
grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline

# サーバ再起動
reboot

# 設定状況を確認(Active: inactive (dead)になっていればOK)
systemctl status kdump
○ kdump.service - Crash recovery kernel arming
     Loaded: loaded (/usr/lib/systemd/system/kdump.service; disabled; preset: enabled)
     Active: inactive (dead)

# メモリ使用状況を確認(Memのtotalが900以上ならOK)
free -m
               total        used        free      shared  buff/cache   available
Mem:             955         288         670           6         137         666
Swap:           3071           0        3071

dnf makecacheの自動更新を停止

メモリ1GBのサーバだとdnf makecacheの自動更新時にスワップになりやすいので以下で停止する。

# 現在動作中のタイマーを停止の上、自動起動も無効化
systemctl disable --now dnf-makecache.timer

# サービス自体が勝手に呼び出されないようマスク
systemctl mask dnf-makecache.service

# タイマーが停止しているかチェック(Active: inactiveならOK)
systemctl status dnf-makecache.timer

# サービスが停止しているかチェック(Loaded: maskedならOK)
systemctl status dnf-makecache.service

Nginx設定

# Nginxのインストール
dnf -y install nginx

# 起動設定
systemctl enable --now nginx

# ステータス確認
systemctl status nginx

# 自動起動確認
systemctl is-enabled nginx

# ファイアウォール開放
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

この時点でブラウザからサーバIPアドレスにアクセスするとNginxのデフォルトのウェルカムページが表示される筈。

尚、コンテナへの接続テスト用に/etc/nginx/nginx.confのserver {}ブロック内に以下リバースプロキシ設定を追記しておく。

location / {
    proxy_pass http://127.0.0.1:8080; 
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

追記後は以下で再起動。

# 構文チェックし、問題無ければ再起動
nginx -t
systemctl reload nginx

basic認証

basic認証も必要な場合は.htpasswdファイルを作成し、「/etc/nginx/.htpasswd」のように設置しておく。

また、/etc/nginx/nginx.confのserver {}ブロック内に以下を追記しておく。

location = /path/to/admin {
    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;

    proxy_pass http://127.0.0.1:8080; 
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

location /path/to/admin/ {
    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;

    proxy_pass http://127.0.0.1:8080; 
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

vsFTPd(FTPサーバ)設定

# FTPサーバのインストール
dnf -y install vsftpd

#設定ファイルを開く
vi /etc/vsftpd/vsftpd.conf

以下変更、コメントアウト解除、追記を行い「:wq」で上書き保存する。

# --------------既存の箇所を変更もしくはコメントアウトを解除--------------
# 匿名ログインを禁止
anonymous_enable=NO
# ローカルユーザーのログインを許可
local_enable=YES
# 書き込み(アップロード)を許可
write_enable=YES
# 初期パーミッションをファイル664 / ディレクトリ775に変更
local_umask=002
# ユーザーをホームより上に行かせない
chroot_local_user=YES
# 上層に行けるユーザーリストを有効化
chroot_list_enable=YES
# 階層移動を許可するユーザーリストファイル
chroot_list_file=/etc/vsftpd/chroot_list
# ls -Rコマンドの実行の許可
ls_recurse_enable=YES

# --------------以下を追記--------------
# chroot制限下での書き込みを許可
allow_writeable_chroot=YES
# ログイン時の初期ディレクトリを固定
local_root=/var/www/html
# .htaccessなどの隠しファイルを表示
force_dot_files=YES
# タイムゾーンを日本時間にする
use_localtime=YES

以下で自動起動設定まで行う。

#上層へのcdを許可するユーザーを設定する
vi /etc/vsftpd/chroot_list 

# 許可するユーザー名を追記して:wqで上書き保存
test_user

# ファイアウォールの開放
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload

# FTPサーバの起動と自動起動設定
systemctl enable --now vsftpd

# ステータス確認
systemctl status vsftpd

# 自動起動確認
systemctl is-enabled vsftpd

Cockpit設定

# Cockpitのインストール
dnf -y install cockpit

# 起動設定
systemctl enable --now cockpit.socket

# (必要に応じて)ファイアウォール設定
firewall-cmd --add-service=cockpit --permanent
firewall-cmd --reload

この時点でブラウザから「IPアドレス:9090」でCockpitにアクセスできる筈。

また、Podman本体とCockpit上でPodmanを操作できるようにしたいので以下でインストールする。

# Podman本体とcockpit-podmanのインストール
dnf -y install podman cockpit-podman

# Cockpitを再起動
systemctl restart cockpit

Cockpitにアクセスすると「Podmanコンテナー」のメニューが追加される筈。

尚、Cockpit関連では必要に応じて以下設定を行っていく。

アクセスIP制限

過去記事のようにワンタイムパスワード認証を導入しようとしたが、正常に認証できなかったので以下でアクセスIP制限をかける。

# 自身のIPアドレスの確認
w -i

# 以下のように出力されるのでIPアドレスをコピーしておく
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     pts/0    xxx.xxx.xxx.xxx   22:54    1.00s  0.00s  0.00s w -i

# ファイアウォールのCockpit設定を削除
firewall-cmd --permanent --remove-service=cockpit

# 指定したドメインのみCockpitにアクセスできるよう設定
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="xxx.xxx.xxx.xxx" port port="9090" protocol="tcp" accept'

# ファイアウォール再起動
firewall-cmd --reload

# 設定確認
firewall-cmd --list-all

# services欄からcockpitが消え、rich rulesにIP制限設定が追加されていればOK
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports: 7777/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
        rule family="ipv4" source address="xxx.xxx.xxx.xxx" port port="9090" protocol="tcp" accept

ちなみにIPアドレスの追加や削除は以下で行える。

# 特定のIP制限設定を削除
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="xxx.xxx.xxx.xxx" port port="9090" protocol="tcp" accept'

# アクセス可能なIPを追加
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="xxx.xxx.xxx.xxx" port port="9090" protocol="tcp" accept'

cockpit-pcpのインストール

メトリックス(CPU / メモリ / ディスク / ネットワークの負荷状況確認)の履歴を残すためにcockpit-pcpを以下でインストール及び起動設定する。

# cockpit-pcpのインストール
dnf install -y pcp python3-pcp

# 起動・有効化設定
systemctl enable pmlogger.service
systemctl start pmlogger.service

# 設定状況の確認
systemctl status pmlogger.service

# Cockpitを再起動
systemctl restart cockpit

cockpit-filesのインストール

AlmaLinux8のCockpitだとファイルマネージャにcockpit-navigatorを導入していたが、AlmaLinux9だと導入できなかった。ただ、Cockpit公式が開発したcockpit-filesが使えるようなのでこちらを使用する。

# cockpit-filesのインストール
dnf install -y cockpit-files

# Cockpitを再起動
systemctl restart cockpit

ディレクトリの整理・各種設定

Web公開用ディレクトリ

Web公開用は以下のようなディレクトリ構成にしたい。

/var/www/html/podman/  # コンテナ側からマウントするディレクトリ
├── sub.test.com          # (必要に応じて)サブドメイン
│   └── public              # (必要に応じて)サブドメインの公開ディレクトリ
└── test.com                # メインドメイン
    ├── public               # メインドメインの公開ディレクトリ
    │   └── wordpress    # wordpress
    └── vendor              # (必要に応じて)composer関連
        └── composer

以下のように設定していく。setfaclコマンドについてはこちらの記事が参考になった。

# ディレクトリ作成(ドメイン部分は適宜変更)
mkdir -p /var/www/html/podman/test.com/public

# ホスト側の所有者・グループ設定
chown -R test_user:nginx /var/www/html

# ディレクトリとファイルのパーミッション一括設定
find /var/www/html -type d -exec chmod 775 {} +
find /var/www/html -type f -exec chmod 664 {} +

# SGID設定
find /var/www/html -type d -exec chmod g+s {} +

# 現在あるファイル・フォルダに対し、uid33(www-data)のユーザーに全権限を付与
setfacl -R -m u:33:rwx /var/www/html

# 今後作られるファイル・フォルダに対しても上記設定が引き継がれるよう設定
setfacl -R -d -m u:33:rwx /var/www/html

コンテナ関連設定ファイル用ディレクトリ

コンテナ関連設定ファイル用ディレクトリは以下のようなディレクトリ構成にしたい。

/opt/podman
├── apache
│   ├── mpm_prefork.conf
│   └── vhost.conf
├── docker-compose.yml
├── mailpit
│   └── .htpasswd
├── mariadb
│   ├── custom-mariadb.cnf
│   └── data
└── php
    ├── Dockerfile
    └── custom-php.ini

以下で各ディレクトリを作成。

mkdir -p /opt/podman/apache
mkdir -p /opt/podman/mailpit
mkdir -p /opt/podman/mariadb/data
mkdir -p /opt/podman/php

各種設定ファイルは以下内容のものをアップロードしておく。

/opt/podman/apache/mpm_prefork.conf
<IfModule mpm_prefork_module>
    # 起動時に生成される子プロセス数
    StartServers             2
    # アイドル状態の子プロセスの最小数
    MinSpareServers          2
    # アイドル状態の子プロセスの最大数
    MaxSpareServers          4
    # 最大同時リクエスト数
    MaxRequestWorkers        4
    #子プロセスが稼働中に扱うリクエスト数の上限
    MaxConnectionsPerChild 300
</IfModule>
/opt/podman/apache/vhost.conf
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
LoadModule expires_module /usr/lib/apache2/modules/mod_expires.so

# IP接続用(テスト接続のため)
<VirtualHost *:80>
    ServerName xxx.xxx.xxx.xxx

    DocumentRoot /var/www/html/test.com/public

    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy 127.0.0.1 10.0.2.2 172.17.0.1 10.89.0.0/16

    <Directory /var/www/html/test.com/public>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
/opt/podman/docker-compose.yml
services:

    # Webコンテナ用設定
    web:
        container_name: web-container
        image: web-server:latest
        restart: always
        ports:
            - "8080:80"
        volumes:
            - /var/www/html/podman:/var/www/html:Z
            - /opt/podman/php/custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini:ro
            - /opt/podman/apache/mpm_prefork.conf:/etc/apache2/mods-available/mpm_prefork.conf:ro
            - /opt/podman/apache/vhost.conf:/etc/apache2/sites-available/000-default.conf:ro
        environment:
            TZ: "Asia/Tokyo"
        networks:
            - web-db-net
            - web-mailpit-net
        deploy:
            resources:
                limits:
                    memory: 384M

        # コンテナ起動順序設定(db起動後にwebコンテナ起動)
        depends_on:
          - db

    # DBコンテナ用設定
    db:
        container_name: db-container
        image: mariadb:11.4
        restart: always
        volumes:
            - /opt/podman/mariadb/data:/var/lib/mysql:Z
            - /opt/podman/mariadb/custom-mariadb.cnf:/etc/mysql/conf.d/custom-mariadb.cnf:ro
        environment:
            TZ: "Asia/Tokyo"
            MARIADB_ROOT_PASSWORD: xxxxxxxxxxx
            MARIADB_DATABASE: xxxxxxxxxxx
            MARIADB_USER: xxxxxxxxxxx
            MARIADB_PASSWORD: xxxxxxxxxxx
        networks:
            - web-db-net
        deploy:
            resources:
                limits:
                    memory: 256M

    # Mailpitコンテナ用設定
    mailpit:
        container_name: mailpit-container
        image: axllent/mailpit:latest
        # ブラウザでアクセスするポートは19980
        ports:
            - "19980:8025"
        volumes:
            - /opt/podman/mailpit:/data:Z
            - /opt/podman/mailpit/.htpasswd:/data/.htpasswd:ro
        environment:
            TZ: Asia/Tokyo
            MP_MAX_MESSAGES: 1000
            MP_DATABASE: /data/mailpit.db
            MP_SMTP_AUTH_ACCEPT_ANY: 1
            MP_SMTP_AUTH_ALLOW_INSECURE: 1
            MP_UI_AUTH_FILE: /data/.htpasswd
        networks:
            - web-mailpit-net
        deploy:
            resources:
                limits:
                    memory: 32M

# ネットワーク設定
networks:
    web-db-net:
    web-mailpit-net:
/opt/podman/mailpit/.htpasswd

Basic認証用のファイルをhtpasswd生成ツール等で作成し、.htpasswdをアップロードしておく。

/opt/podman/mariadb/custom-mariadb.cnf
[mysqld]
# InnoDBのデータやインデックスのバッファ用メモリのサイズ
innodb_buffer_pool_size = 64M

# InnoDBのトランザクションのためのバッファのサイズ
innodb_log_buffer_size = 2M

# 同時接続数
max_connections = 20

# すべての接続で同時に開けるテーブル合計数
table_open_cache = 100

# スレッドキャッシュ保持最大数
thread_cache_size = 4

# フルスキャン用のバッファ
read_buffer_size = 256K

# ソート後にレコードを読むときに使用されるバッファ
read_rnd_buffer_size = 256K

# ソート時に使用されるバッファ
sort_buffer_size = 512K

# インデックス未使用でのJOIN時に使用するバッファ
join_buffer_size = 512K

# 文字コード設定
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
/opt/podman/php/custom-php.ini
; タイムゾーン設定
date.timezone = "Asia/Tokyo"

; ファイルアップロード上限
upload_max_filesize = 64M
post_max_size = 64M

; メモリ上限
memory_limit = 128M


; opcache設定
[opcache]

; ophacheを有効化
opcache.enable = 1

; CLIやバックグランド処理時でも有効化
opcache.enable_cli = 1

; キャッシュ保存用のメモリ
opcache.memory_consumption = 32

; 文字列の格納に使用するメモリサイズ
opcache.interned_strings_buffer = 8

; キャッシュ可能なファイル最大数
opcache.max_accelerated_files = 4000

; ファイル更新時に自動でチェック
opcache.validate_timestamps = 1

; ファイル更新チェックの2秒間隔に設定
opcache.revalidate_freq = 2


; apcu設定
[apcu]

; apcuを有効化
apc.enabled = 1

; CLIやバックグランド処理時でも有効化
apc.enable_cli = 1

; メモリ割り当て
apc.shm_size = 32M
/opt/podman/php/Dockerfile
# Docker公式PHP8.4&Apache同梱版イメージを指定
FROM docker.io/library/php:8.4-apache

# PHP拡張機能インストーラーをダウンロードして配置
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

# 実行権限を与え、必要なモジュールを一括インストール
RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions \
    apcu \
    bcmath \
    curl \
    dom \
    exif \
    gd \
    gmp \
    imagick \
    intl \
    mbstring \
    memcache \
    memcached \
    mysqli \
    opcache \
    pcntl \
    pdo_mysql \
    redis \
    simplexml \
    sockets \
    sysvsem \
    xml \
    xmlwriter \
    zip \
    zlib

# composerのコピー
COPY --from=docker.io/library/composer:latest /usr/bin/composer /usr/bin/composer

# apache-php8.4はDebian系のためdnfではなくapt-getで必要なコマンドを導入
RUN apt-get update && apt-get install -y git zip unzip

# Apacheのrewriteモジュールとremoteipモジュールを有効化
RUN a2enmod rewrite remoteip

Podman設定

以下でpodman-composeをインストール。

# Pythonパッケージをインストール
dnf install -y python3 python3-pip

# pip経由でpodman-composeをインストール
pip3 install podman-compose python-dotenv

# バージョンの確認
podman-compose version

# 以下出力内容
podman-compose version 1.6.0
podman version 5.8.2

Podmanとコンテナ自動起動用サービスの有効化と起動設定を行う。これを設定していないとdocker-compose.ymdで「restart: always」を指定していてもサーバ再起動時にコンテナが自動で立ち上がらない点に注意。

# Podmanを有効化・起動
systemctl enable --now podman.socket podman.service

# コンテナ自動再起動を有効化・起動
systemctl enable --now podman-restart.service

# 設定確認
systemctl status podman.service podman-restart.service

次にapache-php用イメージのビルドと各コンテナの作成・起動を行う。

# ディレクトリ移動
cd /opt/podman/php

# ビルド
podman build -t web-server .

# ディレクトリ移動
cd /opt/podman

# 構文チェック
podman compose config

# コンテナ作成・起動
podman-compose up -d

コンテナ起動後「/var/www/html/podman/test.com/public」に何らかのファイルをアップロードし「IPアドレス/ファイル名」にアクセスするとページが表示される筈。また、web -> dbコンテナやweb -> mailpitコンテナへの接続も確認できる筈。

尚、mailpitテスト用にphpmailerをインストールしたい場合は以下。

podman exec \
    -w /var/www/html/test.com \
    web-container \
    composer require phpmailer/phpmailer

 

その他

個人的に必須と思われるツール類の導入と設定はできたので、ここからはなくても問題無いがあった方が便利なツールの導入方法になる。

Lazydocker

コンテナのログや負荷状況を見るのに便利。あとPortainerよりも省メモリなのも助かる。

# Go言語をインストール
dnf -y install golang

# Goを使ってLazydockeをインストール
go install github.com/jesseduffield/lazydocker@latest

# 実行ファイルを共通ディレクトリに移動
mv ~/go/bin/lazydocker /usr/local/bin/

# Podmanのシステムソケットを起動・有効化
systemctl enable --now podman.socket

# podmanとdockerの互換ツールをインストール(ソケット通信に必要)
dnf -y install podman-docker

# Lazydockeの起動
lazydocker

 

所感

OSのバージョンが変わると色々大変

AlmaLinux8系から9系に変わるだけでも結構大変だった。OS / ホスト / コンテナ設定は一通りできた筈。

WordPressの移行やチューニングに関しては別記事でメモしたいところ。

ストレージについて

ここまでの設定を行い「df -h」コマンドでストレージを確認したところ8GBほど使用していた。移行前のサーバがMySQLのバイナリログ等を含めると10GBほど使用している状態。

その辺りを考えるとIndigo VPSのメモリ1GB / ストレージ20GBプランに移るのは厳しそう。

Kagoyaがメモリ1GBでもストレージ100GBと余裕があるのでこちらに移行しようと思う。

 

参考サイト

https://www.linuxmaster.jp/linux_skill/2026/04/setfacllinuxaclgetfacl.html

 - サーバー Podman

  関連記事

Cockpitにリンク集(ブックマーク)のようなページを作成し、メニューにも追加する方法
Cockpitにリンク集(ブックマーク)のようなページを作成し、メニューにも追加する方法

Cockpitにリンク集(ブックマーク)のようなカスタムページを作成し、左メニュ ...

Cockpitでプログラムの自動実行(systemd timer)設定を行う方法
Cockpitでプログラムの自動実行(systemd timer)設定を行う方法

Cockpitでプログラムの自動実行設定を行いたい。調べたところCronは難しそ ...

サーバ管理ツール「Cockpit」にファイルマネージャー用プラグインを導入する方法
サーバ管理ツール「Cockpit」にファイルマネージャー用プラグインを導入する方法

先日メモしたサーバ管理ツール「Cockpit」にブラウザ上からファイルの作成や編 ...

Podmanでイメージのビルド中に「Writing manifest to ~~」表示で処理が止まる場合の対応方法
Podmanでイメージのビルド中に「Writing manifest to ~~」表示で処理が止まる場合の対応方法

Podmanでイメージのビルド中に「Writing manifest to im ...

Cockpitにrootユーザでのログインを禁止する方法
Cockpitにrootユーザでのログインを禁止する方法

先日CockpitにGoogle Authenticatorを用いたワンタイムパ ...