年明け一発目の投稿では 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.
上記を確認後、ブラウザからアクセスして以下のページが表示されることを確認する。
Windows 上で作ったアプリを CentOS 上で公開する
次に Windows の Visual 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 側でのバージョンの整合性については注意してほしい。