Blank?=False

「呉下の阿蒙にあらず」をモットーにしたITエンジニアの日々

CentOS7でASP.netを動かす

f:id:stonebeach-dakar:20161230093355p:plain

ちょっと業務でASP.netに関わることになったので、自宅でもASP.netで開発が出来るようにしなきゃな・・・ということで、開発環境はVisualStudioがあるので実行環境を構築してみました。

先ずは下調べ

ASP.netとは

Microsoft謹製のWebアプリケーションフレームワーク
.Net環境で動作するため、長い間WindowsServerでしか動作しなかったが、RailsCakePHPに比べてもUIの構築が非常に楽、らしい。
使ったことがないので楽なのかはわかりません

最近、.NetCoreと言う形でMacOSLinuxで正式に動作するようになりました。

.Net Coreとは

ざっと一言で言えば、.NetFrameworkのUI関係部分を消してMacOSLinuxで使えるようにしたもの。

公式 .NET - Powerful Open Source Development


これを使うことで今まではWindowsServerでしか使えなかったASP.netLinuxサーバーで動くようになる。
※今までもMonoを使えば出来たけどMonoの開発元がMicrosoftに買収されたので公式的になった・・・というイメージ。

ちなみに、.NetFrameworkが使えるようになったのでC#MacOSLinuxMicrosoftコンパイラでビルド出来るようになりました。
一昔前では信じられない話だけど、最近のMicrosoftWindowsの囲い込みをやめたので、色々オープンになってきています。

環境構築

プラットフォーム

VisualBoxのVMでminimamインストールしたCentOS7を使います。
RHELディストリビューションならほぼおなじ手順になると思いますが、Debian系の場合異なると思いますので適宜調べてください。

.Net Coreのインストール

公式のインストール方法紹介ページが翻訳の必要もないくらい非常にわかりやすくまとめられています。

.NET - Powerful Open Source Development


ためしにちょっとC#でHelloWorldを作ってみる

公式のインストール紹介にもある通り、dotnet newをやると環境ができあがり、自動的にHelloworldを表示するコード(Program.cs)が作成されます。
拡張子を見れば分かる通り、C#ソースコードです。

$mkdir -p Dotnet/Helloworld
$cd Dotnet/HelloWorld
$dotnet new


Program.cs

using System;

namespace ConsoleApplication
{
    public class Proguram
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        } 
    }
}


dotnet restoreしてからdotnet runすることでコンパイルされ、自動的に実行されます。
restoreせずそのままrunと紹介しているブログもありますが、いきなりrunするとエラーが発生します。

$dotnet restore
$dotnet run


実行結果

 HelloWorld


簡単なASP.netアプリを作成してみる

ASP.netアプリを作成する場合も、dotnet newにオプションを付けることでで作成できます。
これも公式ドキュメントに従います。
Getting Started with ASP.NET Core | Microsoft Docs


まずはASP.net用のディレクトリを作成して、開発環境を構築します。

$mkdir HelloASP
$cd HelloASP
$dotnet new -t web


そして、C#でHelloWorldを作ったときと同様にdotnet restore, dotnet runでビルドして実行します。

$dotnet restore
log  : Restoring packages for /home/sueda/DotNet/HelloASP/project.json...
log  : Installing Microsoft.Composition 1.0.27.
log  : Installing Microsoft.CodeAnalysis.Workspaces.Common 1.3.0.
log  : Installing Microsoft.CodeAnalysis.CSharp.Workspaces 1.3.0.
・
・
・
log  : Writing lock file to disk. Path: /home/sueda/DotNet/HelloASP/project.lock.json
log  : /home/sueda/DotNet/HelloASP/project.json
log  : Restore completed in 45794ms.
$dotnet run
Project HelloASP (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling HelloASP for .NETCoreApp,Version=v1.0

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

Time elapsed 00:00:03.2026926


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


おし、準備できたのでアクセス!と思ったらCUIなのでブラウザは使えません。
そりゃLynxとか使えばできますけど、そういうことじゃない・・・!

というわけで、ホストOSからアクセス出来るようにするためには公開する必要があります。
ASP.netをインストールする時に自動的にインストールされるKestrelサーバーは単機能のWebサーバーなので、また別にWebサーバーを準備する必要があります。

今回はnginxを使います。

nginxのインストール

CentOS7のパッケージ管理ツールであるyumはデフォルトではnginxリポジトリが登録されていません。
その為、まずはリポジトリの登録が必要になります。

幾つかのブログなどで紹介されていますが、ベストは公式に従うことなので公式HPを見ると、最新版のリポジトリの登録手順がありましたのでそれに従いました。
https://nginx.org/en/linux_packages.html#mainline

まず、/etc/yum/repos.d/以下にnginxのリポジトリの設定ファイルを作成します。

#vim /etc/yum/repos.d/nginx.repo


nginx.repo

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


公式ドキュメントにあるとおり、OSとOSRELEASEはそれぞれcentos, 7とします。
他のディストリビューションの場合はドキュメントにあるとおりにそれぞれrhel、等に設定してください。

そういえばFedraは書いてないけどどうなるんだろう・・・

無事リポジトリの登録が完了すれば、後はyumでnginxをインストールするだけです。

#yum -y install nginx

nginxの設定

nginxを準備したものの、どうすれば良いんだろうとぐぐってみたら正に似たような構成の構築方法がありました。

qiita.com


これに従い、リバースプロキシという、一次アクセスを受け取ったら別のWebサーバにリダイレクトする機能を使います。
MicrosoftASP.net Coreの公式ドキュメントの方は見つかりませんでした。

元記事では、ユーザーのIPアドレスが欲しいため一部異なる設定になっていますが、今回はテストなので標準的な設定を行います。

まず、/etc/nginx/conf.d/ディレクトリにあるdefault.confを削除します。

#rm -f /etc/nginx/conf.d/default.conf


そして、vimでHelloASP.confを新規作成します。
80番ポートにして、localhostの5000番ポートへアクセスするよう設定します。

#vim /etc/nginx/conf.d/HelloASP.conf


HelloASP.conf

server {
  listen 80;
  server_name HelloASP.jp;
  location / {
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}


設定が終わったら、設定のテストを行います。ここでエラーが発生したら設定を見直してください。
CentOSなのでroot権限でログインするか、管理者である必要があります。

$nginx -t


問題なければ、nginxを起動します。

$systemctl start nginx


無事立ち上がったら、ホストOSのブラウザからゲストOSのIPアドレスを入力して、アクセスします。

f:id:stonebeach-dakar:20161230093230p:plain


OK、問題なしだ。
HelloWorldじゃないけど


nginxを終了する場合は以下を入力します。

$systemctl stop nginx

あとがき

結構やることは色々ありますが、結構スムーズに出来ました。
LPICの勉強を通してLinuxの知識がついたのか、何かトラブルがあってもアッサリ解決できるようになったので、自分の成長を実感出来るいい機会でした。

ASP.netの勉強ですが昔購入して積んでいた↓を使ってみようと思います。

TECHNICAL MASTERはじめてのASP.NET Webフォームアプリ開発C#対応版

TECHNICAL MASTERはじめてのASP.NET Webフォームアプリ開発C#対応版