前回までで一応アプリができたことにして、万が一公開する時の設定を試してみます。
通常、公開するときは何らかの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。