作成したサイトをCentOS7上で公開する際の手順
Visual Studio 2017で作成したASP.NET CoreサイトをCentOS7にサービスとして配置するまでの手順になります。
クロスプラットフォーム向けのASP.NET Coreですが、試しにLinuxOSに配置したことはあっても、ちゃんと作成したものを公開するのは今回が初めてだったので、きちんと動作するか不安でしたが、やってみると何度か躓きはしたものの、思ったよりも簡単に公開することができました。
DBはMySQL、WebサーバーはNginxです。
目次
- .NET Core ランタイムのインストール
- MariaDBの削除
- MySQLのインストール、サービスの有効化・起動
- プロジェクトの発行
- 発行されたdllの配置、動作確認
- .NET Coreサイトのサービス化
- Nginxのインストール
- 最後に
.NET Core ランタイムのインストール
まず、CentOS7にASP.NET Coreで作成したサイトを動かすためのランタイムをインストールします。
プロダクトフィードの追加
.NET SDKのインストール
MariaDBの削除
今回はDBにMySQLを使うので、CentOS7にデフォルトでインストールされているMariaDBを削除します。
MySQLのインストール、サービスの有効化・起動
MySQL5.7のインストール
サービスの有効化、起動
初期設定
基本的にはデフォルトのままインストールでOK。パスワードはポリシーが厳しくなっているので注意。
デフォルトの状態ではパスワードの有効期限が360日間なので、「/etc/my.cnf」を開いて
以下の設定を末尾に追加します。
追加したらサービスを再起動します。
あとは必要に応じて、DBやユーザー、テーブルの作成を行ってください。ここでは省略します。
プロジェクトの発行
サーバに配置するファイルはプロジェクトを右クリックして、メニューの中の「発行」を選択します。
フォルダーを選択して「発行」を開始。
発行が終わると出力先のフォルダーに以下のようなファイルが出力されます。
上記のファイルをフォルダごと圧縮したら、サーバ(CentOS7)へアップロードします。
発行されたdllの配置、動作確認
CentOS7にアップロードしたファイルを解凍して、動作確認を行います。
解凍されたファイルの中にある「プロジェクト名.dll」のファイル(WebApplication14.dll)を実行します。
問題なければ、デフォルトのポート番号「5000」でサイトが立ち上がりますが、私の場合、以下のエラーが出て失敗しました。
マニフェストファイルの不備が原因のようですが、どう直せばいいのかよく分からなかったので、こちら(An assembly specified in the application dependencies manifest (RhWeb.deps.json) was not found · Issue #13542 · dotnet/coreclr · GitHub)に書いてあった方法を試してみたら解決しました。
方法は、ソリューションエクスプローラーからプロジェクトを右クリックして、プロジェクト名.csprojを編集するを選択して、以下の内容を追記します。
追記したら、もう一度プロジェクトの発行を行って、CentOS7上のファイルを置き換えます。
通常は上記の対応だけで問題ないかと思いますが、私の場合、AngularやReactベースのプロジェクトテンプレートを利用していたものについては、さらにサーバにnode.jsのインストールが必要でした。
.NET Coreサイトのサービス化
今のままではコマンドラインで実行した時しかサイトが立ち上がらないので、これをサービス化します。
サービス化は、まずサービス登録用のファイルを新しく作ります。
ファイルの内容は以下の通り。
ディレクトリやユーザーといった情報は、環境に合わせて設定します。
ファイル保存したら、サービスを有効化・開始します。
Nginxのインストール
ここまで来たらあとすこし。Nginxをインストール・設定します。
リポジトリの設定
ファイルの内容は以下の通り。
Nginxをインストール
Nginxも同様にサービスの有効化・開始を行います。
この時点でブラウザからIP指定でアクセスすると、Nginxのデフォルトページが表示されます。
続いて、プロキシの設定
ファイルの内容は以下の通り。
server_nameやproxy_passは環境に合わせて設定してください。
最後にサービスを再起動します。
サイトにアクセスして、ASP.NET Coreのサイトが表示されれば完了です。
最後に
実際に稼働させる場合は、他にも色々と設定が必要ですが、上記の手順でとりあえずは動作すると思います。
また、最初は特定のサブディレクトリにアクセスされたらASP.NET Coreのサイトを表示しようとしましたが、サブディレクトリとした場合、どうもちゃんと動作しなかったので、諦めました。httpsの対応が面倒だったので避けたかったのですが、素直にサブドメインで対応したいと思います。