ASP.NET CoreアプリをApacheでホストする

ASP.NET Coreの登場でLinuxでもC#で作成したWebアプリが動かせるようになったみたいです。 .NETは使いたいけど、Linuxの文化も取り入れたい!ということで簡単にApacheでホストしてみたいと思います。

本手順ではサーバ構築にDockerを使用します。事前にインストールしておきましょう。

サーバを用意する

Dockerを使用してCentOSのサーバを建てます。 Dockerfile書いてドヤりたかったんですが、筆者弱小エンジニアなので手作業()で構築します。

取り敢えず、最新のCentOSイメージを拾って起動し、中に入ります。

$ docker pull centos
$ docker run -p 80:80 -p 443:443 -d --privileged centos:latest /sbin/init
$ docker exec -it {CentOSのコンテナID} /bin/bash

CentOSコンテナの中に入れたら必要なパッケージをインストールします。

# yum update
# yum install -y httpd firewalld
# rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
# yum install -y dotnet-sdk-2.2

httpdApache HTTP Serverでfirewalldはただのファイアウォールです。 .NET Core SDKは通常のパッケージマネージャーから取得出来ないのでパッケージを取得してからインストールします。

インストール出来たらサービスを起動してあげましょう。

# systemctl enable httpd
# systemctl start httpd
# systemctl status httpd
# systemctl enable firewalld
# systemctl start firewalld
# systemctl status firewalld

ちゃんと起動していれば、緑色でactive (running)って表示されるかと思います。

f:id:neko3cs:20190817024513p:plain

f:id:neko3cs:20190817024532p:plain

最後にファイアウォールに穴を開けてHTTP(S)通信出来るようにしてあげます。

# firewall-cmd --add-port=80/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-all

f:id:neko3cs:20190817025035p:plain

赤枠のように80番が開通すればオッケーです。

※実はここでERROR: Exception DBusException: org.freedesktop.DBus.Error.AccessDeniedというエラーが発生しましたが、firewalldをreinstallしたり、CentOSコンテナを再起動したら直りました。原因はよくわかりません...。

アプリを用意する

デプロイ環境の構築手順の確認が目的なのでデフォルトで生成されるテンプレートをそのままホストします。

$ mkdir webapplication1; cd webapplication1
$ dotnet new sln; dotnet new mvc
$ dotnet publish -c Release -r linux-x64 -o ~/Desktop/publish

Linux環境で動かすため、dotnet publishする際に、-r linux-x64Linux用にコンパイルされるよう指定してあげましょう。

アプリをデプロイする

デスクトップに発行したバイナリをコンテナ内に配置して動くようにしましょう。

ASP.NET CoreではKestrelという独自のWebサーバがアプリケーションに内包されています。 これ単独でもWebアプリをホストすることは可能ですが、ApacheIISと比べると機能が不十分だと言われています。 そのため、通常はApacheIISをリバースプロキシサーバとして仲介させるのが良いそうです。

f:id:neko3cs:20190817163604p:plain

まずはバイナリを圧縮してコンテナ内に持っていきます。

$ tar -zcvf publish.tar.gz ~/Desktop/publish
$ docker cp publish.tar.gz {CentOSのコンテナID}:/var/www/publish.tar.gz

送れたら、中に入って解凍します。

$ docker exec -it {CentOSのコンテナID} /bin/bash
# cd /var/www
# tar -zxvf publish.tar.gz

ASP.NET Coreアプリはサービスとして起動することでKestrelを使用してアプリをホストすることが出来るっぽいです。 なので解凍したバイナリを実行するサービスを作成・実行します。

以下のパスにファイルを作成します。

# vi /etc/systemd/system/kestrel-webapplicaiton1.service

ファイルを開いたら以下の内容を記述します。

[Unit]
Description=Example .NET Web API App running on CentOS 7

[Service]
WorkingDirectory=/var/www/publish
ExecStart=/usr/bin/dotnet /var/www/publish/WebApplication1.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=apache
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

基本公式のコピペですが、以下のみ変更が必要です。

項目 説明
WorkingDirectory バイナリのあるファイルのパス
ExecStart 実行コマンド。dotnetコマンドでアプリの.dllを実行します

作成したらサービスを有効化し起動します。

# systemctl enable kestrel-webapplicaiton1.service
# systemctl start kestrel-webapplicaiton1.service
# systemctl status kestrel-webapplicaiton1.service

以下のように緑色でactive (running)って表示されればOKです。

f:id:neko3cs:20190817170435p:plain

最後にApacheの設定をします。以下のパスにファイルを作成します。

# vi /etc/httpd/conf.modules.d/webapplicaiton1.conf

ファイルを開いたら以下の内容を記述します。

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass / http://localhost:5000/
    ProxyPassReverse / http://localhost:5000/
    ServerName www.neko3cs.com
    ServerAlias *.neko3cs.com
</VirtualHost>

最低限必要な記述は上記のようです。 公式には他にも設定がありますが今回は Apacheの設定方法をよく知らないので 動作確認の取れたものを記載しています。

設定ファイルを追加できたらApacheに設定を再読み込みさせましょう。

# systemctl reload httpd

アクセスしてみる

最初にCentOSコンテナを起動した際にコンテナ内部の80番ポートとローカルの80番ポートを繋ぐように設定しました。 なのでそのままローカルのブラウザでlocalhostを叩いたら実行されると思います。

f:id:neko3cs:20190817172225p:plain

最後に

今回は最低限の実行方法の確認のみを行いました。 なので、一部本番環境で使用するには不適切な部分(SSL通信してないとか)があるかもしれません。

今後はIISではなくApacheASP.NET Coreアプリを実行してゆきたいと思うので、CentOSApacheについてもう少し学んでゆきたいと思います。