Azure App ServiceのLinux版を使っていて、AzureポータルやCLI、PowerShellなどではできない細かい設定を変更したいと思ったことはないだろうか? 実はApp Service on Linux内蔵のNGINXの設定ファイルを書き換えることで対応できる場合がある。その方法と注意点を解説する。
対象:Azure App Service on Linux(NGINX内蔵)
Azureの「App Service」は自動的にパフォーマンスをスケールできるとともに、割と細かい設定も可能なWeb/アプリケーションサーバのサービスである。
とはいえ、GUI(Azureポータル)やAzure CLI、Azure PowerShellなどで変更できる設定範囲にも限界がある。特にレンタルサーバなどの既存サイトを移す際には、BASIC認証やGZIP圧縮などといった設定を変えたくなることがあるだろう。
そのような場合、App Serviceの内蔵Webサーバの設定ファイルを直接書き換えることで対応できることがある。本Tech TIPSでは、その基本的な手順と注意点を説明する。
対象は、App Service on Linux内蔵のNGINXとする。App Service on WindowsのIISや、古いApp Service on LinuxのApacheについては対象外とさせていただく。また以下では、NGINXの設定ファイルやシェルスクリプト、シンボリックリンクについて、ある程度知っていることを前提としている。
App ServiceのランタイムスタックはPHP 8.3としている。その他のスタックではスタートアップスクリプト(後述)の名称や内容が異なる、といった違いがあるので注意していただきたい。
BASIC認証などの具体的な実装については、別の記事で解説する予定だ。
App ServiceのNGINXの設定ファイルは、[/etc/nginx/]ディレクトリに格納されている。設定を書き換えるなら、次の3つのファイルのいずれかが対象となることが多い。
ここでは[/etc/nginx/sites-available/default]ファイルを書き換える前提で説明しよう。
まず、Tech TIPS「【Azure】App Service on LinuxにSSHで接続する方法と注意点(WebSSH編)」を参考にして、App ServiceにSSHで接続する。次に、以下のコマンドラインを実行して、[/home]ディレクトリ以下にデフォルトの設定ファイルをコピーする。以下に例示している[custom]ディレクトリは別の名前でもよい。
mkdir -p /home/custom/etc/nginx/sites-available
cp -pv /etc/nginx/sites-available/default /home/custom/etc/nginx/sites-available/
わざわざ[/home]ディレクトリ以下にコピーしているのは、App Serviceが再起動(コンテナが再デプロイ)されると、[/etc]ディレクトリなど[/home]ディレクトリ以外のファイルは初期化されて元に戻ってしまうためだ。そのため、書き換えたまま永続的に維持したいファイルは、[/home]ディレクトリ以下に配置する必要がある。
筆者は、書き換えたい(差し替えたい)設定ファイルがあるディレクトリの構造を、[/home/custom/]というディレクトリ以下にそのまま複製している。例えば[/etc/nginx/]は[/home/custom/etc/nginx/]という具合だ。
デフォルトの設定ファイルをコピーしたら、それをテキストエディタなどで書き換える。FTPなどでダウンロードしてローカルPCで編集してもよいし、上記のSSHの画面からコピーしてデプロイ用リポジトリ内のファイルにペーストしてもよい(もちろん編集後に[/home]ディレクトリ以下に書き戻すかデプロイすること)。
参考までに、執筆時点のデフォルトのサイト設定ファイルを以下に記す。
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;
port_in_redirect off;
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/;
}
# Disable .git directory
location ~ /\.git {
deny all;
access_log off;
log_not_found off;
}
# Add locations of phpmyadmin here.
location ~* [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.[Pp][Hh][Pp])(|/.*)$;
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;
}
}
設定ファイルの編集を完了したら、元の設定ファイルへシンボリックリンクを張る。
ln -snf /home/custom/etc/nginx/sites-available/default /etc/nginx/sites-available/default
ここで、書き換えた設定ファイルが正しいかどうかNGINXに検証させよう。
nginx -t
正常なら後述の画面のようなメッセージが出力されるはずだ。間違いがあれば、エラーメッセージが表示されるので設定ファイルを修正すること。
検証に成功したら、NGINXに設定ファイルの再読み込みを実行させよう。
nginx -s reload
ここでApp Serviceの再起動をしてはいけない。シンボリックリンクがなくなり、元の設定ファイルに戻されてしまうからだ。
上記画面でエラーが表示されなかったら、設定ファイルを書き換えた効果が表れているかどうかを確認する。
動作確認が済んだら、前述のシンボリックリンク作成のコマンドラインを「スタートアップスクリプト」に組み込んで、NGINXの設定ファイルを永続的に差し替える。スタートアップスクリプトはApp Serviceの起動時(コンテナのデプロイ直後)に実行されるシェルスクリプトである。
まず、スタートアップスクリプトのデフォルトのパスを、以下の画面のように調べて確認する。
az webapp config show -g <リソースグループ名> -n <App Service名> -s <スロット名> --query "appCommandLine"
(Get-AzWebApp -ResourceGroupName -ResourceGroupName <リソースグループ名> -Name <App Service名>).SiteConfig.AppCommandLine
(Get-AzWebAppSlot -ResourceGroupName -ResourceGroupName <リソースグループ名> -Name <App Service名> -Slot <スロット名>).SiteConfig.AppCommandLine
パスが確認できたら、以下のようにスタートアップスクリプトを記述して、上記のパスに格納する。
#!/usr/bin/env bash
# 設定ファイルを変更または差し替える
ln -snf /home/custom/etc/nginx/ sites-available/default /etc/nginx/sites-available/default
# NGINXに設定ファイルを再度読み込ませる
nginx -s reload
最後にApp Serviceを手動で再起動して、正しく設定ファイルが差し替えられるかどうかを確認しよう。
az webapp restart -g <リソースグループ名> -n <App Service名> -s <スロット名>
Restart-AzWebApp -ResourceGroupName <リソースグループ名> -Name <App Service名>
Restart-AzWebAppSlot -ResourceGroupName <リソースグループ名> -Name <App Service名> -Slot <スロット名>
再起動して1~3分ほど待ってからSSHで接続し直して、以下のようにシンボリックリンクが設定されているかどうかを確認する。
手動で確認したときと同じくシンボリックリンクが設定されていれば、設定ファイルの差し替えは成功しているはずだ。後は、設定ファイルを書き換えた効果が表れているかどうかも確認しよう。
App Serviceはマネージドサービスなので、OSやWebサーバなどのソフトウェアが自動的に更新される。その際、関連する実行ファイルやスクリプトのパスが変更されることがある。
例えば、更新によってプログラムのバージョンアップが生じると、ディレクトリ名にバージョン番号が含まれるようなパスは変わってしまうことになる。すると、設定ファイルを差し替えていた場合、更新後も対象のパスは古いディレクトリを指したままなので、結果としてプログラムやスクリプトなどが実行できない、という深刻なエラーが発生することがある(筆者はこのパターンでProductionスロットのWebサービスを止めてしまったことがある)。
設定ファイルを差し替えることには、こうした危険性が潜んでいることを認識しておいた方がよい。
■関連リンク
Copyright© Digital Advantage Corp. All Rights Reserved.
Windows Server Insider 記事ランキング