前回までで一応アプリができたことにして、万が一公開する時の設定を試してみます。

通常、公開するときは何らかのWebサーバを経由して公開すると思うんで、こちらを参考にNginxのリバースプロキシ設定をします。

nginxインストール

nginxは本家のパッケージを使うようにします。

Pre-Built Packages for Stable versionのFor UbuntuとFor Debian/Ubuntuを参考に(というかそのまま)インストールします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
vagrant@vagrant:~$ mkdir temp
vagrant@vagrant:~$ cd temp
vagrant@vagrant:~/temp$ curl http://nginx.org/keys/nginx_signing.key > nginx_signing.key
vagrant@vagrant:~/temp$ sudo apt-key add nginx_signing.key
OK
vagrant@vagrant:~/temp$ sudo nano  /etc/apt/sources.list
# http://nginx.org/en/linux_packages.html
deb http://nginx.org/packages/ubuntu/ xenial nginx         #追記
deb-src http://nginx.org/packages/ubuntu/ xenial nginx     #追記

vagrant@vagrant:~/temp$ sudo apt-get update
vagrant@vagrant:~/temp$ sudo apt-get install nginx
vagrant@vagrant:~/temp$ nginx -v
nginx version: nginx/1.12.0

Vagrantfileに

1
config.vm.network "forwarded_port", guest: 80, host: 8080

を追加して、vagrant reload

http://localhost:8080/にアクセスして確認。

リバースプロキシ設定

1
vagrant@vagrant:~$ sudo nano /etc/nginx/conf.d/default.conf

元の”location /”の定義をリバースプロキシにします。たぶん本番じゃ使えないよろしくない設定。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#    location / {
#        root   /usr/share/nginx/html;
#        index  index.html index.htm;
#    }

    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;
    }

設定リロード

1
vagrant@vagrant:~$ sudo nginx -s reload

http://localhost:8080/にアクセスするとアプリが出るはず。

アプリをサービスにする

いちいちログインしてdotnetコマンドを入れるわけにはいかないんで、systemdに登録します。

MSドキュメントをまねて

1
vagrant@vagrant:~$ sudo nano /etc/systemd/system/kestrel-WebApplication3.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[Unit]
Description=WebApplication3 running on Ubuntu

[Service]
WorkingDirectory=/home/vagrant/src/publish
ExecStart=/usr/bin/dotnet /home/vagrant/src/publish/WebApplication3.dll
Restart=always
RestartSec=10  # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vagrant@vagrant:~$ sudo systemctl enable kestrel-WebApplication3.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kestrel-WebApplication3.service to /etc/systemd/system/kestrel-WebApplication3.service.
vagrant@vagrant:~$ sudo systemctl start kestrel-WebApplication3.service
vagrant@vagrant:~$ sudo systemctl status kestrel-WebApplication3.service
● kestrel-WebApplication3.service - WebApplication3 running on Ubuntu
   Loaded: loaded (/etc/systemd/system/kestrel-WebApplication3.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2017-06-20 02:46:09 UTC; 15s ago
 Main PID: 2005 (dotnet)
    Tasks: 16
   Memory: 39.6M
      CPU: 2.709s
   CGroup: /system.slice/kestrel-WebApplication3.service
           └─2005 /usr/bin/dotnet /home/vagrant/src/publish/WebApplication3.dll

Jun 20 02:46:11 vagrant dotnet-example[2005]:       Executed DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
Jun 20 02:46:11 vagrant dotnet-example[2005]:       SELECT "MigrationId", "ProductVersion"
Jun 20 02:46:11 vagrant dotnet-example[2005]:       FROM "__EFMigrationsHistory"
Jun 20 02:46:11 vagrant dotnet-example[2005]:       ORDER BY "MigrationId";
Jun 20 02:46:11 vagrant dotnet-example[2005]: dbug: Npgsql.NpgsqlConnection[4]
Jun 20 02:46:11 vagrant dotnet-example[2005]:       Closing connection to database 'aspnetdb' on server 'tcp://localhost:5432'.
Jun 20 02:46:12 vagrant dotnet-example[2005]: Hosting environment: Production
Jun 20 02:46:12 vagrant dotnet-example[2005]: Content root path: /home/vagrant/src/publish
Jun 20 02:46:12 vagrant dotnet-example[2005]: Now listening on: http://0.0.0.0:5000
Jun 20 02:46:12 vagrant dotnet-example[2005]: Application started. Press Ctrl+C to shut down.

リブートしても動いてればOK。

サブディレクトリで動くようにする

appsettings.*.jsonでURLを切り替え

“location /”にリバースプロキシを設定しましたが、実用的でないのでサブディレクトリで動くようにします。

エントリーポイントのMainメソッド内の、UseUrlsにサブディレクトリ付きでURLを渡せばいいみたいですが、ハードコードは嫌なのでappsettings.*.jsonでURLを切り替えたいところです。

appsettings.*.jsonはStartupクラスで読み込んでいますが、Mainからはアクセスできないようなので、Mainからも別に読むようにします。

読み込み処理は共通化したいのでStartupにstaticメソッドを追加。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public class Startup
    {
        //読み込み処理を公開
        public static IConfigurationRoot BulidConfiguration(string basePath,string EnvironmentName) {
            var builder = new ConfigurationBuilder()
                .SetBasePath(basePath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            return builder.Build();
        }

        public Startup(IHostingEnvironment env)
        {
          //変更
            Configuration = BulidConfiguration(env.ContentRootPath, env.EnvironmentName);
        }
....

こちらのコメントを参考に環境別のappsettings.*.jsonから設定を読むようにします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public static void Main(string[] args)
        {
            var hostBuilder = new WebHostBuilder();

            var config = Startup.BulidConfiguration(Directory.GetCurrentDirectory(), hostBuilder.GetSetting("environment"));
            var urls = config.GetSection("urls").Value;

            var host=hostBuilder
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseUrls(urls) // 公開設定
                .UseApplicationInsights()
                .Build();

            host.Run();
        }

appsettings.*.jsonに”urls”を追加します。

appsettings.jsonには

1
2
3
4
5
6
7
8
9
{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "urls": "http://0.0.0.0:5000/"
}

appsettings.Development.jsonには

1
"urls": "http://0.0.0.0:5000/dev"

appsettings.Production.jsonには

1
"urls": "http://0.0.0.0:5000/App3"

としてみました。

デバッグ実行で

1
2
3
4
Hosting environment: Development
Content root path: c:\usr\vstest\WebApplication3\WebApplication3
Now listening on: http://0.0.0.0:5000/dev
Application started. Press Ctrl+C to shut down.

こんなログが出てhttp://localhost:5000/devで問題なく動けばOK。

deployとnginxの設定

例によって

dotnet publish -r ubuntu.16.04-x64 -c Release

して、コピー

アプリリスタート

1
2
3
vagrant@vagrant:~$ sudo systemctl restart kestrel-WebApplication3.service
vagrant@vagrant:~$ sudo systemctl status kestrel-WebApplication3.service
Now listening on: http://0.0.0.0:5000/app3  #<-- appsettings.Production.jsonのurlで待ち受けしてる

/etc/nginx/conf.d/default.confの”location /”を元に戻して,”location /app3″を設定します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /app3 {
        proxy_pass http://localhost:5000/app3;
        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;
    }

sudo nginx -s reloadしてhttp://localhost:8080/app3でアプリが動けばOK。