您好,登錄后才能下訂單哦!
作為一個Linux新手,許多人向我鼓吹說CentOS多么強大,于是我就開始把一個演示程序發布到CentOS,想試一下它到底有多強大。在此之前,我將同樣的程序已經成功發布到了Ubuntu,我覺得,既然已經有了前一次的成功經驗,不論CentOS還是Ubuntu都是Linux,道理應該差不多吧。但事實證明,還是有些差異的,某些在CentOS上頻出的問題在Ubuntu上卻沒有,所以我的感覺是Ubuntu部署Asp.net Core程序更容易些。
過程很不順利,但最終經過一天摸索已摸清個七八成,應用總算能運行了。
Asp.net Core應用需要反向代理配合才能運行,IIS、Apache和Nginx等Web服務軟件都可以作為它的反向代理。這里使用Nginx作為反向代理。
1.安裝.NET Core SDK。四個命令,依次執行:
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.上傳應用程序。使用工具不限,在Windows上可以用MobaXterm,這個東西不錯,既能登錄系統,也能傳送和下載文件,還可以可視化地瀏覽服務器上的目錄、打開文件進行編輯。
4. 配置nginx。打開/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;
}
此時,應用內部的Kestrel監聽的端口是5000,而外部用戶訪問應用仍然使用80端口。
注意找到“user XXX;”這句,"XXX"可以為任何字串,這個東西要記住,稍后把.net Core應用監聽服務設置為系統服務時需要它。
5.經過第4步配置后,進入應用程序所在目錄,執行
dotnet app.dll(app.dll是asp.net core應用程序發布后生成的文件,需要用你自己的應用名稱替代app.dll)
一切安好的話,此時應用應該可以訪問了,打開瀏覽器去試一下。
到此為止,應用程序已經部署好了。但是,你發現了,有個命令窗口一直開著,它就是執行dotnet xxxx.dll那個窗口,如果這個窗口關閉了,那么應用程序也隨即不能訪問了。作為完美型的程序猿,肯定不希望這個窗口總趴在屏幕上,這時就用到了系統服務,讓應用程序監聽服務在系統啟動時自動啟動,省去了每次啟動都需要再次執行dotnet命令去運行服務。
6.將應用程序的監聽服務設置為系統服務。這一步中,許多介紹部署.net core應用的文章都使用一個叫“Supervisor”的東西,這個東西我不熟,當然,其實我對整個Linux就不熟,通過參考資料,我使用系統自帶的systemd(據說以前的版本沒有這個東西,我用的是CentOS 7)來制作守護進程。
在/etc/systemd/system/目錄下建一個服務文件xxxx.service(用自己的名稱替換xxxx),然后打開,寫入:
[Unit] Description=應用描述 [Service] WorkingDirectory=/sites/test_app #工作目錄,合理配置 #執行dotnet命令的地方,注意配置為自己機器上正確的dotnet所在路徑及程序所在路徑 ExecStart=/usr/local/bin/dotnet /sites/test_app/WebApp.dll Restart=always RestartSec=10 # 注意,這里User的值應該與第4步nginx.conf配置文件里user XXX的XXX相同。 # 比如在nginx.conf中,有一句:user nginx;那么此處也為User的值就為nginx User=nginx Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi-user.target
上面“#”號后面的是注釋,我加了些說明,實際使用時可以移除這些注釋。
在這步中遇到個問題,一開始,在“ExecStart ……“后面有個注釋,在執行 systemctl enable xxxx.service 時老是報錯。后來把注釋移除,并且把這句后面的空格刪除后就正常了。
7.將服務設置為開機自啟,這樣每當機器重啟就不需要再執行dotnet命令來啟動應用程序監聽了,那個礙眼的dotnet監聽窗口也可以關閉了。
設置服務開機自啟:
systemctl enable xxxx.service
啟動服務:
systemctl start xxxx.service
查看服務狀態:
systemctl status xxxx.service
如果服務沒能正常啟動,這個命令可以顯示哪里出錯。如果有錯誤,修改錯誤。
到此,部署完成,應該能訪問應用了。
第二天,我想起了已經把監聽服務設置成了系統服務,可以在重啟后不需要執行dotnet命令,于是我就想測一測到底靠不靠譜,就把機器重啟了。結果瀏覽器給我回饋了個“Bad Gateway”,真是不靠譜啊,說好的Linux強大呢?
我用systemctl status檢查了服務,顯示運行中,不是服務沒啟動,說明系統服務還是靠譜的。那怎么不能訪問了呢?網上找了半天沒找到想要的答案,突然想到,是不是nginx這玩意掛了,因為在安裝、配置nginx時這貨就曾經癱過,使用nginx -s reload命令想重啟一下nginx,結果發現它提示nginx.pid文件出了問題。關于這個問題的解決辦法,我在《Nginx在CentOS中丟失nginx.pid文件的處理》中提到過。
在Ubuntu下部署與這個差不多,某些命令不一樣。參考:https://docs.microsoft.com/zh-cn/aspnet/core/publishing/linuxproduction。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。