はじめに
前回は、ASP.NET core 2.1でHello World的なAPIを作った後、ローカルPCにあるVisual Studio上でデバッグ実行するところまでやりました。今回はそれをIIS上にデプロイして動かす手順になります。
なおWindows Serverの画面ですが、とある事情により日本語言語パックが当たらず、英語のままになっています。記事の中では日本訳も書きますが、分かりにくくなってすみません。
目次
- Hello World編
- IISデプロイ編 (ここ)
準備するもの
- Windows Server 2016
- ここにIISをインストールします。
- デプロイするWeb API
- 前回作った Todo APIをデプロイします。
IISをインストールする
(1) Windows Serverのスタートメニューから「サーバーマネージャー(Server Manager)」を起動して、「役割と機能の追加(Add roles and futures)」を選択します。
(2) 開始する前に(Before yo begin)の画面は、そのまま「次へ(Next)」を押します。
(3) インストールの種類(Select installation type)では、IISは役割・機能なので、「役割ベースまたは機能ベースのインストール(Role-baseed or feature-based installation)」を選択します。
(4) 対象サーバーの選択(Select distination server)では、インストール先のサーバーを選択しますた、当然デフォルトの、ローカルホストにします。
(5) サーバーの役割の選択(Select server roles)では、「Webサーバー(IIS)」を選択します。「必要な機能を選択しますか?」というダイアログが出ますが、そのまま「機能の追加」を押してください。
(6) 機能の選択(Select features)では、「ASP.NET 4.6」を選択します。
(7) Webサーバーの役割(Web Server Role(IIS))は、説明だけなので、そのまま「次へ(Next)」。
(8) 役割サービスの選択(Select role Services)は、
- 「アプリケーション開発(Application Development)」>「ASP.NET 4.6」にチェックする(続いて「必要な機能を追加しますか?」のダイアログが出ますが、そのまま「機能の追加」を押す)
- 「管理ツール(Management Tools)」>「管理サービス(Management Service)」にチェックする(これを入れないとWebデプロイができない)
- (必須ではないが)「Common HTTP Features」>「Directory Browsing」のチェックを外しておく。コンテンツが無いときに、フォルダの中身一覧が表示されるのは、セキュリティ的にあまりよくない。
(9) 最後に、確認画面が出るので、「必要に応じて対象サーバーを自動的に再起動する(Restart the destination server automatically if required)」にチェック入れて(多分再起動はしないが)、「インストール(Install)」を押す。
IISをデプロイ可能にする
IISをインストールするだけでは、まだデプロイ可能になっていないので、デプロイができるようにいろいろ設定が必要になります。
Web Deployをインストールする
これを入れないと、IISサーバー上で「Web配置による発行の有効化」がメニューに出てきません。
(1) Web Deployのインストーラーをダウンロードする。
Microsoftのダウンロードページ からインストーラーをダウンロードします。
(2) Web Deployをインストールする。「完全」でインストールする。
Microsoft Visual C++ 2015 再領布可能パッケージを入れる(必要に応じて)(必須だった)
自己完結型の.NET coreアプリケーションを動かす場合は、このパッケージを入れないといけないそうです。
次のバンドルを入れるために、必須みたいです。
Microsoftのダウンロードページから、Japanese(日本語)を選択してダウンロードし、ダブルクリックでインストールできます。
.NET Core ホスティング バンドルのインストール
Microsoftのチュートリアルページっぽいところから、インストーラーをダウンロードし、ダブルクリックでインストールします。なぜこんなことをしないといけないのかは分かりませんが、これをやらないと500エラーが出続け、かつログも出ずに路頭に迷います。
mmcを設定しておく(必須ではない)
今後IISの設定をいじっていくので、いちいちServer Managerから操作するより、Microsoft管理コンソール(mmc)を作っておいたほうがよいでしょう。
(1) Microsoft管理コンソール(mmc)にスナップインしておく。
プログラムとファイルの検索(もしくはWindowsキー+R)でmmc
と入力します。
(2) mmcを起動したら、「ファイル」>「スナップインの追加と削除(Add/Remove Snap-in)」を選択する。
(3) 画面がひどく小さいですが、「インターネットインフォーメーションサービス(Internet Information Service)」を選択し、「追加(Add)」で右側ペインに加える。
IISデプロイ用ユーザーを作る
(1) mmc
から、インターネットインフォメーションサービス(IIS)マネージャーを選択すると、真ん中ペインにWindowsサーバーのマシン名が出るのでこれを選択し、「管理(Management)」から「IISマネージャーユーザー(IIS Manager Users)」を選択する。
(2) 右クリック>「ユーザーの追加(Add User)」。もしくは右ペインから「ユーザーの追加(Add User)」。
(3) デプロイ用のユーザーを適当に作る。
このユーザーはOSのユーザーとは別です(Active Directoryにいる必要もない)。IDとパスワードは何でもいいです。ただし、今後デプロイに使うので、忘れないように!
デプロイの有効化
(1) mmc
を起動し、インターネットインフォメーションサービス(IIS)マネージャーから、(マシン名)>「サイト」>「Default Web Site」を右クリックし、「展開(Deploy)」>「Web配置による発行の有効化(Configure Web Deploy Publishing)」を選択する。
(2) 設定をする。
- 「発行アクセス許可を付与するユーザーを選択します(Select a user to give publishing permissions)」は、右側の「...」を押し、IISマネージャーを選択して、先ほど作成したデプロイ用ユーザー:iisdeploy を入力します(あるいは右の「選択」ボタンから iisdeploy を選択します)。
- 「発行に使用するSQL Server接続文字列を入力します(Enter SQL Server connection string to be used for publishing)」と「発行に使用するMySQL接続文字列を入力します(Enter MySQL connection string to be used for publishing)」は、使用しないので、空白のまま。
- 「発行サーバーに接続するためにURLを指定します(Specify the URL for the publishing server connection)」は、Visual Studioからリモートでデプロイのときに使用するURLで、今回使用するので控えておきます。ホスト名はWindows ServerにアクセスできるURLなら何でも良いのですが、ここではIPアドレスを直書きにしています。ポート番号は変えても良いですが、ここではデフォルトのまま(8172)にしておきます。
- 「発行の設定ファイルの保存先を指定します(Specify a location to save the publish settings file)」は、この設定の保存先です。適当に設定してます(デフォルトはデスクトップ)。
(3) 「セットアップ(Set up)」を押すと設定されるので、「閉じる(Close)」でこの画面を閉じます。
IISにVisual Studioからデプロイする
(1) Visual Studio上の、プロジェクトを、右クリック>「発行...」を選択します。
(3) 接続では、先ほど「デプロイの有効化」で設定したIISの接続情報を入力します。
- 「発行方法」は、「Web配置」。
- 「サーバー」は、発行を受け付けるURLで、先ほど「デプロイの有効化」で設定した「発行サーバーに接続するためにURLを指定します(Specify the URL for the publishing server connection)」の値を入力します。
- 「サイト名」とは、IISの「サイト(Sites)」のことです。ここでは、デフォルトで作られている「Default Web Site」を指定することにします。この項目では、「Default Web Site/todo」のようにパスで入力できますが、パスを入れると、複数のアプリケーションを同一サイト(Sites)にいれることができますが、URLが http://172.26.22.44/todo/api/~ のように、コンテキストパスが入ります。
- 「ユーザー名」と「パスワード」は、「IISデプロイ用ユーザーを作る」で作ったユーザーを入力します。
- 「宛て先URL」は、(多分)APIのクライアントがアクセスするURLです。
(4) 全部入力したら、「接続の検証」を押して接続テストをします。証明書検証エラーの画面がでますが、(多分正規の証明書は入れられないので)「承諾」を押してください。(画像紛失しました、すみません)
(5) 設定では、
- 「構成」は、Debug/Release を目的に応じて設定する。
- 「ターゲットフレームワーク」は、当然「netcoreapp2.1」。
- 「配置モード」はどちらでもいいです。この記事では、動作に必要なファイルをすべてデプロイする「自己完結」にしています。「自己完結」にすると、フォルダごと別のIISへ引っ越せますが、デプロイするファイル数が多くなり時間が掛かります。「フレームワーク依存」にすると、デプロイするファイル数は少ないですが、ライブラリのバージョンなど、動作しているIISの環境に依存することになります。
- 「ターゲットランタイム」は、デプロイするAPIの実行環境で、今回はWindows 64bitなIISなので、「win-x64」を選択しておきます。
- 「ファイル発行オプション」は適当に。この記事では、すべてデフォルトのままです。
上記以外の設定(必要に応じて)
必要最小限の設定はこれで全部なのですが、環境によってはもう少し設定が必要な場合があります。思いつく部分だけ書いておきます。
- デプロイ用ポート 8174 にアクセスできるようにしておく
- リモートデプロイするとき(設定によるが、デフォルトでは)8174ポートを使うので、WindowsサーバーのWindows FirewallやAWSのセキュリティグループで穴あけしておく必要があります。
試す
長かったですが、これで全部です。ブラウザや curl
でアクセスしてみましょう。GETだけ試すことにします。
※ブラウザでアクセスした画像のIPアドレスが違っていますが、気にしないでください)
> curl -D - -X GET "http://172.26.22.25/api/todo"
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: Kestrel
X-Powered-By: ASP.NET
Date: Fri, 23 Nov 2018 13:19:14 GMT
[{"id":1,"name":"犬の散歩","isDone":false},{"id":2,"name":"買い物","isDone":true},{"id":3,"name":"本棚の修理","isDone":false}]
まとめ
この記事では、デプロイ(発行)先のサイトを Default Web Site にしてしまいましたが、この設定にするとデプロイするファイルが C:\inetpub\wwwroot 直下に配置してしまうので、別のサイトを作った方が良いかもしれません。
いずれにせよ、手順多すぎです…
参考文献、サイト
-
IISへのリモートデプロイ手順
- ほとんどここのコピペになってしまった。ここ見ておけばいいんじゃないの、と思った、のですがいくつか手順が足りないっぽい。
- .NET coreの前提条件
- IISのチュートリアル
-
Windowsサーバ―上で ASP.NET core2.1を呼ぶと「500 - Intrenal server error」が出る
- stackoverflow上では、500エラー系の質問が大量にありますが、これが一番的確な質問&回答だと思います。『Windows Server 2012 RC2でも俺の開発用PCでも完璧に動くのに、最近買った Windows Server 2016 でエラーが出る。』
-
ユーザー 'WDeployConfigWriter' にログオンできません。
- コメントで情報を頂いたので、追記します(2020/7/12)。