athome-developer’s blog

不動産情報サービスのアットホームの開発者が発信するブログ

CentOS7でASP.NET Coreを動かす

こんにちは、情報システム部の高野です。
.Net CoreをLinuxで動かす事例は、Ubuntuが多いのですが
弊社は基本的にRed Hat Enterprise Linuxを利用しているので
検証も同様にRed Hat Enterprise Linuxで行うべく
CentOS上にASP.NET Coreの環境を構築したのですが
結構、はまったので手順を残しておきます。*1

環境

CentOS7.2
dotnet Core1.0.1
nginx 1.10.2

dotnetのセットアップ

.NET - Powerful Open Source Development
ここに書いてある通りにやれば動かすことはできました。
Webのプロジェクトを作成してdotnet runをすればWebサイトも普通に動くはずです。
※この時点ではkestrelをターミナルで実行して動かしてます。

nginxのセットアップ

軽く動作を確認するだけならkestrelだけでも問題ないのですが
ちゃんと運用する際には、nginxなどのWebサーバが必要になります。

yumでnginxをインストールします。

> sudo yum install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
> sudo yum install --enablerepo=nginx nginx

設定ファイルを修正します。
/etc/nginx/conf.d/default.confをテキストエディタで開き下記のように修正します。
※locationの部分だけです

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
   ・・・
}


SELinuxを停止します。
(本番環境では停止せずにちゃんと設定してください)

> sudo setenforce 0

※再起動後も停止したままにするなら /etc/selinux/config を書き換えます。

nginxを起動します

> sudo systemctl start nginx.service
> sudo systemctl enable nginx.service

2行目は、再起動時もnginxが起動するようにするためのものなので
必要に応じて実行してください。

dotnet runでkestrelを実行します。
curlでもブラウザでもいいので80番ポートにアクセスします。
作成したWebサイトが表示されればリバースプロキシの設定は完了です。

kestrelをバックグラウンドで実行する

このままだとターミナルを閉じるとWebサイトが利用できなくなってしまうので
バックグラウンドでkestrelを実行するようにします。

Publish to a Linux Production Environment
当初はこちらにあるようにSuperVisorを使って常駐化しようとしたのですが
CentOS7では、どうやらSuperVisorなどをインストールしなくても常駐化が簡単にできるようなので
そちらのやり方で実行しました。

/etc/systemd/systemにkestrel.serviceというファイルを作成します。
(ファイル名は、任意なのでkestrelでなくても良いです)

[Unit]
Description=kestrel server
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/dotnet /home/hoge/sampleApp/SampleApp.dll
WorkingDirectory=/home/hoge/sampleApp
KillMode=process
Restart=always
User=hoge
Group=hoge

[Install]
WantedBy=multi-user.target

ExecStartとWorkingDirectoryは任意のパスです。
dotnet publishでデプロイしたディレクトリを指定します。*2

あとは、nginx同様起動します

> sudo systemctl start kestrel.service
> sudo systemctl enable kestrel.service


これでターミナルを閉じても再起動後でもWebサイトにアクセスできます。
分かってしまえば結構簡単ですね

*1:現在、AzureでもRHELは選択できるのですが、つい癖でCentOSを選択してしまいました

*2:通常のテンプレートだとdotnet publishをするときにnpm等が必要になります