(仮) ブログ

主にWeb Apps や、Azure PaaS サービス を使う際に役立ちそうなことを書こうと思っています。

Web Apps の各言語の挙動を説明しつつ、再起動の実験をしてみた

目次

Web Apps にアプリケーションをデプロイしたからといって、必ずしも再起動するわけではない

先日、別件で Kudu の Wiki を読んでいるときに、こんな感じのことが書いてあって驚きました。 Wiki によると、次の通りのようです。

A common misconception is that deploying content to a Web App causes the app to be restarted. The reality is that deployment pretty much does only one thing: it deploys files into the wwwroot folder. It never directly does anything to restart the App.

This is true whether you use Visual Studio deployment (msdeploy), git/GitHub/etc deployment, FTP, or manually copy some files over using Kudu Console.

github.com

なるほど。つまり、Web Apps をデプロイした際に再起動が直接起きるわけではなく、そのデプロイ時に更新される Web.config などのファイルが更新されることで、再起動が発生するとのことでした。

確かに、.NET のアプリケーションの場合、Web.config を編集すると、アプリケーション ドメインが再起動されますね。他にも、Node.js も Web.config の編集によって、プロセスの再起動が発生するようです。

なんで Node.js は再起動されるの?と思う人もいるかと思います。 Nodejs App Architecture - Azure App Services で書かれていますが、Azure Web Apps 上の Node.js は iisnode と呼ばれるモジュールを介して実行されているのです。 なので、Web.config が編集されれば、新しいプロセスが立ち上がるのはなんとなくわかります。

prmadi.com

一方で気になるのは、他の言語の場合はどうなってるの?ってとこですよね。 と、いうことで簡単に検証しました。

下記では、それぞれの言語がどのように動作するかについても簡単に説明します

Java の場合 (HttpPlatformHandler)

Web Apps 上の Java は、HttpPlatformHandler と呼ばれるモジュールを利用して実行されます。 Azure ポータルのアプリケーション設定から有効にする場合は、web.config が生成されませんが、昔は自分で用意した Java.exe を利用する方法がドキュメントに記されており、そのドキュメントでは、web.config 上で、HttpPlatformHandler を利用するよう記載されていました。

github.com

HttpPlatformHandler を使用する で詳細が説明されています。

IIS のリファレンスになりますが、細かい設定に関してはこちらに書いています。

docs.microsoft.com

そんな、Web Apps の Java ですが、何をきっかけに再起動するのでしょうか。

まず、アプリケーション設定から Java を有効化するとこんな感じになります。

f:id:yoshioblog:20180207232710p:plain

それぞれのプロセスはどうなっているでしょうか。 Azure ポータルから、Web Apps を選択後、[プロセス エクスプローラー] からプロセスを確認できます。

きちんと Java プロセスが起動しているのが確認できます。

それではこれから web.config を作って、挙動が変わるか見てみましょう。

f:id:yoshioblog:20180207233549p:plain

Kudu サイトから、D:\home\site\wwwroot へ行き、web.config を作成しました。

f:id:yoshioblog:20180207233926p:plain

再度プロセス エクスプローラーから確認したところ、、、プロセス ID が変わってますね

IIS のワーカープロセスである w3wp.exe はそのままで、Java のプロセス ID が変わっています。 今度は Web.config を編集しましたが、編集することでも Java のプロセスは一回落ちるようです。

f:id:yoshioblog:20180207233824p:plain

PHP の場合 (FastCGI)

PHP の場合、Azure Web Apps 上では、Fast CGI 経由で php-cgi.exe が起動されます。

Fast CGI は要求を受け取ると、リクエストを処理するために、設定されたパスのプロセスを起動します。Fast CGI の場合、そのプロセスは処理が終わった後もしばらく残り続けますが、基本的には要求ごとにプロセスが生成されるか、もしくは処理が終わったプロセスが再利用されます。

詳しくはこちらに書いていあります。

なぜ、 IIS は PHP アプリケーションの実行に不向きとされてきたのか? – monoe's blog

ちなみにプロセス エクスプローラーで確認するとこんな感じです。 web.config を作成しても、編集しても php-cgi.exe は再起動されませんでした。

f:id:yoshioblog:20180208000449p:plain

ちなみに Python は、FastCGI、HttpPlatformHandler の両方で起動させることができます。

Azure App Service での Python の管理 | Microsoft Docs

あと、Azure ポータルから再起動をしたところ今回試した言語は全てちゃんと再起動されました。

まとめ

  • Web Apps のデプロイは必ずしも再起動を発生させるものではない
  • ASP.NET は、web.config を編集すると、アプリケーション ドメインが再起動される
  • Node.js、Java、は Web.config を編集するとプロセスが再起動する。
  • PHP は Web.config を編集しても再起動しない。
  • Python は二つの方法が選択可能
  • Azure ポータルから再起動を押すと全て再起動する。

手元で試している限りは、アプリケーション設定を更新すると Web Apps が再起動するようです。

その他の場合もあるかもしれないので、色々と試してみてくださいー