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 root@10.201.80.126:/var/www --以下命令將zip包拷貝到 /var/www目錄下
- 在CentOS服務器上解壓
unzip -d eqidproxyServer eqidproxyServer.zip
- 執行dotnet EqidProxyServer.dll
3. 使用systemd將dotnet進程設置成Linux守護進程
完成以上步驟,dotnet程序並不能在後臺作為服務運行,Nginx雖然能作為反向代理服務器轉發請求到dotnet進程, 但是並不具備管理dotnet進程的能力。
下面使用 systemd來將dotnet進程設定為系統服務。
① 創建服務文件:vim /etc/systemd/system/kestrel-eqidproxyserver.servicesystemd是一個Linux的系統服務管理器,其作用是提供系統服務依賴管理 、實現系統初始化時服務的並行啟動。
[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 { listen 80; server_name default_website; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; 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; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-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包源: https://docs.microsoft.com/en-us/windows-server/administration/linux-package-repository-for-microsoft-software
rpm/yum區別: https://zhuanlan.zhihu.com/p/27724520
Linux進程管理:https://linux.cn/article-3801-1.html
ASP.NET Core在CentOS上的最小化部署實踐