あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、取り上げたりしています。

ASP.NET CoreアプリをLinuxにデプロイしてNginxで公開する方法(CentOS7)

はじめに

ASP.NET Core の情報は、日本語はほぼなく英語も少ないのですが、その中でも ASP.NET Core アプリのデプロイについての詳しい情報は皆無の状態です。

この記事では、ASP.NET Core アプリの Linux (CentOS7)へのデプロイ方法を詳しく解説します。

概要

この記事では、以下の内容を解説します。なお、開発環境は Mac で、デプロイ環境は CentOS7になります。Web サーバーは Nginx を使用します。

  • そもそも .NET Core とはなにか?
  • Mac での開発環境構築
  • ASP.NET MVC アプリを作成する
  • ASP.NET MVC アプリの発行
  • Linuxでのデプロイ作業
  • Nginx のインストールと設定
  • Nginx でリバースプロキシを設定する
  • Systemd でサービス化

そもそも .NET Core とはなにか?

.NET Core とは最新のオープンソースで開発されているクロスプラットフォームの .NET 実装になります。現在は、Windows, Mac, Linux で動作します。

今まで .NET というと Windows の .NET Framework のことを指し、Windows 固有の実装となっていました。Windows サーバーは費用が高いため敬遠されていましたが、.NET Core は Linux でも動作するので .NET 実装でありながら費用を安く抑えることができます。

また、最近のバージョンでは MySQL へのアクセスもできるので、ASP.NET Core + Linux + MySQL という組み合わせもできます。昨今の Java の動向を見ていると、新規で開発する Web アプリは .NET Core で開発することがよいかなと考えています。

なお、.NET Core と従来の .NET Framework の住み分けですが、Windows アプリでは .NET Framework が今後も使用されていくと思われます。.NET Core はまだ ASP.NET Core しか対応していないためです。ですが、.NET Core は積極的に開発が進んでいるのに対して、.NET Framework は現状を維持する方向になっているため、ASP.NET で新規に開発するなら、.NET Core がよいかと思います。

この辺の詳しい情報は、Microsoft が以下の記事を公開しているので参考にしてください。

Mac での開発環境構築

.NET Core の開発は、Windows, Mac, Linux のどれでもできますが、この記事では Mac での開発方法を解説します。

まず、.NET Core SDK を Mac にインストールする必要があります。

.NET Core SDK は下記サイトよりダウンロードしてインストールを行います。これにより、ターミナルから dotnet コマンドを実行することができるようになります。

この記事では、dotnet コマンドで解説を行いますが、Visual Studio for Mac を使用するのであれば、下記サイトよりダウンロードしてインストールしてください。

ASP.NET MVC アプリを作成する

まずは、ASP.NET MVC アプリを .NET Core で作成します。

ここでは、 /Users/xxx/Projects に webapp という名前で作成します。下記のようにコマンドを実行してください。まずは、該当のディレクトリを作成します。

$ cd /Users/xxx/Projects
$ mkdir webapp
$ cd webapp
$ pwd
/Users/xxx/Projects/webapp

そうしたら、以下のコマンドで ASP.NET MVC アプリを作成します。なお、ネットでは -t オプションを使用しているものがありますが、少なくとも現在の最新版では -t オプションを使用するとエラーになるためご注意ください。また、作成できるプロジェクトは公式サイトを参照してください。

$ dotnet new mvc

そうしたら、以下のコマンドを実行後、ブラウザで http://localhost:5000 にアクセスします。すると、自動で作成された Web アプリが表示されます。

$ dotnet run

無事に表示されたら、Ctrl+C で Web アプリを停止します。なお、ASP.NET Core 組み込みの Web サーバは Kestrel といいます。

ここで2点ほどプログラムをカスタマイズしておきます。

・Program.cs

Kestrel はデフォルトでは、サーバー外部からのアクセスを拒否しているので将来のことを考慮して、UseUrls で外部からでもアクセスできるよう記述を追加します。

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseUrls("http://*:5001/")
            .Build();
}

・Startup.cs

Configureメソッドに以下の内容を追加します。app.UseMvcの前に入れるとよいようです。これは後ほどリバースプロキシにするため、クライアントの情報が取れなくなることを防ぐための設定です。

using Microsoft.AspNetCore.HttpOverrides; //Startup.cs の先頭に追加

//(中略)

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

ASP.NET MVC アプリの発行

動作が確認できたら、プロジェクトディレクトリ(.csprojがあるディレクトリ)で以下のコマンドを実行して、ASP.NET MVC アプリを発行します。

$ dotnet publish --configuration Release

ると、以下のように発行先のディレクトリが表示されているのが分かります。

.NET Core 向け Microsoft (R) Build Engine バージョン 15.5.180.51428
Copyright (C) Microsoft Corporation.All rights reserved.

  Restore completed in 168.77 ms for /Users/ryu/Projects/webapp/webapp.csproj.
  Restore completed in 192.54 ms for /Users/ryu/Projects/webapp/webapp.csproj.
  webapp -> /Users/xxx/Projects/webapp/bin/Release/netcoreapp2.0/webapp.dll
  webapp -> /Users/xxx/Projects/webapp/bin/Release/netcoreapp2.0/publish/

ここからの手順がなかなかなくて苦労したのですが、以下のようにディレクトリを移動して、tar コマンドで発行先のプログラムを固めます。

$ cd bin/Release/netcoreapp2.0/publish
$ tar zcvf wepapp.tar.gz *

できあがった、wepapp.tar.gz を CentOS7 の /tmp ディレクトリに SFTP などでアップロードします。

ここから先は Linux での作業になります。

Linuxでのデプロイ作業

先ほど /tmp に wepapp.tar.gz をアップロードしたので、これをデプロイします。具体的には以下のようにコマンドを実行します。なお、CentOS7 にはログイン済みであるとします。また、事前にこちらを参考にして .NET Core SDKをインストールしておきます。

$ cd /var
$ sudo mkdir webapp
$ cd webapp
$ sudo cp /tmp/webapp.tar.gz .
$ sudo tar zxvf webapp.tar.gz
$ sudo rm webapp.tar.gz

これでデプロイは完了です。次は、Nginx の設定に移ります。

Nginx のインストールと設定

Nginx をインストールするには、まずリポジトリを追加する必要があります。

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

追加する内容は以下のようにします。

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

そして yum で nginx のパッケージをインストールします。

$ sudo yum install nginx

デフォルトでは firewalld が HTTP のポートを塞いでいるのでその前に開放する必要があります。ついでに、HTTPS のポートも開放します。

$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
$ sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
$ sudo firewall-cmd --reload

Nginx の起動、停止は以下のように行います。

$ sudo systemctl start nginx   #起動
$ sudo systemctl stop nginx    #停止

次は、OS 起動時に Nginx が起動するように設定します。

$ sudo systemctl enable nginx
$ sudo systemctl list-unit-files | grep nginx.service
nginx.service                                 enabled

Nginx でリバースプロキシを設定する

ASP.NET Core の Kestrel という Web サーバは機能が少ないため、Web サーバの機能は Nginx にまかせ一度 Nginx にアクセスしてから Kestrel にアクセスするように設定します。こういった設定を、リバースプロキシと言ったりします。

具体的には、 /etc/nginx/conf.d/default.conf を編集し、Nginx を再起動します。

$ cd /etc/nginx/conf.d
$ sudo vi default.conf

以下のように編集します。

server {
    listen       80;
    server_name  localhost;

    location / {
      proxy_pass http://localhost:5001;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection keep-alive;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
    }

    #Comment out
    #location / {
    #    root   /usr/share/nginx/html;
    #    index  index.html index.htm;
    #}

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Nginx をリロードして設定を反映させます。

$ sudo nginx -t
$ sudo nginx -s reload

この時点で、下記コマンドを実行後、http://<IPアドレス> にアクセスすると、ASP.NET MVC アプリの画面が表示されます。

$ cd /var/webapp
$ dotnet webapp.dll

Systemd でサービス化

Kestrel は落ちるとそのままのため、Systemd を使用してなにかあった場合は自動で起動するようにします。

sudo vi /etc/systemd/system/webapp.service

以下の内容を入力します。

[Unit]
Description=webapp version 1.0

[Service]
ExecStart=/usr/bin/dotnet /var/webapp/webapp.dll
Restart=always
RestartSec=10
SyslogIdentifier=webapp
User=nginx
Environment=ASPNETCORE_ENVIRONMENT=Production
WorkingDirectory=/var/webapp

[Install]
WantedBy=multi-user.target

サービスとして起動するよう設定します。

$ sudo systemctl enable webapp
$ sudo systemctl list-unit-files | grep webapp
webapp.service                                enabled

では、サービスを起動します。

$ sudo systemctl start webapp

これで、http://<IPアドレス> にアクセスして ASP.NET MVC アプリが表示できれば完了です。

おわりに

ASP.NET Core アプリの情報は少ない上に、そのまま使用できないものが多いというのが実際に記事を書いてみて痛感しました。💦

この記事では、現時点での動作確認は済んでいますが時間が経てば動かないようになるかもしれません。その際は、ちょっと試行錯誤してみてください。

でも、これでようやく ASP.NET Core のデプロイ方法が分かりましたね。

この記事がみなさんのお役にたてば幸いです。

参考サイト