ASP.NET Core実行環境の構築
ASP.NET CoreをUNIXドメインソケットでListenし、nginxをリバースプロキシとする。これをsupervisroでデーモン化する。
なお、UNIXドメインソケットは以下のようなメリットがあるらしい。
- 高速通信: UNIXドメインソケットは、TCP/IPよりも高速に通信できるため、ウェブサーバーとアプリケーションサーバー間の通信が迅速になります。
- 低レイテンシ: ネットワークスタックをバイパスするため、レイテンシが低くなります。
- セキュリティ: ローカルホスト内での通信に限定されるため、外部からのアクセスが難しくなり、セキュリティが向上します。
- リソース効率: ネットワークプロトコルを使用しないため、CPUやメモリの使用量が減少します。
.NETランタイムのインストール
asp.net coreを実行するため、以下のラインタイムをインストールする(公式)
(※dotnet-runtime-8.0 はAspを含まない。)
sudo apt-get install -y aspnetcore-runtime-8.0
インストール後以下でバージョンを確認できる
dotnet --info
動作確認用アプリの作成
動作確認用に別PCでASP.NEW Core Webアプリケーションを作成する。
Program.csの5行目あたりに以下のコードを追加する。
(※環境変数への指定でUNIXドメインソケットでListnできるようにしておく)
var sockPath = Environment.GetEnvironmentVariable("UNIX_DOMAIN_SOCKET");
if (!string.IsNullOrEmpty(sockPath))
{
if (System.IO.File.Exists(sockPath)) System.IO.File.Delete(sockPath);
builder.WebHost.ConfigureKestrel((context, options) => options.ListenUnixSocket(sockPath));
}
else
{
builder.WebHost.UseUrls("http://*:5000/");
}
ビルドしたら任意の場所にアップして、以下コマンドで起動できること、http://[hostname]:5000 でアクセスできることを確認する。
確認したら停止しておく。
dotnet WebApplicationTest.dll
info: Microsoft.Hosting.Lifetime[14] Now listening on: http://[::]:5000 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] ...
supervisorのインストール
supervisorはプロセスの管理/デーモン化してくれるもの。 asp.net coreを実行するのに利用する。
以下でインストールする。
sudo apt install supervisor
/etc/supervisor/conf.d/
に設定ファイルを追加する
cd /etc/supervisor/conf.d/ touch WebApplicationTest.conf sudo vim WebApplicationTest.conf
先ほど作成した動作確認用のプロジェクトを設定ファイルに設定する
環境変数"UNIX_DOMAIN_SOCKET"にUNIXドメインソケットのファイル名を指定する。
[program:WebApplicationTest]
user=nginx
directory=/home/ubuntu/WebApplicationTest/
command=dotnet WebApplicationTest.dll
autostart=true
autorestart=true
stdout_logfile=/var/log/WebApplicationTest.out.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=5
stderr_logfile=/var/log/WebApplicationTest.err.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=5
stopsignal=TERM
environment=
UNIX_DOMAIN_SOCKET=/tmp/Test.sock,
ENV1=test1
※supervisorでasp.net coreを実行する場合、UnixDomainSocketをnginx側が参照できるように実行ユーザーをnginxとする。
nginxがasp.net coreを実行できるように、nginxをasp.net coreのモジュールの所有者グループに追加し実行できるようにするなど権限設定が必要。
sudo gpasswd -a nginx XXXX groups nginx
設定ファイルを追加、更新した場合は以下コマンドで反映する。
sudo supervisorctl reload
アプリケーションを起動する。
sudo supervisorctl start WebApplicationTest
supervisorのステータスを確認する場合は以下
sudo supervisorctl status
起動・停止・リスタートのコマンドは以下
sudo supervisorctl start [プログラム名] sudo supervisorctl stop [プログラム名] sudo supervisorctl restart [プログラム名]
nginxをリバースプロキシーに設定する
/etc/nginx/nginx.conf
のproxy_passにUNIXドメインソケットのファイル名を指定する。
server {
location / {
proxy_pass http://unix:/tmp/Test.sock;
}
}
nginxに更新した設定を適用する。
sudo nginx -s reload
http://[hostname]にアクセスして、ASP.NET Coreのページが表示されることを確認する