一、背景
最近半年或最近三個月來,公司在計划大刀闊斧的規划重構新的產品。按目前的計划和宣傳還是很令人期待的。前端預計應用現在很流行的前端框架,有Vue、ElementUI等,后端宣傳了很多微服務、持續集成、持續部署、單元測試,最終一致性等諸多理論概念的東西,總之是個我很感興趣的事。最近半年來,我也看了不少微服務、分布式的書,但寫成文檔的卻很少,時間一過,就淡忘了,相當於沒有收獲。趁着這個強烈學習的良機,我買了阿里雲的一台Linux服務器,用於實踐linux下.netcore的部署、運維等。部署過程中,遇到過各種各樣的問題,但都已解決,
如果花了幾天時間解決的問題,不做個記錄,那不是對自己的浪費么?所以,才有了這篇博客
。
二、windows構建
先來構建下windows下發布包,
關於DotNetCore的創建方法我就不具體截圖了,微軟官方文檔有更全的操作,可從網上查詢KestrelHttp示例程序。
對於 ASP.NET Core 2.1 版,Kestrel 默認傳輸不再基於 Libuv,而是基於托管的套接字。
2.1建好項目KestrelDemo運行:
dotnet publish -c release -o "發布目錄"
cd "發布目錄"
dotnet KestrelDemo.dll
在window下查看運行效果,將發布包推到碼雲地址或github地址,便於linux下獲取。

三、跨平台部署
我的阿里雲linux發行版是CentOS7.4,.netcore版本2.0,接下來我們演示部署DotNet環境
3.1 安裝.netCore運行時
注冊Microsoft密鑰
更新yum庫,獲取最新
sudo yum update
sudo yum install aspnetcore-runtime-2.1
查看是否安裝成功
dotnet --version
3.2安裝git
因發布包是用git管理,所以需要centos上安裝git。
yum install git
創建發布目錄
mkdir /cusD/wwwroot/KesPublish
進入發布目錄
cd /cusD/wwwroot/KesPublish
初始化git
git init
拉取git代碼
git pull 發布包地址
3.3啟動
dotnet KestrelDemo.dll
查看發布后效果。正常情況下,簡單的部署就完成了。

但是現在有個問題,當連接用戶的shell斷掉后,dotnet會自動關閉,達不到長期運行的效果。這時候就需要linux的守護進程了。下面我們繼續講述如何創建守護進程
四、守護進程
4.1 概念
Linux Daemon(守護進程)是運行在后台的一種特殊進程。它獨立於控制終端並且周期性地執行某種任務或等待處理某些發生的事件。它不需要用戶輸入就能運行而且提供某種服務,不是對整個系統就是對某個用戶程序提供服務。Linux系統的大多數服務器就是通過守護進程實現的。常見的守護進程包括系統日志進程syslogd、 web服務器httpd、郵件服務器sendmail和數據庫服務器mysqld等...
4.2創建服務文件
sudo nano /etc/systemd/system/KestrelDemoSer.service
4.3示例文件(要有足夠權限)
[Unit]
Description=KestrelDemo running on CentOS
[Service]
WorkingDirectory=/cusD/wwwroot/KesPublish
Type=simple
User=root
Group=root
ExecStart=/usr/bin/dotnet /cusD/wwwroot/KesPublish/KestrelDemo.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
SyslogIdentifier=dotnet-example
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
按CTRL+O保存,CTRL+X退出。
Linux 具有區分大小寫的文件系統。 將 ASPNETCORE_ENVIRONMENT 設置為“生產”會導致搜索配置文件 appsettings.Production.json,而不是 appsettings.production.json。
4.4保存文件並啟用服務
systemctl enable KestrelDemoSer.service
4.5啟用服務,並確認運行
systemctl start KestrelDemoSer.service
systemctl status KestrelDemoSer.service
4.6查看日志
sudo journalctl -fu KestrelDemoSer.service
reboot重啟后,查詢連接是否正常訪問,初學者不熟悉權限問題,最好以root賬號配置

五、擴展關注
Systemctl是一個systemd工具,主要負責控制systemd系統和服務管理器。
Systemd是一個系統管理守護進程、工具和庫的集合,用於取代System V初始進程。Systemd的功能是用於集中管理和配置類UNIX系統。
5.1、查看是否安裝
systemctl --version

5.2、查看安裝目錄
whereis systemd
whereis systemctl

5.3、檢測是否運行
ps -eaf | grep [s]ystemd
5.4、分析systemd啟動進程
systemd-analyze
5.5、分析啟動時各個進程花費時間
systemd-analyze blame

六、遇到問題及解決
6.1、如何選擇linux發行版
這個我沒有什么建議,但是在使用或部署的過程遇到了很多坑,如想安裝服務器圖形界面。我不斷利用阿里雲的更換系統盤功能試用了Debain,Ubuntu,CentOS等,最終就CentOS安裝成功了,所以其他我就放棄了。等把Linux用熟了,我還是會用用其他的發行版的。
6.2、DotNetCore版本問題
如果不找到正確的途徑,沒有事情會是順利的。我從網上找的教程,安裝了.NetCore運行時,然后部署后運行
dotnet 你的dll名稱
提示發布包是2.1版,系統是1.1版。這是個入門坑,找的教程太舊了,。后來嘗試卸載也失敗,就任性的又重新更換了系統盤。按照微軟官方文檔就三行命令解決,見3.1
6.3、Git注意
用mkdir創建好自己的發布目錄后,要調用下
git init
如果不調用,會有報錯提示

6.4、守護進程
這個類似windows的服務,node下有pm2支持,也有python寫的的supervisor可以支持。
我按教程安裝了supervisor,但配置好后,依然不能啟動,有可能是配置不對等原因。
然后就開始查找微軟官方文檔看到了systemd,通過systemctl來配置啟用服務,其實第一次用systemctl status 服務名稱,提示狀態失敗的,后來又重新走了下步驟又好了。然后就是用戶權限的問題,也注意下。
6.5、連接工具
手機上可以用阿里雲字段的SSL工具,電腦端可以用XShell,都很方便。
6.6、常用命令
6.7、編輯器
上篇文章用的MarkDown編輯器,這次用秀米,放到博客園的編輯器后,效果慘不忍睹,最后又復制到有道雲編輯下了,才看着正常了。
七、參考連接
重要提示:有官方資料的以官方最新為准!
DotNetCore內置http服務器項目地址:
dotnet命令行請參考:
安裝.netcore運行時參考連接:
IIS配置DOtNetCore
systemctl參考連接:
linux命令參考連接: