Azure AppServiceの「WordPress On App Service」のスタートアップコマンドの作成方法
2024-03-17
こんにちは、0371です。
今回は、Azure AppServiceの「WordPress On App Service」のスタートアップコマンドの作成方法について説明します。
結論
2024年03月17日時点では、SSHした後の「/home/dev/startup.sh」に記載しないとスタートアップコマンドが機能しません。 ですので、GUI上で設定するのではなく、 「/home/dev/startup.sh」に処理を記述しましょう。
ソース
MSの日本語公式ドキュメントにはありませんが、AppServiceで使用されるコンテナのリポジトリにあるマークダウンファイルに記載があります。
How to run Bash scripts in WordPress on Linux App Services
概要
スタートアップコマンドとは、コンテナの起動時にユーザが実行したいコマンドを処理してくれる機能です。
代表的なものとしては、コンテナ起動時に設定ファイルを所定の位置にコピーするなどになります。
どうしてスタートアップコマンドで設定ファイルをコピーするの?
/home/直下以外のストレージ領域は、コンテナ起動時に初期化されてしまうためです。
/home/ は、永続ストレージとして、AppServiceのコンテナに紐ついています。
そのため、/etc/nginx/nginx.conf などの/home/ではないディレクトリのファイルを変更して保存しても、再起動するたびに初期化されてしまいます。
なので、コンテナ起動時にスタートアップコマンドを使用することで、設定の初期化が行われないようにしています。
処理順としては、コンテナ起動(初期化)→ スタートアップコマンド → コンテナ起動完了 のイメージです。
(間違えていたらすみません。)
使用方法
コンテナ内のnginxや、php-fpmの設定を変更したい場合に使用します。
下記のような想定で、実際に変更してみます。
- nginxのFastCGIキャッシュを有効にしたい
以下の順番に実施します。
- 設定ファイルのコピー、編集
- スタートアップコマンドの作成
- AppService(コンテナ)の再起動
- 確認
まずは、設定ファイルのコピー、編集です。
Azure PortalのAppServiceから、SSHでコンテナにアクセスしてください。
その後、下記のコマンドを実行します。
# ディレクトリの作成
$ mkdir /home/site/nginx/
$ cd /home/site/nginx/
# 編集する設定ファイルを/home/site/nginx/にコピーする
$ cp -p /etc/nginx/conf.d/default.conf /home/site/nginx/
# sedコマンドで、FastCGIキャッシュを有効化する記述に変更する
$ sed -i.org-$(date +"%Y%m%d") 's/fastcgi_cache off;/fastcgi_cache WORDPRESS;/g' /home/site/nginx/default.conf
# 正しく変更できたか確認する
$ cat /home/site/nginx/default.conf | grep "fastcgi_cache WORDPRESS"
これで、FastCGIキャッシュの有効化が終わりました。
次に、スタートアップコマンドの作成です。
以下のコマンドで作成します。
# スタートアップコマンドの編集
vi /home/dev/startup.sh
#!/bin/bash
# Enable FastCGI cache
cp -p /home/site/nginx/default.conf /etc/nginx/conf.d/default.conf
# nginx reload
nginx -s reload
これで、スタートアップコマンドが作成されました。
永続ストレージである/home/内に存在する「default.conf」を、所定の位置にコピーしています。
その後、nginxをリロードすることで、設定を反映しています。
ちなみに、コンテナは「busybox」を使用しているのと、シェルが「bash」ではなく「ash」のため、serviceコマンド や systemctlコマンドが入っていません。
通常のLinuxコンテナとは違うことに注意してください。
次にコンテナの再起動です。
GUI上から、対象のAppServiceの「Webアプリ」を再起動してください。
2~3分すると、SSHがリフレッシュされて別のコンテナのIDが表示されるはずです。
最後に、確認です。
まずは、下記のコマンドでコピーが無事にできているかを確認します。
cat /etc/nginx/conf.d/default.conf | grep "fastcgi_cache WORDPRESS"
次に、WordPressのホームページにアクセスし、デベロッパーツールで「ネットワーク」→「ヘッダー」にアクセスしてください。
画面上部にある「キャッシュを無効化」をONにし、スーパーリロードを実行してください。
一回目は、レスポンスヘッダー内にFastcgi-Cache:が存在し、MISSとなっていることを確認できます。
MISSは、キャッシュがない場合に出力されるため、もう一度リロードしましょう。
二回目は、レスポンスヘッダー内にFastcgi-Cache:が存在し、HITとなっていることを確認できます。
次に、WordPress管理画面で、上記と同じことをします。
レスポンスヘッダー内にFastcgi-Cache:が存在し、BYPASSとなっていることを確認したら、成功です。
BYPASSは、キャッシュしないという意味です。
WordPress管理画面でキャッシュをしてしまうと、
- 最新情報の表示遅延
- セキュリティリスク
- 管理画面の機能制限
- デバッグの複雑化
などが発生するため、デフォルトでキャッシュしないような設定になっています。
キャッシュの除外設定に関しては、「default.conf」の「$skip_cache」が書かれている部分で変更が可能です。
下記は、該当部分の例です。
# Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html
sendfile off;
set $skip_cache 0;
# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
# Don't cache uris containing the following segments
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
# Don't cache WooCommerce URLs
# Cart widgets are still a problem: https://github.com/emcniece/docker-wordpress/issues/3
if ($request_uri ~* "/(cart|checkout|my-account)/*$") {
set $skip_cache 1;
}
この記述では、以下の内容で定義されています。
- sendfile off;:sendfileを無効にします。これはVirtualBoxとの相性問題を回避するために行われることがあります。
- $skip_cache 変数の初期値を 0 に設定します。
- POSTリクエストやクエリ文字列を持つURLに対してはキャッシュをスキップします。
- 特定のURIパターン(例: /wp-admin/, /xmlrpc.php, wp-.*.php, /feed/, index.php, sitemap(_index)?.xml)にマッチするリクエストはキャッシュをスキップします。
- 特定のCookieパターン(例: comment_author, wordpress_[a-f0-9]+, wp-postpass, wordpress_no_cache, wordpress_logged_in)を持つリクエストはキャッシュをスキップします。
- WooCommerce(決済系プラグイン)の特定のURLパターン(例: /cart/, /checkout/, /my-account/)にマッチするリクエストはキャッシュをスキップします。
参考にしてみてください。
今日の一言
Azureの日本語公式ドキュメントにもスタートアップコマンドのことを反映してほしい...