うさ☆うさ日記 このページをアンテナに追加 RSSフィード

2006 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 05 | 06 |
2013 | 05 | 08 | 09 | 10 | 11 | 12 |
2014 | 08 |
2015 | 04 | 06 | 08 | 09 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 09 | 11 | 12 |
2017 | 04 | 05 | 06 | 10 | 11 |
2018 | 03 |

2016-11-24

[][]CentOS 7.2上にASP.NET Core Webアプリデプロイしてサービス化する

昨日の続きとして、.NET Core 1.1をインストールしたCentOS上に、Visual Studioで作ったASP.NET Core Webアプリデプロイして、ついでにサービス化する方法について(・ω・)

手順

nginxとの連携とかはせず、ASP.NET Core Webアプリを動かす最低限の作業について記述。

また、アプリビルドCentOS上で行うのではなく、Visual Studio上でビルドしたものをCentOSデプロイするパターンについて記述。

プロジェクト作成

Visual Studioで「ASP.NET Core Web Application (.NET Core)」を作成。

1.1へ更新

Visual Studioで作成されるひな形は1.0用の構成。

CentOSには1.1が入っているので1.1用に更新。

まずはNuGetですべてのパッケージを更新。


次に、project.jsonの次の箇所を更新。

  • 変更前
  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },
  • 変更後
  "frameworks": {
    "netcoreapp1.1": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },

また、次の箇所も変更。

  • 変更前
    "Microsoft.NETCore.App": "1.1.0",
  • 変更後
    "Microsoft.NETCore.App": {
      "version": "1.1.0",
      "type": "platform"
    },

project.json全体は以下のような内容。

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.1.0",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Diagnostics": "1.1.0",
    "Microsoft.AspNetCore.Mvc": "1.1.0",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Routing": "1.1.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
    "Microsoft.AspNetCore.StaticFiles": "1.1.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0",
    "Microsoft.Extensions.Configuration.Json": "1.1.0",
    "Microsoft.Extensions.Logging": "1.1.0",
    "Microsoft.Extensions.Logging.Console": "1.1.0",
    "Microsoft.Extensions.Logging.Debug": "1.1.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.1.0",
  },

  "tools": {
    "BundlerMinifier.Core": "2.2.306",
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
  },

  "frameworks": {
    "netcoreapp1.1": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "**/*.cshtml",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "prepublish": [ "bower install", "dotnet bundle" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}
URL設定

デフォルトではlocalhostからのアクセスのみ許可されるので、外部からも接続できるようにUseUrls()の記述を追加。

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseUrls("http://*:80/")
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

なお、この時点でVisual Studio上でもデバッグ動作できることを確認しておく。

できなければ何かが不足している状態。

デプロイ

今回はLinux上でビルドするのではなく、開発環境上でビルドしたものを配布する。


Visual Studioの[ビルド]メニューからアプリケーションの発行を実施。

発行方法は「ファイルシステム」で、ターゲットの場所はデフォルトだと「.\bin\Release\PublishOutput」。

上記フォルダの内容がCentOS上へコピーするファイル。


なお、発行と同じことをコマンドラインからMSBuildで行う場合、以下のコマンドで指定したディレクトリにファイルを作成可能。

MSBuild src\Xxx\Xxx.xproj /p:Configuration=Release /t:PackagePublish /p:PublishOutputPathNoTrailingSlash=bin\Release\PublishOutput
Firewall設定

CentOSに対して外部から接続可能にするためFirewallを設定。

[root@centos ~]# firewall-cmd --zone=public --add-port=http --permanent
success
[root@centos ~]# firewall-cmd --reload
success
[root@centos ~]#
動作確認

CentOS上のコピー先は「/opt/webapp」として、そこに移動してdotnetコマンドを実行。

[root@centos ~]# cd /opt/webapp
[root@centos webapp]# dotnet WebApplication.dll
Hosting environment: Production
Content root path: /opt/webapp
Now listening on: http://*:80
Application started. Press Ctrl+C to shut down.

この状態で、外部からWebブラウザで動作を確認する。

問題がなければ画面が表示され、コンソールにもログが表示される。

サービス化

ついでに上記アプリケーションのサービス化。


まず、起動用のスクリプトとして以下のような/opt/webapp.shを作成。

#!/bin/bash

cd /opt/webapp
dotnet WebApplication.dll

実行権限の設定。

[root@centos ~]# chmod 755 /opt/webapp.sh

次に、サービスの起動スクリプトとして以下のような/etc/systemd/system/webapp.serviceを作成。

[Unit]
Description = webapp daemon

[Service]
ExecStart = /opt/webapp.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

以下のコマンドで正しく作成されていることを確認。

[root@centos ~]# systemctl list-unit-files --type=service | grep webapp
webapp.service                              enabled

サービスの開始。

[root@centos ~]# systemctl start webapp

これで、OS再起動してもWebアプリケーションが起動。

なお、これはあくまで最低限の設定なので、実際にプロダクションに導入する際には、もう少しスクリプトの内容を検討すること。


…っということで、これで実行環境がLinuxだからという理由でJavaでWebアプリを作っていたような人達も、.NET Coreで同程度のことはできるようになったわけで、これまで.NETのウィークポイントであった実行環境面が克服されたのでした٩(๑´3`๑)۶

みんな、これからはWebアプリASP.NET Coreで作るのじゃ(`・ω・´)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/machi_pon/20161124/1479970253
リンク元