作為一個(gè)Linux新手,許多人向我鼓吹說(shuō)CentOS多么強(qiáng)大,于是我就開(kāi)始把一個(gè)演示程序發(fā)布到CentOS,想試一下它到底有多強(qiáng)大。在此之前,我將同樣的程序已經(jīng)成功發(fā)布到了Ubuntu,我覺(jué)得,既然已經(jīng)有了前一次的成功經(jīng)驗(yàn),不論CentOS還是Ubuntu都是Linux,道理應(yīng)該差不多吧。但事實(shí)證明,還是有些差異的,某些在CentOS上頻出的問(wèn)題在Ubuntu上卻沒(méi)有,所以我的感覺(jué)是Ubuntu部署Asp.net Core程序更容易些。
成都創(chuàng)新互聯(lián)是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的棕樹(shù)數(shù)據(jù)中心服務(wù)過(guò)程很不順利,但最終經(jīng)過(guò)一天摸索已摸清個(gè)七八成,應(yīng)用總算能運(yùn)行了。
Asp.net Core應(yīng)用需要反向代理配合才能運(yùn)行,IIS、Apache和Nginx等Web服務(wù)軟件都可以作為它的反向代理。這里使用Nginx作為反向代理。
1.安裝.NET Core SDK。四個(gè)命令,依次執(zhí)行:
sudo yum install libunwind libicu
curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?linkid=847103
sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
sudo ln -s /opt/dotnet/dotnet /usr/local/bin
2.安裝nginx。
yum install nginx
3.上傳應(yīng)用程序。使用工具不限,在Windows上可以用MobaXterm,這個(gè)東西不錯(cuò),既能登錄系統(tǒng),也能傳送和下載文件,還可以可視化地瀏覽服務(wù)器上的目錄、打開(kāi)文件進(jìn)行編輯。
4. 配置nginx。打開(kāi)/etc/nginx/nginx.conf,找到“server”塊,把以前的東西刪除或注釋掉,再添加如下配置:
listen 80;
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;
}
此時(shí),應(yīng)用內(nèi)部的Kestrel監(jiān)聽(tīng)的端口是5000,而外部用戶訪問(wèn)應(yīng)用仍然使用80端口。
注意找到“user XXX;”這句,"XXX"可以為任何字串,這個(gè)東西要記住,稍后把.net Core應(yīng)用監(jiān)聽(tīng)服務(wù)設(shè)置為系統(tǒng)服務(wù)時(shí)需要它。
5.經(jīng)過(guò)第4步配置后,進(jìn)入應(yīng)用程序所在目錄,執(zhí)行
dotnet app.dll(app.dll是asp.net core應(yīng)用程序發(fā)布后生成的文件,需要用你自己的應(yīng)用名稱替代app.dll)
一切安好的話,此時(shí)應(yīng)用應(yīng)該可以訪問(wèn)了,打開(kāi)瀏覽器去試一下。
到此為止,應(yīng)用程序已經(jīng)部署好了。但是,你發(fā)現(xiàn)了,有個(gè)命令窗口一直開(kāi)著,它就是執(zhí)行dotnet xxxx.dll那個(gè)窗口,如果這個(gè)窗口關(guān)閉了,那么應(yīng)用程序也隨即不能訪問(wèn)了。作為完美型的程序猿,肯定不希望這個(gè)窗口總趴在屏幕上,這時(shí)就用到了系統(tǒng)服務(wù),讓應(yīng)用程序監(jiān)聽(tīng)服務(wù)在系統(tǒng)啟動(dòng)時(shí)自動(dòng)啟動(dòng),省去了每次啟動(dòng)都需要再次執(zhí)行dotnet命令去運(yùn)行服務(wù)。
6.將應(yīng)用程序的監(jiān)聽(tīng)服務(wù)設(shè)置為系統(tǒng)服務(wù)。這一步中,許多介紹部署.net core應(yīng)用的文章都使用一個(gè)叫“Supervisor”的東西,這個(gè)東西我不熟,當(dāng)然,其實(shí)我對(duì)整個(gè)Linux就不熟,通過(guò)參考資料,我使用系統(tǒng)自帶的systemd(據(jù)說(shuō)以前的版本沒(méi)有這個(gè)東西,我用的是CentOS 7)來(lái)制作守護(hù)進(jìn)程。
在/etc/systemd/system/目錄下建一個(gè)服務(wù)文件xxxx.service(用自己的名稱替換xxxx),然后打開(kāi),寫入:
[Unit] Description=應(yīng)用描述 [Service] WorkingDirectory=/sites/test_app #工作目錄,合理配置 #執(zhí)行dotnet命令的地方,注意配置為自己機(jī)器上正確的dotnet所在路徑及程序所在路徑 ExecStart=/usr/local/bin/dotnet /sites/test_app/WebApp.dll Restart=always RestartSec=10 # 注意,這里User的值應(yīng)該與第4步nginx.conf配置文件里user XXX的XXX相同。 # 比如在nginx.conf中,有一句:user nginx;那么此處也為User的值就為nginx User=nginx Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi-user.target
上面“#”號(hào)后面的是注釋,我加了些說(shuō)明,實(shí)際使用時(shí)可以移除這些注釋。
在這步中遇到個(gè)問(wèn)題,一開(kāi)始,在“ExecStart ……“后面有個(gè)注釋,在執(zhí)行 systemctl enable xxxx.service 時(shí)老是報(bào)錯(cuò)。后來(lái)把注釋移除,并且把這句后面的空格刪除后就正常了。
7.將服務(wù)設(shè)置為開(kāi)機(jī)自啟,這樣每當(dāng)機(jī)器重啟就不需要再執(zhí)行dotnet命令來(lái)啟動(dòng)應(yīng)用程序監(jiān)聽(tīng)了,那個(gè)礙眼的dotnet監(jiān)聽(tīng)窗口也可以關(guān)閉了。
設(shè)置服務(wù)開(kāi)機(jī)自啟:
systemctl enable xxxx.service
啟動(dòng)服務(wù):
systemctl start xxxx.service
查看服務(wù)狀態(tài):
systemctl status xxxx.service
如果服務(wù)沒(méi)能正常啟動(dòng),這個(gè)命令可以顯示哪里出錯(cuò)。如果有錯(cuò)誤,修改錯(cuò)誤。
到此,部署完成,應(yīng)該能訪問(wèn)應(yīng)用了。
第二天,我想起了已經(jīng)把監(jiān)聽(tīng)服務(wù)設(shè)置成了系統(tǒng)服務(wù),可以在重啟后不需要執(zhí)行dotnet命令,于是我就想測(cè)一測(cè)到底靠不靠譜,就把機(jī)器重啟了。結(jié)果瀏覽器給我回饋了個(gè)“Bad Gateway”,真是不靠譜啊,說(shuō)好的Linux強(qiáng)大呢?
我用systemctl status檢查了服務(wù),顯示運(yùn)行中,不是服務(wù)沒(méi)啟動(dòng),說(shuō)明系統(tǒng)服務(wù)還是靠譜的。那怎么不能訪問(wèn)了呢?網(wǎng)上找了半天沒(méi)找到想要的答案,突然想到,是不是nginx這玩意掛了,因?yàn)樵诎惭b、配置nginx時(shí)這貨就曾經(jīng)癱過(guò),使用nginx -s reload命令想重啟一下nginx,結(jié)果發(fā)現(xiàn)它提示nginx.pid文件出了問(wèn)題。關(guān)于這個(gè)問(wèn)題的解決辦法,我在《Nginx在CentOS中丟失nginx.pid文件的處理》中提到過(guò)。
在Ubuntu下部署與這個(gè)差不多,某些命令不一樣。參考:https://docs.microsoft.com/zh-cn/aspnet/core/publishing/linuxproduction。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買多久送多久。