勉強したことのメモ

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

Podmanコンテナ環境にWordPressを導入の上、パーミッション等の各種設定を行う方法

Podmanコンテナ環境にWordPressを導入したい。何も考えずにWP関連のファイルをアップロードし、インストールすると恐らくパーミッションや所有者・グループの問題で面倒が起きそうなのでその辺りもまとめて設定したい。具体的にはWPダッシュボード、FTP接続どちらでも問題無く管理できるようにしたい。以下に対応方法をメモ。

 

環境について

VPS

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

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

ホスト(VPS)側

  • AlmaLinux 8.10 (Cerulean Leopard)
  • Nginx 1.14.1

コンテナ側

  • PHP 8.4.24(cli)
  • Apache 2.4.68 (Debian)
  • MariaDB 11.4.12

 

対応方法

データベース関連

サーバにSSH接続し、以下でWordPress用のデータベースとユーザーを作成し、ユーザーには権限を付与する。

# DBコンテナにログイン
podman exec -it 【データベース用コンテナ名】 mariadb -u root -ptest_root_pass

# WordPress用データベースとユーザー作成し権限を付与(データベース名、ユーザー名、パスワードは適宜変更)
CREATE DATABASE wp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'%' IDENTIFIED BY 'wp_pass';
GRANT ALL PRIVILEGES ON wp_db.* TO 'wp_user'@'%';
FLUSH PRIVILEGES;

WordPressの導入

以下でファイルダウンロード及び展開する。

# WordPressを導入するディレクトリに移動
cd /var/www/html/container/wordpress

# WordPressをダウンロード
curl -O https://ja.wordpress.org/latest-ja.tar.gz

# ダウンロードしたファイルを展開
tar -xvf latest-ja.tar.gz

# 展開後のwordpressディレクトリ以下を移動
mv wordpress/* /var/www/html/container/wordpress

# 不要なファイルを削除
rm -rf wordpress latest-ja.tar.gz

この時点でブラウザから「ドメイン/wordpress」にアクセスするとインストール画面が表示されるのでそのまま進める。

ホストはデータベース用コンテナ名になる点にだけ注意。

WordPress設定(wp-config.php)

WordPressのインストール完了後、wp-config.phpの「/* Add any custom values between this line and the "stop editing" line. */」より下に以下を追記。

# プロキシサーバ経由かつHTTPS接続の場合はPHPの環境変数を書き換え
if( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ){
    $_SERVER['HTTPS'] = 'on';
}

# Webサーバ権限でファイル書き換え
define('FS_METHOD', 'direct');

# ディレクトリ・ファイルを作成した際のパーミッション
define('FS_CHMOD_DIR', 0775);
define('FS_CHMOD_FILE', 0664);

# 新規作成ファイルのデフォルトパーミッションを設定
umask(0002);

FTPサーバ(vsftpd)の設定

サーバにSSH接続し、設定ファイルを開く。

# 設定ファイルのバックアップ
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.yyyymmdd

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

以下の通り書き換える。

# 変更前
local_umask=022

# 変更後
local_umask=002

上書き保存後、以下で再起動。

systemctl restart vsftpd

local_umaskについて

local_umaskの変更前後の違いは以下の通りで変更後は同グループも書き込みができるようになる。

  • 022(変更前のデフォルト値) -> ファイル644 / ディレクトリ755
  • 002(変更後) -> ファイル664 / ディレクトリ775

所有者とパーミッション設定

以下で所有者・グループとパーミッション設定を行う。

# ユーザーの作成とパスワード設定(既存のユーザーを使用する場合は不要)
useradd ftp_user
passwd ftp_user

# 33グループに副グループとして追加
usermod -aG 33 ftp_user

# FTPサーバの再起動
systemctl restart vsftpd

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

# コンテナ側の所有者・グループを設定
chown -R ftp_user:33 /var/www/html/container

# 所有者・グループのパーミッションを設定
find /var/www/html/container -type d -exec chmod 775 {} +
find /var/www/html/container -type f -exec chmod 664 {} +

# 新規ファイル・フォルダ作成時にグループ権限を引き継ぐ(SGID)設定
find /var/www/html/container -type d -exec chmod g+s {} +

ここまでで設定完了。ダッシュボードから記事の作成やテーマ・プラグインのインストールや、FTPからファイルの書き換え等が行える筈。

補足

グループの「33」と所有者やパーミッション設定内容について

DebianだとWebサーバ(ApacheやNginx等)のデフォルトユーザーが「www-data」になり、この「www-data」のGIDが「33」になる。

また、AlmaLinuxだとGID「33」は「tape」という名前のグループに割り当てられており「ls -l /var/www/html」で一覧を表示すると「ftp_user:tape」となるが、コンテナ側では「ftp_user:www-data」として読み取られる。

ディレクトリ775 / ファイル664になっているため「ftp_user:www-data」だとFTP(ftp_user)からでもWordPress(www-data)からでもファイルの作成・編集が行えるようになる。

また、SGID設定しているので、今後新たにファイル・ディレクトリが作成されても所有グループは引き継ぐ。

Webサーバ・PHP・WordPress全部入りイメージ

Webサーバ・PHP・WordPress同梱公式イメージもある。私の場合、運用中WordPressとPHP&MySQLのプログラムを引っ越しする予定のためapache-phpイメージを使用しているが、そうじゃない場合は全部入りの方がよさそう。

ダミー記事

動作テストのためのダミー記事は「theme-test-data-ja」が便利。xmlファイルをダウンロードし「WordPressダッシュボード -> 左メニューのツール -> インポート -> WordPress」からインポートできる。

ログイン名・投稿者部分には触らず、「添付ファイルをダウンロードしてインポートする」にチェックを入れてインポートすること。

 

所感

Podmanコンテナ環境で色々構築、設定してきたがWordPressが正常に動作するのであれば自作のPHP&データベースもおおよそは動作する筈。

もう少し色々試してみて問題無ければ現在のLAMP環境からコンテナ環境へ移行してみたいところ。

 - WordPress サーバー CMS

  関連記事

Podmanで作成したApache用コンテナにLet's Encryptを導入しHTTPS接続できるようにする方法
Podmanで作成したApache用コンテナにLet's Encryptを導入しHTTPS接続できるようにする方法

先日Podmanで作成したApache用コンテナに対してドメインを割り当てたが、 ...

Podmanで導入したapache-phpに各種PHPモジュールを追加する方法
Podmanで導入したapache-phpに各種PHPモジュールを追加する方法

先日Podmanでapache-php8.4を導入したが、phpinfoで確認す ...

Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法
Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法

先日PodmanでWebサーバ用コンテナを作成したが、ブラウザからアクセスする際 ...

CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法
CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法

Cockpitにはcockpit-podmanというPodman(Dockerの ...

docker-compose.ymlでまとめてコンテナ作成・起動・ネットワーク接続する方法
docker-compose.ymlでまとめてコンテナ作成・起動・ネットワーク接続する方法

Podmanでコンテナを作成してネットワーク接続する際、Cockpit上やCUI ...