normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

ASP.NET Core の疎通を Linux 上でとってみる

年明け一発目の投稿では ASP.NET Core を Linux 上( CentOS 7.2 )で疎通をとる手順を紹介する。また、単なる Hello World に加えて Windows 上で作成した ASP.NET Core アプリを Linux 上にデプロイして動かす方法も試してみた。

CentOS 上でアプリを作成して公開する

まずは CentOS 上で環境構築を行う。.NET Core アプリケーションを起動するために必要なモジュールを設定ため、管理者となり以下のコマンドを実行する。

[azureuser@XXXXXXXX ]$ sudo su -
[sudo] password for azureuser: 
Last login: Thu Dec 29 03:29:20 UTC 2016 on pts/0
Last failed login: Sun Jan  1 03:07:07 UTC 2017 from 218.65.30.25 on ssh:notty
[root@XXXXXXXX ~]# yum install  libunwind libicu
[root@XXXXXXXX ~]# curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=835019
[root@XXXXXXXX ~]# mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
[root@XXXXXXXX ~]# ln -s /opt/dotnet/dotnet /usr/local/bin

次に、Apache 越しに .NET Core アプリケーションにアクセスするため Apache のインストールと *.conf ファイルを作成する。

[root@XXXXXXXX ~]# yum install httpd mod_ssl
[root@XXXXXXXX ~]# vi /etc/httpd/conf.d/hellomvc.conf
[root@XXXXXXXX ~]# cat /etc/httpd/conf.d/hellomvc.conf
    <VirtualHost *:80>
        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:5000/
        ProxyPassReverse / http://127.0.0.1:5000/
        ErrorLog /var/log/httpd/hellomvc-error.log
        CustomLog /var/log/httpd/hellomvc-access.log common
    </VirtualHost>

設定ファイル作成後、作成した hellomvc.conf ファイルの構文チェックを行う。

[root@XXXXXXXX ~]# service httpd configtest
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.0.4. Set the 'ServerName' directive globally to suppress this message
Syntax OK

「Syntax OK」が表示されたことを確認後、Apache を起動する。

[root@XXXXXXXX ~]# systemctl enable httpd
[root@XXXXXXXX ~]# systemctl start httpd
[root@XXXXXXXX ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2016-12-29 03:40:09 UTC; 2 days ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 1705 (httpd)
   Status: "Total requests: 50; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─1705 /usr/sbin/httpd -DFOREGROUND
           ├─1706 /usr/sbin/httpd -DFOREGROUND
           ├─1707 /usr/sbin/httpd -DFOREGROUND
           ├─1708 /usr/sbin/httpd -DFOREGROUND
           ├─1709 /usr/sbin/httpd -DFOREGROUND
           ├─1710 /usr/sbin/httpd -DFOREGROUND
           ├─1738 /usr/sbin/httpd -DFOREGROUND
           ├─1743 /usr/sbin/httpd -DFOREGROUND
           ├─1745 /usr/sbin/httpd -DFOREGROUND
           ├─1746 /usr/sbin/httpd -DFOREGROUND
           └─5538 /usr/sbin/httpd -DFOREGROUND
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

上記の様に Aapache が正常に起動されていることを確認後、以下の様に ASP.NET Core アプリケーションを作成する。

[azureuser@XXXXXXXX ~]$ rm -rf MyWebapp/
[azureuser@XXXXXXXX ~]$ mkdir MyWebapp
[azureuser@XXXXXXXX ~]$ cd MyWebapp/
[azureuser@XXXXXXXX MyWebapp]$ dotnet new -t web
Created new C# project in /home/azureuser/MyWebapp.

[azureuser@XXXXXXXX MyWebapp]$ ls
appsettings.json  Controllers  gulpfile.js  package.json  project.json  Services    Views       wwwroot
bower.json        Data         Models       Program.cs    README.md     Startup.cs  web.config

その後、以下の様にコマンドを実行してアプリケーションのパッケージの復元&アプリケーションの実行を行う。

[azureuser@XXXXXXXX MyWebapp]$ dotnet restore
log  : Restoring packages for /home/azureuser/MyWebapp/project.json...
warn : Dependency specified was Microsoft.NETCore.App (>= 1.1.0-preview1-001153-00) but ended up with Microsoft.NETCore.App 1.1.0.
log  : Restoring packages for tool 'Microsoft.AspNetCore.Razor.Tools' in /home/azureuser/MyWebapp/project.json...
log  : Restoring packages for tool 'Microsoft.AspNetCore.Server.IISIntegration.Tools' in /home/azureuser/MyWebapp/project.json...
log  : Restoring packages for tool 'Microsoft.EntityFrameworkCore.Tools' in /home/azureuser/MyWebapp/project.json...
log  : Restoring packages for tool 'Microsoft.Extensions.SecretManager.Tools' in /home/azureuser/MyWebapp/project.json...
log  : Restoring packages for tool 'Microsoft.VisualStudio.Web.CodeGeneration.Tools' in /home/azureuser/MyWebapp/project.json...
log  : Writing lock file to disk. Path: /home/azureuser/MyWebapp/project.lock.json
log  : /home/azureuser/MyWebapp/project.json
log  : Restore completed in 9331ms.

[azureuser@XXXXXXXX MyWebapp]$ dotnet run
Project MyWebapp (.NETCoreApp,Version=v1.1) will be compiled because expected outputs are missing
Compiling MyWebapp for .NETCoreApp,Version=v1.1
/home/azureuser/MyWebapp/project.json(5,30): warning NU1007: Dependency specified was Microsoft.NETCore.App >= 1.1.0-preview1-001153-00 but ended up with Microsoft.NETCore.App 1.1.0.

Compilation succeeded.
    1 Warning(s)
    0 Error(s)

Time elapsed 00:00:02.0095423
 

info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0]
      User profile is available. Using '/home/azureuser/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.
Hosting environment: Production
Content root path: /home/azureuser/MyWebapp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

上記を確認後、ブラウザからアクセスして以下のページが表示されることを確認する。
f:id:waritohutsu:20170101132903p:plain

Windows 上で作ったアプリを CentOS 上で公開する

次に WindowsVisual Studio 上で作成した ASP.NET Core アプリケーションを CentOS で動かそうとしてみる。Visual Studio 2015 Update3 で ASP.NET Core アプリケーションを新規で作成し、以下の様に WinSCP で接続してアプリケーションのモジュールを CentOS 上に配置する。モジュールを配置後、以下の様に dotnet restore を実行してパッケージを復元してアプリケーションを実行してみる。

[azureuser@XXXXXXXX  ~]$ cd OnLinuxWebApp/                                                                                     
[azureuser@XXXXXXXX OnLinuxWebApp]$ dotnet restore                                                                            
log  : Restoring packages for /home/azureuser/OnLinuxWebApp/project.json...
log  : Restoring packages for tool 'BundlerMinifier.Core' in /home/azureuser/OnLinuxWebApp/project.json...
log  : Restoring packages for tool 'Microsoft.AspNetCore.Razor.Tools' in /home/azureuser/OnLinuxWebApp/project.json...
log  : Restoring packages for tool 'Microsoft.AspNetCore.Server.IISIntegration.Tools' in /home/azureuser/OnLinuxWebApp/project.json...
log  : Writing lock file to disk. Path: /home/azureuser/OnLinuxWebApp/project.lock.json
log  : /home/azureuser/OnLinuxWebApp/project.json
log  : Restore completed in 7477ms.
[azureuser@CentWebVM OnLinuxWebApp]$ 
[azureuser@CentWebVM OnLinuxWebApp]$ dotnet run                                                                                
Project OnLinuxWebApp (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling OnLinuxWebApp for .NETCoreApp,Version=v1.0

Compilation succeeded.
    0 Warning(s)
    0 Error(s)

Time elapsed 00:00:01.3216328
 

The specified framework 'Microsoft.NETCore.App', version '1.0.1' was not found.
  - Check application dependencies and target a framework version installed at:
      /opt/dotnet/shared/Microsoft.NETCore.App
  - The following versions are installed:
      1.1.0
  - Alternatively, install the framework version '1.0.1'.

上記を確認すると Visual Studio 上で作成したアプリケーションは 'Microsoft.NETCore.App' のバージョンが '1.0.1' だが、同バージョンのモジュールが見つからずにアプリケーションが実行できない旨が表示されている。
仕方がないので、試しに他の .NET Core アプリケーションを Linux 上で作成して Microsoft.NETCore.App のバージョンを確認する。

[azureuser@XXXXXXXX ~]$ mkdir HelloApp
[azureuser@XXXXXXXX ~]$ cd HelloApp
[azureuser@XXXXXXXX HelloApp]$ dotnet new 
Created new C# project in /home/azureuser.
[azureuser@XXXXXXXX HelloApp]$ head -n 14 project.json 
{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {},
  "frameworks": {
    "netcoreapp1.1": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.1.0"
        }

上記から 1.1.0 のバージョンであれば有効であることが分かる。Visual Studio で作成したアプリケーションの project.json 内の Microsoft.NETCore.App をバージョン 1.1.0 に修正し、再度 dotnet restore を実行してアプリケーションを起動する。

[azureuser@XXXXXXXX OnLinuxWebApp]$ dotnet restore
log  : Restoring packages for /home/azureuser/OnLinuxWebApp/project.json...
log  : Restoring packages for tool 'BundlerMinifier.Core' in /home/azureuser/OnLinuxWebApp/project.json...
log  : Restoring packages for tool 'Microsoft.AspNetCore.Razor.Tools' in /home/azureuser/OnLinuxWebApp/project.json...
log  : Restoring packages for tool 'Microsoft.AspNetCore.Server.IISIntegration.Tools' in /home/azureuser/OnLinuxWebApp/project.json...
log  : Writing lock file to disk. Path: /home/azureuser/OnLinuxWebApp/project.lock.json
log  : /home/azureuser/OnLinuxWebApp/project.json
log  : Restore completed in 7193ms.
[azureuser@CentWebVM OnLinuxWebApp]$ dotnet run
Project OnLinuxWebApp (.NETCoreApp,Version=v1.0) will be compiled because inputs were modified
Compiling OnLinuxWebApp for .NETCoreApp,Version=v1.0

Compilation succeeded.
    0 Warning(s)
    0 Error(s)

Time elapsed 00:00:01.3575381

正常に実行されていればブラウザ越しにアプリケーションにアクセスできるはずだ。実際の運用時には Windows 側と Linux 側でのバージョンの整合性については注意してほしい。