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の設定を変更したい場合に使用します。
下記のような想定で、実際に変更してみます。

以下の順番に実施します。

まずは、設定ファイルのコピー、編集です。
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;
        }

この記述では、以下の内容で定義されています。

参考にしてみてください。

今日の一言

Azureの日本語公式ドキュメントにもスタートアップコマンドのことを反映してほしい...