前言
最近公司需要開發專案能在 Linux 系統上執行,範例開發專案採用 .NET Core + Angular 開發;理論上完全支援跨平台。
但是實踐才是檢驗真理的唯一標準;那麼還是動手來驗證實作一下;過程中萬一出現什麼問題也算是累積經驗。
一、環境準備
由於本次主要驗證專案部署 Linux 環境,也不想去重新搭建一個虛擬機器環境;就使用 Win10 中 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
- 註冊 Microsoft 簽章金鑰:
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 部署(前面學習文章已多次使用),本次就採用直接執行方式來部署應用程式。由於專案採用前後端分離實作,需要分別部署
- 伺服器端部署
1、將伺服器端專案檔案複製到 CentOS 目錄中:本次部署路徑為:/home/www/publish

2、修改設定檔:需要使用 vim 指令(需要單獨安裝)
透過指令進入設定檔編輯:
vim appsettings.json
編輯完成後採用以下指令退出
vim指令
:w 儲存但不退出
:wq 儲存並退出
:q 退出
:q! 強制退出,不儲存
:e! 放棄所有修改,從上次儲存檔案開始再編輯指令歷史

3、啟動服務
進入專案目錄執行指令:
[root@Coder supervisor]# cd /home/www/publish
[root@Coder publish]# dotnet ZLSoft.UnifiedDS.Web.Host.dll --urls http://*:8220

- 前端專案部署
1、將 Web 專案複製到:/home/www/web
2、在 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 專案中使用了路由重新導向,則需要使用標記內容
3、更新 Nginx 設定檔:
/usr/sbin/nginx -s reload
三、執行範例
伺服器端執行:

Web 專案執行效果:

到此專案已成功執行,但是當我把 CentOS 指令結束執行,則 Web 伺服器端停止執行,那麼需要把建立服務實作守護行程
四、守護行程建立 – supervisor
1、安裝 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
2、建立設定檔:在/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
3、啟動服務
#進入supervisor目錄
cd /etc/supervisor
#啟動supervisord 服務
supervisord -c supervisord.conf
4、開啟守護行程的介面管理功能
#修改設定檔:
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
5、supervisorctl 常用指令
$ sudo service supervisor stop 停止supervisor服務
$ sudo service supervisor start 啟動supervisor服務
$ supervisorctl shutdown #關閉所有任務
$ supervisorctl stop|start program_name #啟動或停止服務
$ supervisorctl status #檢視所有任務狀態
五、總結
在 CentOS 系統中執行部署執行專案,主要是 Linux 相關內容是否熟練:如指令、權限、軟體等相關內容,不管什麼還是需要熟能生巧,多加練習吧。
另外 WSL 中的 Linux 系統還是不夠全面,暫時沒有服務、防火牆相關功能,所以如果在真實環境中,可以設定服務開機啟動、以及防火牆相關處理。
所以還是需要找個完整環境進行學習練習。