はじめに
最近、会社でLinuxシステム上で動作するプロジェクトを開発する必要があり、サンプル開発プロジェクトは.NET Core + Angularで開発しています。理論上は完全にクロスプラットフォームをサポートしています。
しかし、実践こそが真理を検証する唯一の基準です。そこで実際に手を動かして検証・実装してみることにしました。その過程で何か問題が発生しても、それは経験として蓄積されます。
一、環境準備
今回は主にプロジェクトのLinux環境へのデプロイを検証するため、わざわざ仮想マシン環境を新しく構築する必要はなく、Windows 10のLinuxサブシステム(WSLとは?)を使用します。
- WSLの有効化手順:
- [Windowsの機能の有効化または無効化] に移動し、WSLを有効にします。下図参照。

- Microsoft Storeに入り、該当するバージョンを選択します。今回はCentOSをインストールしました。

- インストール完了後、起動時に(問題が発生)。

最終的に問題の原因が判明しました:Linuxカーネルパッケージの更新が必要(更新パッケージのダウンロード先:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)
ダウンロードしてインストール後、CentOSシステム環境の準備が整いました。
- .NET Core環境のインストール:
- システムの基本ソフトウェアバージョンを更新(任意)
sudo yum update
- マイクロソフトの署名キーを登録:
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
- .NET Core SDKをインストールします。サンプルプログラムは3.1バージョンで開発(サイト管理者注:現在2022年5月11日、.NET 7 Preview 4が公開されています)。
sudo yum install dotnet-sdk-3.1
- インストールの成功を確認。以下の画像のように表示されれば成功です。

- Nginx環境のインストール:(Webプロジェクトのデプロイ用)
- 依存環境のインストール
yum install gcc-c++
yum install pcre pcre-devel
yum install zlib zlib-devel
yum install openssl openssl--devel
- Nginxのyumリポジトリを追加
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- Nginxをインストール
sudo yum install nginx
- Nginxの基本情報
ディレクトリ構成:
| Nginx ディレクトリ | |
|---|---|
| 設定パス | /etc/nginx/ |
| エラーログ | /var/log/nginx/error.log |
| アクセスログ | /var/log/nginx/access.log |
| デフォルトサイトディレクトリ | /usr/share/nginx/html |
基本コマンド:
- nginx // Nginx起動
- nginx -s quit // Nginx停止
- nginx -s reload // 設定ファイル再読み込み
二、プロジェクトデプロイ
CentOSへのプロジェクトデプロイには複数の方法があります:直接実行、Dockerデプロイ(これまでの学習記事で何度も使用)。今回は直接実行方式でアプリケーションをデプロイします。プロジェクトはフロントエンドとバックエンドを分離して実装しているため、それぞれデプロイする必要があります。
- サーバーサイドのデプロイ
- サーバーサイドのプロジェクトファイルをCentOSのディレクトリにコピー:今回のデプロイパスは
/home/www/publish

- 設定ファイルの修正:vimコマンドを使用(個別にインストールが必要)
コマンドで設定ファイルの編集に入ります:
vim appsettings.json
編集完了後、以下のコマンドで終了します。
vimコマンド
:w 保存して終了しない
:wq 保存して終了
:q 終了
:q! 強制終了、保存しない
:e! すべての変更を破棄し、最後に保存したファイルから編集を再開

- サービスの起動
プロジェクトディレクトリに移動してコマンドを実行:
[root@Coder supervisor]# cd /home/www/publish
[root@Coder publish]# dotnet ZLSoft.UnifiedDS.Web.Host.dll --urls http://*:8220

- フロントエンドプロジェクトのデプロイ
Webプロジェクトを
/home/www/webにコピーNginx設定ファイルディレクトリに設定ファイル
web.confを追加
server {
listen 8221;
server_name 192.168.243.86:8220;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /home/www/web;
index index.html index.htm;
try_files $uri $uri/ /index.html?$query_string;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
注意:Angularプロジェクトでルーティングリダイレクトを使用している場合は、マークされた内容を使用する必要があります。
- Nginx設定ファイルを更新:
/usr/sbin/nginx -s reload
三、実行例
サーバーサイドの実行:

Webプロジェクトの実行結果:

これでプロジェクトは正常に実行されました。しかし、CentOSのコマンドを終了するとWebサーバーサイドも停止してしまうため、サービスをデーモン化する必要があります。
四、デーモンプロセスの作成 - supervisor
- supervisorのインストール
# pythonの拡張機能をインストール
yum install python-setuptools
# pythonの拡張機能を通じてsupervisorをインストール
easy_install supervisor
# 設定フォルダを作成
mkdir /etc/supervisor
mkdir /etc/supervisor/conf.d
# 設定ファイルを作成
echo_supervisord_conf > /etc/supervisor/supervisord.conf
# 設定ファイルを修正(supervisord.d フォルダ内のすべての ini ファイルが設定ファイル)
# ファイル /etc/supervisor/supervisord.conf 末尾
;files = relative/directory/*.ini を files = conf.d/*.ini に変更
- 設定ファイルの作成:
/etc/supervisor/conf.dディレクトリにpublish.confを作成
[program:publish]
command=dotnet ZLSoft.UnifiedDS.Web.Host.dll --urls http://192.168.243.86:8220 # 実行コマンド
directory=/home/www/publish # プログラムパス
environment=ASPNETCORE__ENVIRONMENT=Production
user=root
stopsignal=INT
autostart=true # 自動起動
autorestart=true # 3秒で自動再起動
startsecs=3
stderr_logfile=/var/log/ossoffical.err.log
stdout_logfile=/var/log/ossoffical.out.log
- サービスの起動
# supervisorディレクトリに移動
cd /etc/supervisor
# supervisord サービスを起動
supervisord -c supervisord.conf
- デーモンプロセスのWeb管理機能を有効化
# 設定ファイルを修正:
vim /etc/supervisord.conf
# コメントアウトを解除
[inet_http_server] ; inet (TCP) server disabled by default
port=*:9001 ; ip_address:port specifier, *:port for all iface
username=user ; default is no username (open server)
password=123 ; default is no password (open server)
# 設定ファイルを再読み込み
supervisorctl reload
- supervisorctl よく使うコマンド
$ sudo service supervisor stop # supervisorサービス停止
$ sudo service supervisor start # supervisorサービス起動
$ supervisorctl shutdown # すべてのタスクを閉じる
$ supervisorctl stop|start program_name # サービスを起動または停止
$ supervisorctl status # すべてのタスクの状態を確認
五、まとめ
CentOSシステムでプロジェクトをデプロイ・実行するには、主にLinuxに関する内容(コマンド、権限、ソフトウェアなど)に習熟しているかどうかが重要です。何であれ、習うより慣れよ、練習を重ねることが大切です。
また、WSL上のLinuxシステムはまだ完全ではなく、サービスやファイアウォールに関する機能が一時的にありません。そのため、本番環境ではサービスの自動起動設定やファイアウォール関連の処理を行うことができます。
したがって、学習と練習には完全な環境を用意する必要があります。