このブログはAWSのLightsail上で動作していますが、構築してから2年経ったためイメージの更新を行うことにしました。2年も経つとイメージの中身も結構変わっていたので、備忘含めて記載します。
以前の記事はこちら:
bitnamiイメージは、イメージごと更新することを推奨
Lightsailでは、あらかじめWordPressがインストールされたイメージが用意されており、それを利用するのが簡単です。このイメージを提供しているのはbitnamiです。様々なアプリケーションがインストールされたイメージが配布されており、WordPressはその一つです。
ubuntuなどは、OSそのものを再インストールすることなく、利用しているパッケージをを丸ごとアップデートして最新バージョン同等に更新できたりしますが、bitnamiの場合はイメージを更新せずに中身だけ最新版にするということができません(中身はdebianなのでバックポートはできるかもしれませんが)。そのため、ある程度利用したら “式年遷宮” よろしくイメージを更新し、データを移行する必要があります。
動いていればいいじゃないかという意見もあるかもしれませんが、古いイメージには様々な脆弱性が潜んでいる可能性もありますし、新しいイメージの方がランタイムが更新されてパフォーマンスにも期待が持てるかもしれませんので、更新した方が良いでしょう。
2年間でのイメージの主な変更点
2年前のWordPressイメージからどの程度変化があったか、ざっと書き出してみます。
パッケージの変化
まずは、イメージ内で使われている各種パッケージです。WordPressのバージョン自体も変わっていますが、WordPress自体はイメージ固定でもバージョンアップができますので、ここでは言及しません。
イメージのバージョン
- 2年前にインストールしたもの:Bitnami WordPress 5.6.1-1
- 今回インストールしたもの:WordPress packaged by Bitnami 6.2.0-14
主なパッケージのバージョン
5.6.1-1 | 6.2.0-14 | |
---|---|---|
Linux kernel | 4.19.0-23-cloud-amd64 | 5.10.0-21-cloud-amd64 |
Apache | 2.4.46 | 2.4.57 |
PHP | 7.4.15 | 8.1.18 |
MySQL | 8.0.23 | |
MariaDB | 10.11.2 | |
(参考)Debian version | 10.13 (buster) | 11.7(bullseye) |
MySQLからMariaDBの利用に変更になっているという違いもありますが、バージョンという意味ではLinux kernelとPHPが大きく変わっています。Linux kernelは新しいプロセッサへの最適化などが進んでいるようですし、PHPに関してはメジャーバージョンアップでパフォーマンスも向上しているようです。
なお、bitnamiがChangelogを提供しているので、正確な情報はこちらをご確認ください。
ディレクトリ構成の変化
いくつかディレクトリ構成に変化がありました。
/bitnamiディレクトリの新設
今までは/opt/bitnami配下に全てのファイルが保管されていましたが、ユーザ作成のコンテンツ関係が/bitnami配下に移動されました。/opt/bitnami以下からはシンボリックリンクが貼られています。具体的には、
/bitnami$ tree -L 2 -F
.
├── mariadb/
│ └── data/
├── phpmyadmin/
└── wordpress/
├── wp-config.php
└── wp-content/
このようになっており、DB全般とWordPressの設定ファイル・画像等コンテンツディレクトリが切り出されています。バックアップを取ったりするのに便利だと思います。
/opt/bitnami/apps ディレクトリの(デフォルト)削除
/opt/bitnami/apps以下にwordpressなどのディレクトリがありましたが、/opt/bitnami直下に置かれるようになりました。
before
/opt/bitnami$ tree -L 2 -F -d
.
├── apache2
(snip.)
├── apps
│ ├── bitnami
│ ├── phpmyadmin
│ └── wordpress
(snip.)
├── mysql
│ ├── bin
│ ├── bitnami
│ ├── data
│ ├── include
│ ├── lib
│ ├── scripts
│ ├── share
│ ├── support-files
│ └── tmp
(snip.)
after
/opt/bitnami$ tree -L 2 -F -d
.
├── apache
(snip.)
├── apache2 -> apache
├── apps
│ └── letsencrypt
(snip.)
├── mariadb
│ ├── bin
│ ├── conf
│ ├── data -> /bitnami/mariadb/data
│ ├── include
│ ├── lib
│ ├── licenses
│ ├── logs
│ ├── plugin
│ ├── sbin
│ ├── share
│ └── tmp
(snip.)
├── phpmyadmin
(snip.)
├── wordpress
│ ├── licenses
│ ├── tmp
│ ├── wp-admin
│ ├── wp-content -> /bitnami/wordpress/wp-content
│ └── wp-includes
└── wp-cli
├── bin
├── conf
└── licenses
/opt/bitnami/apps以下にletsencryptディレクトリがありますが、これはSSL証明書を自動更新するスクリプトを走らせた際にその設定ファイルが保存されています。
Apache設定ファイル群の変化
/opt/bitnami/apache2/conf以下にある設定ファイルが結構変わっています。
before
/opt/bitnami/apache2/conf$ tree -P "*.conf"
.
├── bitnami
│ ├── bitnami-apps-prefix.conf
│ ├── bitnami-apps-vhosts.conf
│ ├── bitnami.conf
│ ├── httpd-2xlarge.conf
│ ├── httpd.conf -> /opt/bitnami/apache2/conf/bitnami/httpd-micro.conf
│ ├── httpd-large.conf
│ ├── httpd-medium.conf
│ ├── httpd-micro.conf
│ ├── httpd-small.conf
│ └── httpd-xlarge.conf
├── brotli.conf
├── deflate.conf
├── extra
│ ├── httpd-autoindex.conf
│ ├── httpd-dav.conf
│ ├── httpd-default.conf
│ ├── httpd-info.conf
│ ├── httpd-languages.conf
│ ├── httpd-manual.conf
│ ├── httpd-mpm.conf
│ ├── httpd-multilang-errordoc.conf
│ ├── httpd-ssl.conf
│ ├── httpd-userdir.conf
│ ├── httpd-vhosts.conf
│ └── proxy-html.conf
├── httpd.conf
├── modsecurity.conf
├── original
│ ├── extra
│ │ ├── httpd-autoindex.conf
│ │ ├── httpd-dav.conf
│ │ ├── httpd-default.conf
│ │ ├── httpd-info.conf
│ │ ├── httpd-languages.conf
│ │ ├── httpd-manual.conf
│ │ ├── httpd-mpm.conf
│ │ ├── httpd-multilang-errordoc.conf
│ │ ├── httpd-ssl.conf
│ │ ├── httpd-userdir.conf
│ │ ├── httpd-vhosts.conf
│ │ └── proxy-html.conf
│ └── httpd.conf
├── pagespeed.conf
├── pagespeed_libraries.conf
├── php-fpm-apache.conf
└── ssi.conf
/opt/bitnami/apps/wordpress/conf$ tree -P "*.conf"
.
├── banner.conf
├── certs
├── htaccess.conf
├── httpd-app.conf
├── httpd-prefix.conf
├── httpd-vhosts.conf
└── php-fpm
├── php-settings.conf
└── pool.conf
after
/opt/bitnami/apache2/conf$ tree -P "*.conf"
.
├── bitnami
│ ├── bitnami.conf
│ ├── bitnami-ssl.conf
│ ├── certs
│ ├── httpd.conf -> memory/httpd-micro.conf
│ ├── memory
│ │ ├── httpd-2xlarge.conf
│ │ ├── httpd-large.conf
│ │ ├── httpd-medium.conf
│ │ ├── httpd-micro.conf
│ │ ├── httpd-small.conf
│ │ └── httpd-xlarge.conf
│ ├── php-fpm.conf
│ └── phpmyadmin.conf
├── deflate.conf
├── extra
│ ├── httpd-autoindex.conf
│ ├── httpd-dav.conf
│ ├── httpd-default.conf
│ ├── httpd-info.conf
│ ├── httpd-languages.conf
│ ├── httpd-manual.conf
│ ├── httpd-mpm.conf
│ ├── httpd-multilang-errordoc.conf
│ ├── httpd-ssl.conf
│ ├── httpd-userdir.conf
│ ├── httpd-vhosts.conf
│ └── proxy-html.conf
├── httpd.conf
├── modsecurity.conf
├── original
│ ├── extra
│ │ ├── httpd-autoindex.conf
│ │ ├── httpd-dav.conf
│ │ ├── httpd-default.conf
│ │ ├── httpd-info.conf
│ │ ├── httpd-languages.conf
│ │ ├── httpd-manual.conf
│ │ ├── httpd-mpm.conf
│ │ ├── httpd-multilang-errordoc.conf
│ │ ├── httpd-ssl.conf
│ │ ├── httpd-userdir.conf
│ │ ├── httpd-vhosts.conf
│ │ └── proxy-html.conf
│ └── httpd.conf
└── vhosts
├── 00_status-vhost.conf
├── htaccess
│ └── wordpress-htaccess.conf
├── wordpress-https-vhost.conf
└── wordpress-vhost.conf
といった感じになっています。WordPressの設定ファイルもapache配下に置かれるようになったのが大きな違いでしょうか。
全体的に、見るべき設定ファイルが浅い階層に置かれるように整理されたので、以前よりも見通しは良くなった…気がします。
デフォルト設定の変化
設定を行っていて気づいたのですが、Apacheの初期設定にいくつか違いがありました。もしかしたら気づいていないだけで他にもあるかもしれません。
mod_pagespeedが無効になっている
最近はメンテナンスモードになっているようにも見えるmod_pagespeedですが、無効化されていました。こいつが悪さをすることも結構あるので、サポートの大変さという意味でもデフォルト無効で良いのではないかと思います。
今回CloudFrontによるCDNも利用することにしたので、mod_pagespeedを改めて有効化することはしませんでした。
mod_http2が有効になっている
デフォルトでmod_http2モジュールを読み込むようになっていました。オフィシャルドキュメントではデフォルトでは有効になっていない旨記載がありますが…。
ただ、いずれにせよApacheのVirtualHost設定では有効化されていないため、設定ファイルをいじって有効にする必要があります。
bitnamiバナー表示がなくなった
誰がbitnamiのバナーを表示したまま使うんだ、と自分の中で不評だった「バナー無効化手続き」ですが、デフォルトで表示されなくなっていました。
WordPressのプラグインが最初から色々入るようになった
有効化はされていませんが、いくつかのプラグインが最初から同梱されていました。使いたいものは自分で入れるというポリシーの人も多いと思いますが、WordPressのプラグインは玉石混交でもあるので、ある程度実績があるもの(と信じたい)があらかじめ入っているのは初心者にとっては悪くないかもしれません。
デフォルト設定からの変更
いくつか、自身のブログをホストするにあたって行った設定を備忘兼ねて記載します。次回の移行時に役立てます…。
追加パッケージのインストール
sudo apt install lynx htop webp
- lynxは、apachectlを動かそうとするとこれが必要というので…。
- htopは、topよりも慣れているので
- webpは、コマンドラインで画像をwebpに変換するcwebpコマンドを使いたかったため
Apacheの読み込みモジュールとしてmod_expiresを追加
キャッシュ期限をコントロールするmod_expiresが最初は無効になっているので、
/opt/bitnami/apache/conf/httpd.conf ファイルのコメントアウトをはずします。
MaxConnectionsPerChildの調整
/opt/bitnami/apache/conf/bitnami/httpd.confはデフォルトではmemory/httpd-micro.confへのリンクになっています。これは、あまり大きくないインスタンスでの実行を念頭に置いた設定になっています。
普通に使っている分にはこれで良いのかもしれませんが、Lightsailの小さなインスタンスでWordPressを長時間動かしていると、httpdスレッドがどんどん増えてしまいメモリが枯渇する事態が発生しました。そこで、以下のようにMaxConnectionsPerChildの値をググッと小さくしています。
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 5
MaxConnectionsPerChild 1000
# MaxConnectionsPerChild 5000
KeepAliveTimeout 1
</IfModule>
<IfModule mpm_event_module>
ServerLimit 4
StartServers 2
MinSpareThreads 128
MaxSpareThreads 192
ThreadsPerChild 64
MaxRequestWorkers 256
MaxConnectionsPerChild 1000
# MaxConnectionsPerChild 5000
KeepAliveTimeout 2
</IfModule>
<IfModule mod_passenger.c>
PassengerMinInstances 1
# PassengerMaxInstancesPerApp 1
PassengerMaxPoolSize 3
</IfModule>
ちなみに、デフォルトではmpm_event_moduleがロードされていますので、上段は本来は不要です。
php.iniの調整
/opt/bitnami/php/etc/php.ini の値を調整します。
upload_max_filesize = 200M
post_max_size = 200M
bitnamiのイメージでは、PHPはApacheモジュールではなくphp-fpmで動いているため、Apache側で調整するのではなく、PHP側で調整することになります。
iniファイルを別に用意する(user.ini)方法もあるようですが、このインスタンスはWordPress専用なのでphp.iniを直接いじってしまいました。user.iniの場合は5分ごとに読み込まれるようなのでphp-fpmを再起動する必要がないのですが、php.iniをいじった場合には再起動が必要です。
sudo /opt/bitnami/ctlscript.sh restart php-fpm
PHP-FPMの調整
しばらく動作させていたら、php-fpmのログ(/opt/bitnami/php/logs/php-fpm.log)がwarningを吐いていました。
[05-May-2023 18:04:16] WARNING: [pool www] server reached pm.max_children setting (15), consider raising it
[05-May-2023 18:06:00] WARNING: [pool www] server reached pm.max_children setting (15), consider raising it
[05-May-2023 18:08:12] WARNING: [pool www] server reached pm.max_children setting (15), consider raising it
[05-May-2023 18:10:27] WARNING: [pool www] server reached pm.max_children setting (15), consider raising it
[05-May-2023 18:12:17] WARNING: [pool www] server reached pm.max_children setting (15), consider raising it
[05-May-2023 18:20:27] WARNING: [pool www] server reached pm.max_children setting (15), consider raising it
[05-May-2023 18:20:41] WARNING: [pool www] server reached pm.max_children setting (15), consider raising it
その後は(CDNを入れたから?)エラーが出ていないのですが、あまり気分の良いものでもないので、いったん倍にしてみました。いじるファイルは/opt/bitnami/php/etc/memory.conf です。
; Bitnami memory configuration for PHP-FPM
;
; Note: This will be modified on server size changes
;pm.max_children=15
pm.max_children=30
pm.start_servers=10
pm.min_spare_servers=10
pm.max_spare_servers=10
pm.max_requests=5000
htaccessの設定
以前の記事でも指摘した通り、bitnamiのイメージでは.htaccessがデフォルトでは利用できないようになっています。
.htaccessを利用できるようにしても良いのですが、行儀の悪いWordPressプラグインがやらかす可能性もありますので、bitnamiの意向通り、静的に設定することにします。
htaccess関係は
/opt/bitnami/apache/conf/vhosts/htaccess/wordpress-htaccess.conf
に記載することが期待されています。
ここに追記するのは、自分の場合は主に以下です。
- EWWW Image Optimizerに関するwebpファイルrewrite設定
- ブラウザキャッシュに関する設定
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css A31536000
ExpiresByType application/x-javascript A31536000
ExpiresByType application/javascript A31536000
ExpiresByType text/javascript A31536000
ExpiresByType image/jpeg A31536000
ExpiresByType image/webp A31536000
(snip.)
</IfModule>
こんなやつです。
HTTP/2の利用
せっかくmod_http2がロードされているので、利用できるようにします。
/opt/bitnami/apache/conf/vhosts/wordpress-https-vhost.conf の<VirtualHost 127.0.0.1:443 _default_:443>内に、
Protocols h2 h2c http/1.1
H2Direct on
を追加すればHTTP/2での通信が始まります。
Let’s Encryptの設定
/opt/bitnami/bncert-tool を立ち上げて対話形式で実行します。
入力したドメイン名が名前解決できなかったり、動作しているインスタンスのIPと異なる場合には先に進めないので、あらかじめDNSで設定しておく必要があります。AAAAレコード(IPv6)が設定されているとうまくいかなかったので、一旦外しておく必要があり、地味に面倒でした。
wp-config.phpの修正
下記の移行ではwp-config.phpは対象外のようなので、必要に応じて修正します。必須なのは
- WP_HOME
- WP_SITEURL
あたりでしょうか。
WordPressデータの移行
…まぁこのあたりはいろんなところに記事がありますので、そちらを参考にやっていただければ…。
自分は今回はAll-in-One WP Migrationを以下の設定で利用しました。
- wp-content以下の画像データは手作業で移行
- プラグインも手作業で再インストール
プラグイン自体をAll-in-One WP Migrationを使って移行しなくても、設定自体は残っているようで正しく反映されました。以下の順序で移行したのが良かったのかもしれません。
- プラグインをインストール
- wp-content以下の画像データを移行
- 移行後にアクセス権・所有者などのチェックを行う必要がある(daemonグループに書き込み権限を与える)
- All-in-One WP Migrationにて過去データのインポート
データ移行時のトラブル
データ移行して困ったことは、一部のファイルのURLがFQDN表記(https://blog.hiroaki.jp/…)ではなくIPアドレス表記(http://12.34.56.78/…)になってしまったことです。データ移行前にwp-config.phpを修正する必要があったのかもしれません。
元々のサイトを活かしつつ、HTTPの状態で設定していたからだと思いますが、あるあるだと思いますので、どう対処したかだけ記載します。
影響箇所
- 埋め込みURL(他のブログ記事へのリンク)
- 画像URL
- blogテーマ(自分の場合はCocoon)内の画像ファイル(背景とか)へのリンク
- blogテーマ内のメニューでの「ホーム」リンク
対処方法
記事内のデータに関しては、Search Regexプラグインで一括置換しました。
それ以外(blogテーマ関連)は、気づいたら直すという対症療法でしたが、そこまで数は多くありませんでした。ブラウザのデベロッパーツールで怪しいアクセスを見つければOKです。
まとめ
2年ぶりにWordPressイメージを更新しました。
面倒ではありますが、一方で動作確認されたイメージを利用した方が個々にパッケージをアップデートするよりもトラブルは少ないかもしれません。ファイル構成なども改善されていたので、古いものを使い続けるよりも結局は「急がば回れ」になるかもしれません。
今回はこの式年遷宮に加え、CloudFrontによるCDNも導入しましたので、別記事にて手順を紹介しようと思います。
コメント