2018.5.26
2020.1.7

作成したサイトを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で作成したサイトを動かすためのランタイムをインストールします。

プロダクトフィードの追加

rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

.NET SDKのインストール

yum update
yum install libunwind libicu
yum install dotnet-runtime-2.0.7

MariaDBの削除

今回はDBにMySQLを使うので、CentOS7にデフォルトでインストールされているMariaDBを削除します。

yum remove mariadb-libs
rm -rf /var/lib/mysql/

MySQLのインストール、サービスの有効化・起動

MySQL5.7のインストール

yum install http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
yum install mysql-community-server

サービスの有効化、起動

# サービスの有効化
systemctl enable mysqld.service

# サービスの開始
systemctl start mysqld.service

初期設定

mysql_secure_installation

基本的にはデフォルトのままインストールでOK。パスワードはポリシーが厳しくなっているので注意。

デフォルトの状態ではパスワードの有効期限が360日間なので、「/etc/my.cnf」を開いて

vi /etc/my.cnf

以下の設定を末尾に追加します。

character-set-server = utf8
default_password_lifetime = 0

追加したらサービスを再起動します。

systemctl restart mysqld.service

あとは必要に応じて、DBやユーザー、テーブルの作成を行ってください。ここでは省略します。

プロジェクトの発行

サーバに配置するファイルはプロジェクトを右クリックして、メニューの中の「発行」を選択します。

フォルダーを選択して「発行」を開始。

発行が終わると出力先のフォルダーに以下のようなファイルが出力されます。

上記のファイルをフォルダごと圧縮したら、サーバ(CentOS7)へアップロードします。

発行されたdllの配置、動作確認

CentOS7にアップロードしたファイルを解凍して、動作確認を行います。

解凍されたファイルの中にある「プロジェクト名.dll」のファイル(WebApplication14.dll)を実行します。

dotnet WebApplication14.dll

問題なければ、デフォルトのポート番号「5000」でサイトが立ち上がりますが、私の場合、以下のエラーが出て失敗しました。

Error:
  An assembly specified in the application dependencies manifest (WebApplication14.deps.json) was not found:
    package: 'Microsoft.ApplicationInsights.AspNetCore', version: '2.1.1'
    path: 'lib/netstandard1.6/Microsoft.ApplicationInsights.AspNetCore.dll'
  This assembly was expected to be in the local runtime store as the application was published using the following target manifest files:
    aspnetcore-store-2.0.0-linux-x64.xml;aspnetcore-store-2.0.0-osx-x64.xml;aspnetcore-store-2.0.0-win7-x64.xml;aspnetcore-store-2.0.0-win7-x86.xml

マニフェストファイルの不備が原因のようですが、どう直せばいいのかよく分からなかったので、こちら(An assembly specified in the application dependencies manifest (RhWeb.deps.json) was not found · Issue #13542 · dotnet/coreclr · GitHub)に書いてあった方法を試してみたら解決しました。

方法は、ソリューションエクスプローラーからプロジェクトを右クリックして、プロジェクト名.csprojを編集するを選択して、以下の内容を追記します。

<PropertyGroup>
  <PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
</PropertyGroup>            

追記したら、もう一度プロジェクトの発行を行って、CentOS7上のファイルを置き換えます。

通常は上記の対応だけで問題ないかと思いますが、私の場合、AngularやReactベースのプロジェクトテンプレートを利用していたものについては、さらにサーバにnode.jsのインストールが必要でした。

yum install epel-release
yum install nodejs npm

.NET Coreサイトのサービス化

今のままではコマンドラインで実行した時しかサイトが立ち上がらないので、これをサービス化します。

サービス化は、まずサービス登録用のファイルを新しく作ります。

vi /etc/systemd/system/WebApplication14-webapp.service

ファイルの内容は以下の通り。

[Unit]
Description=WebApplication14 .NET Web API App running on CentOS7

[Service]
WorkingDirectory=/var/aspnetcore/WebApplication14
ExecStart=/usr/bin/dotnet /var/aspnetcore/WebApplication14/WebApplication14.dll
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-example
User=nginx
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

ディレクトリやユーザーといった情報は、環境に合わせて設定します。

ファイル保存したら、サービスを有効化・開始します。

# サービスの有効化
systemctl enable WebApplication14-webapp.service

# サービスの開始
systemctl start WebApplication14-webapp.service

Nginx 搭載の Linux で ASP.NET Core をホストする | Microsoft Docs

Nginxのインストール

ここまで来たらあとすこし。Nginxをインストール・設定します。

リポジトリの設定

vi /etc/yum.repos.d/nginx.repo

ファイルの内容は以下の通り。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

Nginxをインストール

yum install nginx

Nginxも同様にサービスの有効化・開始を行います。

# サービスの有効化
systemctl enable nginx

# サービスの開始
systemctl start nginx

この時点でブラウザからIP指定でアクセスすると、Nginxのデフォルトページが表示されます。

続いて、プロキシの設定

vi /etc/nginx/conf.d/server.conf

ファイルの内容は以下の通り。

server{
    server_name    192.168.0.100;

    proxy_set_header    Host    $host;
    proxy_set_header    X-Real-IP    $remote_addr;
    proxy_set_header    X-Forwarded-Host       $host;
    proxy_set_header    X-Forwarded-Server    $host;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;

    location / {
        proxy_pass    http://localhost:5000;
    }
}

server_nameやproxy_passは環境に合わせて設定してください。

最後にサービスを再起動します。

systemctl restart nginx

サイトにアクセスして、ASP.NET Coreのサイトが表示されれば完了です。

CentOS7 に nginx導入

最後に

実際に稼働させる場合は、他にも色々と設定が必要ですが、上記の手順でとりあえずは動作すると思います。

また、最初は特定のサブディレクトリにアクセスされたらASP.NET Coreのサイトを表示しようとしましたが、サブディレクトリとした場合、どうもちゃんと動作しなかったので、諦めました。httpsの対応が面倒だったので避けたかったのですが、素直にサブドメインで対応したいと思います。

ASP.NET Core】関連記事