この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
いわさです。
Azure App Service on Linuxのランタイムが.NET5の場合に静的HTMLコンテンツを直接FTPアップロードしたい場合シーンがありました。
結論を先に書くと、FTPで静的コンテンツをアップロードする場合にランタイムに.NET5を選択するのは適していません。
dotnetコマンドでWebホストが実行されますが、その中で静的コンテンツが包括されているからです。
静的コンテンツだけだとしてもできれば、dotnetモジュールを作成しデプロイしたほうが良いでしょう。
もし、そもそも.NET5を選択する必要がなければ、ミドルウェアレイヤーでWebホストが動作しているPHPなどのランタイムを選択したほうがおそらく楽です。
今日は.NET5ランタイムを選択した場合に無理やり静的コンテンツを変更してみました。
まず、どういう動作になるのかを確認
Azure App Service on Linuxを.NET5で構築しています。
スタートアップコマンドは無しです。
FTP接続し、コンテンツ index.html
をアップロードし、デフォルトで格納されている、hostingstart.html
は削除しました。
再起動してページを確認してみましょう。
index.html
が表示されて欲しいところですが、デフォルトのまま(hostingstart.html
)ですね。
中身の解析
前回の記事で、Azure App Service on LinuxはSSHでアクセスして、どういう構成で何がホストされていてどういう初期化されているのかを追うのが一番解決の近道かなぁなんて思ってます。
今回も同じように見ていってみましょう。
_____
/ _ \ __________ _________ ____
/ /_\ \___ / | \_ __ \_/ __ \
/ | \/ /| | /| | \/\ ___/
\____|__ /_____ \____/ |__| \___ >
\/ \/ \/
A P P S E R V I C E O N L I N U X
Documentation: http://aka.ms/webapp-linux
Dotnet quickstart: https://aka.ms/dotnet-qs
ASP .NETCore Version: 5.0.6
Note: Any data outside '/home' is not persisted
root@31d9210fcbab:~/site/wwwroot# ps -x
PID TTY STAT TIME COMMAND
1 ? SNs 0:00 /bin/bash /opt/startup/startup.sh
20 ? SNs 0:00 /usr/sbin/sshd
28 ? SNLl 0:01 dotnet /defaulthome/hostingstart/hostingstart.dll
41 ? SNs 0:00 sshd: root@pts/0
45 pts/0 SNs 0:00 -bash
49 pts/0 RN+ 0:00 ps -x
root@31d9210fcbab:~/site/wwwroot# cat /opt/startup/startup.sh
#!/bin/bash
set -e
export PORT=8080
export ASPNETCORE_URLS=http://*:$PORT
echo Trying to find the startup DLL name...
echo 'Running the default app using command: dotnet "/defaulthome/hostingstart/hostingstart.dll"'
cd "/defaulthome/hostingstart"
dotnet "/defaulthome/hostingstart/hostingstart.dll"
root@31d9210fcbab:~/site/wwwroot# cd /defaulthome/hostingstart/
root@31d9210fcbab:/defaulthome/hostingstart# ls
hostingstart hostingstart.pdb wwwroot
hostingstart.deps.json hostingstart.runtimeconfig.json
hostingstart.dll web.config
root@31d9210fcbab:/defaulthome/hostingstart# cd wwwroot/
root@31d9210fcbab:/defaulthome/hostingstart/wwwroot# ls
hostingstart.html
root@31d9210fcbab:/defaulthome/hostingstart/wwwroot#
NginxやApacheは起動されてないですね。
dotnetコマンドが実行されています。
ブラックボックスでわかりませんがおそらくこの中でWebホストが起動されて/defaulthome/hostingstart/wwwroot
がコンテンツルートになっていそうです。
というわけで、おそらく永続ストレージである /home/site/wwwroot
はデフォルトだと使われていないですね。
やってみる
独自で静的コンテンツごとdotnetデプロイするのが正攻法だと思いますが、FTPで静的コンテンツだけでどうにかやってみます。
ただし、冒頭にも記載しましたが、他のランタイムやStatic Web Apps を選択することをお薦めします。
要するにコンテンツを/home/site/wwwroot
から/defaulthome/hostingstart/wwwroot
にコピーできればとりあえず単純には実現できそうです。
コンテナが破棄されうることを考えると割り込みできそうなところはスタートアップコマンドになるのですが、ここに記述するとデフォルトで実行されるdotnet
コマンドが実行されなくなるので、それも記述するのを忘れないようにしましょう。
最終的には以下のようになります。(スクリプトファイルをwwwroot
に格納して実行するとかでも良いです)
今回はとりあえずhtmlファイルをコピーしましたが、コンテンツの参照方法もやり方はある気がします。今回はとりあえずということで。
cp /home/site/wwwroot/index.html /defaulthome/hostingstart/wwwroot/index.html;dotnet "/defaulthome/hostingstart/hostingstart.dll"
スタートアップコマンドに設定したら再起動してもう一度アクセスしてみましょう。
表示されましたね。
最後にSSHでアクセスしてコンテンツの状況を確認してみましょう。
_____
/ _ \ __________ _________ ____
/ /_\ \___ / | \_ __ \_/ __ \
/ | \/ /| | /| | \/\ ___/
\____|__ /_____ \____/ |__| \___ >
\/ \/ \/
A P P S E R V I C E O N L I N U X
Documentation: http://aka.ms/webapp-linux
Dotnet quickstart: https://aka.ms/dotnet-qs
ASP .NETCore Version: 5.0.6
Note: Any data outside '/home' is not persisted
root@51eb69472115:~/site/wwwroot# cd /defaulthome/hostingstart/wwwroot/
root@51eb69472115:/defaulthome/hostingstart/wwwroot# ls
hostingstart.html index.html
root@51eb69472115:/defaulthome/hostingstart/wwwroot#
期待どおり、/defaulthome/hostingstart/wwwroot
にindex.html
が格納されていました。
まとめ
どうにか.NET5ランタイム環境での静的コンテンツの差し替えをやってみました。
繰り返しますが、PHPであればNginxかApacheが稼働していて、FTPで差し替えるだけで済みます。
また、最近Static Web Appsも登場したので静的Webサイトをホストしたいのであればそちらの利用をお薦めします。
以下も参考にしてください。