お名前ドットコムVPSへ移行への道11-WordPressのイメージ変更(fpm-alpine)

※ 当サイトではアフィリエイト広告を利用しています。リンクは広告リンクも含みます。

この記事は約20分で読めます。
広告

お名前.com VPS のDockerでWordPressを使っていてます。
メモリ使用量を減らしたくてプロセスを見るとapatch2のプロセスがたくさんある。
これは何か調べました。
最終的にはWordPressのイメージをfpm-alpineに変更しました。
あくまでも私は、こうやってみたということで動作やセキュリティの保証はできません。
まとまってないので完全に個人メモになってます。
環境
パソコン Windows11
VPS OS Ubuntu 20.04.3 LTS、 Dockerを使用

広告

メモリ使用量を見てみると

free
              total        used        free      shared  buff/cache   available
Mem:         987916      607268       76488       19984      304160      200276
Swap:       2097148     1064876     1032272

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem
PID    PPID CMD                         %MEM %CPU
 417704  417627 /home/user/.vscode-serve  7.0  0.4
 417850  417704 /home/user/.vscode-serve  6.9  0.2
   1618    1595 mysqld                       5.2  0.5
   1855    1700 apache2 -DFOREGROUND         4.2  0.0
   9319    1700 apache2 -DFOREGROUND         4.2  0.0
    930       1 /usr/bin/dockerd -H fd:// -  4.1  0.1
   1858    1700 apache2 -DFOREGROUND         4.0  0.0
   1853    1700 apache2 -DFOREGROUND         3.9  0.0
   1856    1700 apache2 -DFOREGROUND         3.9  0.0
   1854    1700 apache2 -DFOREGROUND         3.9  0.0
 212813    1700 apache2 -DFOREGROUND         3.8  0.0
    352       1 /lib/systemd/systemd-journa  3.7  0.0
略
   1700    1636 apache2 -DFOREGROUND         0.0  0.0

apache2 -DFOREGROUNDが8個動いていて使っているメモリ使用量は 
4.2+4.2+4.0+3.9+3.9+3.9+3.8+0=28%
607268×0.28=170035=170Mb使ってることになる
これを確認するため
systemctl status
を実行するとWordPressのコンテナが使ってる。
   CGroup: /
           ├─379 bpfilter_umh
           ├─docker
        ├─5c80*************WordPressのコンテナ******************** 
             │ │ ├─  1700 apache2 -DFOREGROUND
             │ │ ├─  1853 apache2 -DFOREGROUND
             │ │ ├─  1854 apache2 -DFOREGROUND
             │ │ ├─  1855 apache2 -DFOREGROUND
             │ │ ├─  1856 apache2 -DFOREGROUND
             │ │ ├─  1858 apache2 -DFOREGROUND
             │ │ ├─  9319 apache2 -DFOREGROUND
             │ │ └─212813 apache2 -DFOREGROUND

調べるとMPMという仕組みが関係してそう。
参考:http://www.momobro.com/rasbro/tips-rp-apache2-tuning-mpm-prefork/
参考:https://qiita.com/rryu/items/5e02ea60e36d7fd956b8

「Apache HTTP Server(httpd)では、マルチプロセスモジュール(MPM)が使用され、これによってクライアントからのリクエストを処理するためのサーバーの動作が制御されます。代表的なMPMには、mpm_event、mpm_worker、mpm_prefork があります。」(ChatGpt3.5談)
mpm_event、mpm_worker、mpm_preforkのうち、どれが採用されているか確認
コンテナの中に入って
apachectl -V
でApacheのビルド時の設定オプションを確認
Server version: Apache/2.4.57 (Debian)
略
Server MPM:     prefork
があったので設定値を確認
cat /etc/apache2/mods-available/mpm_prefork.conf
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxRequestWorkers: maximum number of server processes allowed to start
# MaxConnectionsPerChild: maximum number of requests a server process serves

StartServers            5
MinSpareServers         5
MaxSpareServers         10
MaxRequestWorkers       150
MaxConnectionsPerChild  0

この設定を変えてみる。
コンテナにテキストエディタ(vim、nano)がないのでexitで出て
vim /etc/apache2/mods-available/mpm_prefork.conf
StartServers            5→2
MinSpareServers         5→2
MaxSpareServers         10→4
sudo docker restart コンテナ名をしたが状況変わらず
コンテナの中に入ってmpm_prefork.confを確認するとデフォルトに戻っていた。
ymlを見たら/etc/apache2/mods-availableはバインドマウントされていなかった。
つまりホストのapatch2設定を変えてしまったので戻した。

ホスト側でmpm_prefork.confを新規作成して中身をコピーし修正し
コンテナにコピー。
sudo docker cp mpm_prefork.conf コンテナ名:/etc/apache2/mods-available/mpm_prefork.conf
コンテナ再起動
sudo docker restart コンテナ名
MaxSpareServersは2にしても4個できるので4にした。
結果
free
              total        used        free      shared  buff/cache   available
Mem:         987916      519320       78068       31864      390528      273836
Swap:       2097148     1109344      987804

systemctl status
           │ ├─5c80*************WordPressのコンテナ********************  
           │ │ ├─459606 apache2 -DFOREGROUND
           │ │ ├─459649 apache2 -DFOREGROUND
           │ │ ├─459650 apache2 -DFOREGROUND
           │ │ └─459824 apache2 -DFOREGROUND

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem 
    PID    PPID CMD                         %MEM %CPU
 459650  459606 apache2 -DFOREGROUND         7.1  0.2
 417704  417627 /home/user/.vscode-serve  6.2  0.2
   1618    1595 mysqld                       5.9  0.5
 443048  417704 /home/user/.vscode-serve  5.8  0.3
 459649  459606 apache2 -DFOREGROUND         5.8  0.2
 459824  459606 apache2 -DFOREGROUND         5.5  0.0
    930       1 /usr/bin/dockerd -H fd:// -  4.6  0.1
 417821  417704 /home/user/.vscode-serve  3.7  0.2
 459606  459581 apache2 -DFOREGROUND         3.6  0.0
    352       1 /lib/systemd/systemd-journa  2.8  0.0
7.1+5.8+5.5+3.6=22
519320×0.22=114250=114Mbやる前が170Mb。
あまり減らないし、5個になることもあった。
でも減ってはいるのでコントロールできることは分かった。
目次へ

WordPressのコンテナはapatch2だけでいいのか

WordPressを動かすためにはphpが必要だけど、
コンテナのプロセスをみるとphpはなくapatch2しかないのはなぜか調べた。

コンテナの中に入ってphpという言葉が記述されているファイルを抽出。

grep -r -i "php" /etc/apache2/
/etc/apache2/conf-available/docker-php.conf:<FilesMatch \.php$>
/etc/apache2/conf-available/docker-php.conf:  SetHandler application/x-httpd-php
/etc/apache2/conf-available/docker-php.conf:DirectoryIndex index.php index.html
/etc/apache2/sites-available/default-ssl.conf: <FilesMatch "\.(?:cgi|shtml|phtml|php)$">
/etc/apache2/mods-available/dir.conf:DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
/etc/apache2/mods-available/php.load:LoadModule php_module     /usr/lib/apache2/modules/libphp.so

状況におけるPHPの動作

提供された情報に基づくと、PHPは以下の方法で動かされています。

1. ApacheモジュールとしてのPHP

  • etc/apache2/mods-available/php.load ファイルは、php_module モジュールを /usr/lib/apache2/modules/libphp.so からロードするように指示しています。
  • これにより、PHPはApacheのモジュールとして動作し、.php 拡張子のファイルを処理できるようになります。

2. .php ファイルの処理

  • etc/apache2/conf-available/docker-php.conf ファイルは、.php ファイルに以下の設定を適用します。
    • SetHandler application/x-httpd-php: .php ファイルがリクエストされた場合、PHPモジュールが処理を担当することを指示します。
    • DirectoryIndex index.php index.html: デフォルトのインデックスファイルとして index.phpindex.html を設定します。
  • これらの設定により、.php ファイルがブラウザからリクエストされた場合、以下の処理が行われます。
    1. Apacheは.php ファイルをPHPモジュールに渡します。
    2. PHPモジュールはファイルを読み込み、PHPコードを実行します。
    3. 実行結果がHTML形式で生成されます。
    4. Apacheは生成されたHTMLをブラウザに送信します。

3. その他の関連設定

  • etc/apache2/sites-available/default-ssl.conf ファイルは、HTTPS接続でアクセスされた場合にも .php ファイルを処理するように設定しています。
  • etc/apache2/mods-available/dir.conf ファイルは、デフォルトのインデックスファイルとして index.php を含めています。

まとめ

上記の構成により、ApacheはPHPモジュールを介して.php ファイルを処理し、動的なWebページを提供することができます。

PHPはApacheのモジュールとして動作しているといことなのでさらに調べ、たどりついたのがここ。
こちら↓でいろいろ疑問に思っていたことの答えがありそう。あとでじっくり読ませてもらいます。
参考:https://zenn.dev/bs_kansai/articles/3706c12408160c
特にモジュール方式の説明を読むとapache2だけ起動してればよさそうです。
目次へ

WordPressのDocker image

WordPressのイメージってWordPressとphpのバージョンだけ気にすればいいと思っていたが
上のように調べるとapatch2やnginxとの組み合わせなどいろいろあるみたいです。
また一般的に軽量なalpineもあるのでimageを見直そうと思いました。
今までimage: wordpress:latestとしていたが、
wordpress – Official Image | Docker Hubを見るといろいろある。
タグの意味がよくわからなかったが多分latestっていうのは、
image: wordpress:の後ろの、この部分は以下の何を書いても同じものなんだろうなと思った。
以下はみんな同じDockerfileにリンクされている。

6.4.3-apache, 6.4-apache, 6-apache, apache, 6.4.3, 6.4, 6, latest, 6.4.3-php8.2-apache, 6.4-php8.2-apache, 6-php8.2-apache, php8.2-apache, 6.4.3-php8.2, 6.4-php8.2, 6-php8.2, php8.2

ということでWordPressとphpのバージョンがlatestと同じものでfpmでalpineの以下にしてみる。

6.4.3-fpm-alpine, 6.4-fpm-alpine, 6-fpm-alpine, fpm-alpine, 6.4.3-php8.2-fpm-alpine, 6.4-php8.2-fpm-alpine, 6-php8.2-fpm-alpine, php8.2-fpm-alpine

心配なのは、ただymlのimageを変えるだけで、yml内の他は変えなくていいのかです。
取り合えずimageだけ変えてやってみます。

sudo docker-compose up -d
これだけだとダメだった。内部エラー500発生。
再起不能になったのでWordPressとデータベースのコンテナとVolumeを削除
目次へ

fpm-alpine

ymlなどを変えないとダメなことが分かった。
こちら↓を参考に修正します。

docker×nginx×php-fpmでwordpress複数台を負荷分散させつつ動かしてみました。 - Qiita
特別Wordpressでブログを出しているような身ではないのですが、少し変わった環境を構築してみたいかもという興味本位でやってみました。Wordpressサイト運用でプラグイン入れたりバージョン上…
私の環境で修正するポイントは2点 ・Nginxのコンテナが新たに必要。前段のWAF付きのNginxを、ここのportにつなげる。 ・WordPressとNginxの接続は以下のバインドマウントされたディレクトリ  volumes: - ./html:/var/www/html docker-compose.yml Nginxのimageはnginx:1.25-alpine WordPressはimage: wordpress:fpm-alpine 追加したNginxはsharedネットワークに入れて80番とつなげるため expose: - "80" wp_first:1個だけ使う。 追加したNginxのconfは参考サイトと同じもの(wp_first:1個だけ使う) sudo docker-compose up -d
version: "3.9"

services:
  nginx:
    image: nginx:1.25-alpine
    expose:
      - "80"
    volumes:
      - ./.docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./html:/var/www/html
    depends_on:
      - wp_first

  wp_first:
    image: wordpress:fpm-alpine
    volumes:
      - ./html:/var/www/html
    depends_on:
      - db
    restart: always
    environment:
     WORDPRESS_DB_HOST: db:3306
     WORDPRESS_DB_USER: ${DB_USER}
     WORDPRESS_DB_PASSWORD: ${DB_PASSWD}
     WORDPRESS_DB_NAME: ${DB_NAME}

  db:
    image: mysql:latest
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
     MYSQL_ROOT_PASSWORD: ${DB_ROOT}
     MYSQL_DATABASE: ${DB_NAME}
     MYSQL_USER: ${DB_USER}
     MYSQL_PASSWORD: ${DB_PASSWD}
volumes:
    db_data:
networks:
  default:
      name: shared
      external: true

結果

free
              total        used        free      shared  buff/cache   available
Mem:         987916      544908      107000       26060      336008      254084
Swap:       2097148     1060116     1037032

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem
    PID    PPID CMD                         %MEM %CPU
 720698  720673 mysqld                      13.9  0.7
 707742  707664 /home/user/.vscode-serve  5.2  0.5
    930       1 /usr/bin/dockerd -H fd:// -  3.7  0.1
 707838  707742 /home/user/.vscode-serve  3.5  0.2
 722805  722628 nginx: worker process        3.3  0.0
 722806  722628 nginx: worker process        3.3  0.0
 721165  720785 php-fpm: pool www            3.3  0.0
    352       1 /lib/systemd/systemd-journa  3.2  0.0
 721164  720785 php-fpm: pool www            3.2  0.0
 722628  722606 nginx: master process nginx  3.0  0.0
 712614  707742 /home/user/.vscode-serve  2.9  0.2
    590       1 /sbin/multipathd -d -s       1.8  0.0
    784       1 /usr/bin/containerd          1.6  0.0
 712620  707742 /home/user/.vscode-serve  1.2  0.0
    752       1 /usr/lib/snapd/snapd         0.8  0.0
    747       1 /usr/bin/python3 /usr/bin/n  0.8  0.0
      1       0 /sbin/init                   0.8  0.0
多分赤字が前のapatch2がやっていたプロセスの代わりになる部分だと思います。
軽くなったような気はしますが劇的に減っているわけでもないです。
これでしばらく使ってみます。
その後cocoonのテーマをいれるときに気づいたこと

テーマをアップロードなど容量の大きいファイルをアップロードするときは
今回Nginxは2つになるのでWordPressのほうのNginxも
client_max_body_size 任意のサイズ(例32)m;
を追加してサイズを広げないとエラーになります。
詳細は↓

.htaccessは使えない

.htaccessはapatch用なのでNginxでは関係ないようです。
.htaccessでアクセス制限したつもりでいたら、ログを見るとアクセスされていたので気づきました。
ということでwafの入っているほうのNginxではじくようにした。
念のため最初から作り直した。(ログ見たら100回ぐらいアッタックしてきたのがあったので)
WordPress関連のコンテナ3つとボリュームを削除して

suでrootユーザになって
ホストにバインドしてあるhtmlディレクトリを削除
rm -r html
sudo docker-compose up -d
Nginxのconfで追加したコード
# /wp-admin へのアクセスを許可
    location /wp-admin {
        allow ***.***.***.***;
        deny all;
        proxy_pass http://WordPressのNginxのコンテナ;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $remote_addr;
        modsecurity_rules '
            SecRule REMOTE_ADDR "@ipMatch ***.***.***.***" "phase:1,id:777,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
        ';
    }

上と同じコードで/wp-adminを
それぞれ/wp-login.php 、/wp-cron.php、/wp-json に変えて合計4つ作った。
これは自分のIPだけ通すようにした。

こちらは自分も含めアクセス不可にした。
    location ~ /(xmlrpc\.php|wp-config\.php|wlwmanifest\.xml|license\.txt|readme\.html|wp-config-sample\.php) {
        deny all;
        return 403;
    }

Nginxのlocationの設定は書き方が難しいのであっているか分からないです。
4つにわかれているのも1つにしようとしたけどあきらめました。
目次へ

所感

メモリ使用量も減った感じはする。freeで見て700M超えることが少なくなった。
またWordPressの表示動作も管理画面の動作も速いような気がする。
PageSpeed Insightsで見るとそうでもないのだが。
レンタルサーバーのブログをそろそろ移行するので
移行してみて、このまま使うか判断したい。
イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)
目次へ

コメント

タイトルとURLをコピーしました