お名前.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.php
とindex.html
を設定します。
- これらの設定により、
.php
ファイルがブラウザからリクエストされた場合、以下の処理が行われます。- Apacheは
.php
ファイルをPHPモジュールに渡します。 - PHPモジュールはファイルを読み込み、PHPコードを実行します。
- 実行結果がHTML形式で生成されます。
- Apacheは生成されたHTMLをブラウザに送信します。
- Apacheは
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で見るとそうでもないのだが。
レンタルサーバーのブログをそろそろ移行するので
移行してみて、このまま使うか判断したい。
(2024/4/15移行完了)
イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)
目次へ
コメント