標籤:部署 centos部署asp.net core應用程式 asp.net core
作為一個Linux新手,許多人向我鼓吹說CentOS多麼強大,於是我就開始把一個示範程式發布到CentOS,想試一下它到底有多強大。在此之前,我將同樣的程式已經成功發布到了Ubuntu,我覺得,既然已經有了前一次的成功經驗,不論CentOS還是Ubuntu都是Linux,道理應該差不多吧。但事實證明,還是有些差異的,某些在CentOS上頻出的問題在Ubuntu上卻沒有,所以我的感覺是Ubuntu部署Asp.net Core程式更容易些。
過程很不順利,但最終經過一天摸索已摸清個七八成,應用總算能運行了。
Asp.net Core應用需要反向 Proxy配合才能運行,IIS、Apache和Nginx等Web服務軟體都可以作為它的反向 Proxy。這裡使用Nginx作為反向 Proxy。
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。
本文出自 “落日樓台” 部落格,請務必保留此出處http://luoriloutai.blog.51cto.com/4349732/1920375
在CentOS上部署Asp.net Core應用程式