前回 Azure の App Service で WordPress を構築する方法について紹介しました。ざっくり動くものに仕上がっていましたが、一部今までの使い方だとうまく動かない部分があったので修正した内容をメモしておきます。
具体的には、WordPress のパーマリンクがうまく動かない部分がありました。今まではパーマリンクの設定を「投稿名」にしていましたが、その状態だと HTTP 404 エラーとなってしまいました。
原因と対策
PHP 8 になったことにより、App Service 内部でリバース プロキシーが Nginx に変更されているようです。Nginx になったことで、WordPress へパスを渡す際に正常にファイルを参照できておらず、 HTTP 404 エラーが発生していたようです。トップページとサイト内検索など、ルートにパラメーターを直渡しするようなページは正常に動いていたのでサイト内のルーティングが原因ではないかと思いました。
対策としては、起動時に Nginx の設定ファイルを上書き読み込みするようにしました。
ファイル システム ストレージの有効化
まずは読み込み元のファイルを保存しておくために、ローカル ストレージを永続化しておきます。WEBSITES_ENABLE_APP_SERVICE_STORAGE
を true
にしておくことで、 /home
ディレクトリ配下の内容を永続化することができます。このストレージは App Service プランに内包されているため、別途 Azure ファイル共有を作成する必要はありません。
これを有効にすることで、再起動した場合でも /home
ディレクトリ配下の内容を保持できます。
Nginx 設定ファイルの準備
起動時に読み込ませるための Nginx 設定ファイルを準備します。App Service に SSH 接続し、/home/default
として次の内容のファイルを保存します。
server {
listen 8080;
listen [::]:8080;
root /home/site/wwwroot;
index index.php index.html index.htm;
server_name example.com www.example.com;
absolute_redirect off;
location / {
try_files $uri $uri/ /index.php?$args;
index index.php index.html index.htm hostingstart.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /html/;
}
location ~ /\.git {
deny all;
access_log off;
log_not_found off;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param HTTP_PROXY "";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param QUERY_STRING $query_string;
fastcgi_intercept_errors on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 3600;
fastcgi_read_timeout 3600;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
}
具体的には location
配下に記述している try_files
の部分がパーマリンク動作に必要な項目です。
location / {
try_files $uri $uri/ /index.php?$args;
index index.php index.html index.htm hostingstart.html;
}
スタートアップ コマンドの設定
起動時に永続化した設定ファイルで、既定の設定を上書きしてから Nginx の設定を再読み込みするようにします。
Nginx の既定設定は /etc/nginx/sites-enabled
配下にある default
を読み込んでいるようでした。なので、このファイルを上書きするようにします。
App Service のスタートアップ コマンドで次のように設定し、設定ファイルの上書きと再読み込みを行います。
cp /home/default /etc/nginx/sites-enabled/default; service nginx restart
あとはこの内容で保存し、自動で再起動されるのを待ちます。
コメント