AzureのAppService on Linux上でPHPアプリの開発を行なっていた際に、PHPアプリ側で500エラーが起こると、404エラーになる現象に遭遇したので、その解決策を紹介します。
- 現象について
- 原因
- 解決策
- まとめ
1. 現象について
AppService on Linux上にPHPアプリをデプロイした際に、500系のエラーが起こると全て404エラーにリダイレクトされるという現象が起きました。
500系のエラーはローカルでは、500系のエラーとして処理されていましたが、AppService on Linux上だけでこの現象は確認できました。
2. 原因
ログを確認したところ、PHPアプリ上では、500系のエラーとして処理されていたので、AppService on LinuxのWebサーバであるNginxの設定を確認してみます。
/etc/nginx/nginx.conf
1 2 3 4 5 6 |
// ... 略 /etc/nginx/sites-enabled/*; // ... 略 |
/etc/nginx/sites-enabled/*の設定を読み込んでいるようだったので、確認してみます。
/etc/nginx/sites-enabled/default
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
server { #proxy_cache cache; #proxy_cache_valid 200 1s; listen 8080; listen [::]:8080; root /home/site/wwwroot; index index.php index.html index.htm; server_name example.com www.example.com; location / { index index.php index.html index.htm hostingstart.html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /html/; } // ... 略 } |
設定を確認すると、500系のエラーは/html/50x.htmlにリダイレクトされるように設定されていました。
しかし、リダイレクト先の/html/50x.htmlは存在せず、404エラーになっているようでした。
この設定ファイルを修正すれば解決しそうです。
3. 解決策
解決策としては、Nginxの設定で
- 500系のエラーが出た際のリダイレクト先に該当のHTMLを配置するか
- リダイレクト先を変更するか
になります。
今回は、こちらで作成した永続化されたプロジェクト内のHTMLにリダイレクトさせたいので、「リダイレクト先を変更する」で解決します。
ただ、AppServiceの特性上、デプロイなどで再起動すると、Nginxなどの設定が初期値に戻ってしまい、その都度設定しなおさないといけなくなります。
そこで、AppServiceのスタートアップコマンドを設定できる機能でNginxの設定を変更するようにし、対応します。
3-1. PHPアプリのプロジェクトにNginxの設定ファイルと50x.htmlを用意する
まずは500系エラーが発生した際の50x.htmlを用意し、PHPアプリのプロジェクト配下に配置してください。
そして、AppService上の/etc/nginx/sites-enabled/defaultをコピーし、プロジェクト配下にdefaultファイルを作成し貼り付け、リダイレクト先がPHPアプリ配下にあるHTMLになるように修正してください。
default
1 2 3 4 5 6 7 8 9 10 |
server { // ... 略 error_page 500 502 503 504 /50x.html; location = /50x.html { root /home/site/wwwroot/; } // ... 略 } |
3-2. スタートアップコマンドでシンボリックリンクを設定する
AzureのAppServiceのポータルのスタートアップコマンドに、プロジェクト配下にあるNginxの設定ファイル「default」を参照するシンボリックリンクを作成するコマンドを入力します。
1 |
ln -nfs /home/site/wwwroot/default /etc/nginx/sites-enabled/default; nginx -s reload |
これで再起動しても、500系のエラーが発生した際に404エラーにならずに指定したHTMLにリダイレクトされるようになります。
4. まとめ
なぜデフォルトの設定で500系のエラーのリダイレクト先にHTMLがないのかはわかりませんが、現状(2021/09/21時点)この方法で対応可能です。
少しでも参考になればと思います。