ASP.NET Core在CentOS上的最小化部署實踐
本文從Linux小白的視角, 在CentOS上搭建一個ASP.NET Core Web應用程式; 在Linux上部署ASP.NET Core 程式有不少類似步驟教程,但是總感覺知其然不知其所以然,小白總感覺沒有理清部署思路,鬍子眉毛一把抓。
本文給Linux新手呈現一個最小化的部署例項,循序漸進的講解部署的思路, 最後文末提供相關的避坑資料、必備知識點。
部署架構:

首先明確dotnet程式是一個獨立程序, 原本可不依賴反向代理伺服器執行;
第二明確Nginx反向代理伺服器的作用;
第三明確dotnet程式需要在Linux系統中以守護程序的方式執行,可使用 supervisor、systemd等方式。
1. 安裝環境
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm-- rpm是一種軟體包管理方式,這裡的微軟軟體包倉庫以rpm包的形式提供,包含倉庫配置和供發行版認證軟體包的公鑰,你可以理解為添加了一個nuget包倉庫 sudo yum update sudo yum install aspnetcore-runtime-2.2 -- 基於rpm包管理,能夠從指定伺服器自動下載rpm包並且安裝,可自動處理依賴關係,並一次安裝所有依賴軟體包。
2. dotnet程式釋出、測試
- 使用VS專案右鍵釋出到指定目錄
- 使用zip方式打包
- 使用scp,SFTP工具上傳到Linux伺服器, 一般情況下拷貝到var目錄
scp D:\production\eqidproxyServer.zip [email protected]:/var/www--以下命令將zip包拷貝到 /var/www目錄下
- 在CentOS伺服器上解壓
unzip -d eqidproxyServer eqidproxyServer.zip
- 執行dotnet EqidProxyServer.dll
3. 使用systemd將dotnet程序設定成Linux守護程序
完成以上步驟,dotnet程式並不能在後臺作為服務執行,Nginx雖然能作為反向代理伺服器轉發請求到dotnet程序, 但是並不具備管理dotnet程序的能力。
下面使用 systemd來將dotnet程序設定為系統服務。
systemd是一個Linux的系統服務管理器,其作用是提供系統服務依賴管理 、實現系統初始化時服務的並行啟動。
① 建立服務檔案:vim /etc/systemd/system/kestrel-eqidproxyserver.service
[Unit] Description=EqidProxyServer deploy on centos [Service] WorkingDirectory=/var/www/eqidproxyserver/eqidproxyServer ExecStart=/usr/bin/dotnet /var/www/eqidproxyserver/eqidproxyServer/EqidProxyServer.dll Restart=always # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 TimeoutStopSec=90 KillSignal=SIGINT SyslogIdentifier=dotnet-example User=www-data Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
注意:Linux 是大小寫敏感的檔案系統,設定ASPNETCORE_ENVIRONMENT=Production 會在配置檔案中搜索如下配置檔案: appsettings.Production.json, 故配置和檔名需要留意匹配。
② 啟用、啟動服務
sudo systemctl enable kestrel-eqidproxyserver.service // 啟用服務 sudo systemctl start kestrel-eqidproxyserver.service // 指定服務名啟動 sudo systemctl status kestrel-eqidproxyserver.service // 驗證服務狀態
以下是驗證服務狀態的輸出:
● kestrel-eqidproxyserver.service - EqidProxyServer deploy on centos Loaded: loaded (/etc/systemd/system/kestrel-eqidproxyserver.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2019-02-28 18:04:20 CST; 3min 2s ago Main PID: 52859 (dotnet) Memory: 46.3M CGroup: /system.slice/kestrel-eqidproxyserver.service └─52859 /usr/bin/dotnet /var/www/eqidproxyserver/eqidproxyServer/EqidProxyServer.dll Feb 28 18:06:18 gs-server-5809 dotnet-eqidproxyserver[52859]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] Feb 28 18:06:18 gs-server-5809 dotnet-eqidproxyserver[52859]: Request finished in 136.6715ms 200 Feb 28 18:06:23 gs-server-5809 dotnet-eqidproxyserver[52859]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] Feb 28 18:06:23 gs-server-5809 dotnet-eqidproxyserver[52859]: Request starting HTTP/1.1 GET http://127.0.0.1/ Feb 28 18:06:23 gs-server-5809 dotnet-eqidproxyserver[52859]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] Feb 28 18:06:23 gs-server-5809 dotnet-eqidproxyserver[52859]: Request finished in 3.5599ms 200 Feb 28 18:06:32 gs-server-5809 dotnet-eqidproxyserver[52859]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] Feb 28 18:06:32 gs-server-5809 dotnet-eqidproxyserver[52859]: Request starting HTTP/1.1 GET http://10.201.80.126/ Feb 28 18:06:32 gs-server-5809 dotnet-eqidproxyserver[52859]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] Feb 28 18:06:32 gs-server-5809 dotnet-eqidproxyserver[52859]: Request finished in 1.3498ms 200
4. 搭配Nginx部署web程式
① 安裝Nginx
- sudo yum install nginx 【首次安裝需要顯式啟動: sudo service nginx start】
CentOS安裝的nginx並沒有作為守護程序執行,執行sudo systemctl enable nginx 啟用nginx守護程序: https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7
Ubuntu 中使用 apt-get 安裝的nginx, 安裝器會建立systemd init script,也就是說nginx會隨著系統啟動作為守護程式執行。
- 在終端使用curl localhost 測試nginx
② 配置Nginx作為反向代理伺服器
- 修改/etc/nginx/nginx.conf 檔案: sudo vi /etc/nginx/nginx.conf
- 配置nginx在80埠將請求轉發到Kestrel伺服器(localhost:5000)
server { listen80; server_namedefault_website; root/usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_passhttp://localhost:5000; proxy_http_version 1.1; proxy_set_headerUpgrade $http_upgrade; proxy_set_headerConnection keep-alive; proxy_set_headerHost $host; proxy_cache_bypass $http_upgrade; proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_headerX-Forwarded-Proto $scheme; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
一旦nginx配置完成,可以使用sudo nginx -t 測試配置檔案的語法;
如果配置檔案合法,就可以重啟nginx: sudo nginx -s reload
完成以上步驟之後,現在已經可以從127.0.0.1、127.0.0.1:5000、 伺服器IP訪問web程式。
5.檢視程序日誌
使用systemd方式管理程序,所有事件和程序都會記錄到某個集中日誌,該集中日誌包含所有被systend管理的服務和程序的日誌。
這個日誌功能相當於windows伺服器中的事件檢視器。
檢視剛才建立的服務日誌, 可使用下面的命令:
sudo journalctl -fu kestrel-eqidproxysever.service
時間過濾:
sudo journalctl -fu kestrel-eqidproxysever.service --since "2018-11-18" --until "2019-03-28 04:00"
部分內容參考: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?viw=aspnetcore-2.2
rpm/yum區別: https://zhuanlan.zhihu.com/p/27724520
Linux程序管理: https://linux.cn/article-3801-1.html