年明け一発目の投稿では 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 の 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 側でのバージョンの整合性については注意してほしい。