詳解將ASP.NET Core應(yīng)用程序部署至生產(chǎn)環(huán)境中(CentOS7)
將ASP.NET Core應(yīng)用程序部署至生產(chǎn)環(huán)境中(CentOS7)
閱讀目錄
- 環(huán)境說(shuō)明
- 準(zhǔn)備你的ASP.NET Core應(yīng)用程序
- 安裝CentOS7
- 安裝.NET Core SDK for CentOS7。
- 部署ASP.NET Core應(yīng)用程序
- 配置Nginx
- 配置守護(hù)服務(wù)(Supervisor)
這段時(shí)間在使用Rabbit RPC重構(gòu)公司的一套系統(tǒng)(微信相關(guān)),而最近相關(guān)檢驗(yàn)(邏輯測(cè)試、壓力測(cè)試)已經(jīng)完成,接近部署至線(xiàn)上生產(chǎn)環(huán)境從而搗鼓了ASP.NET Core應(yīng)用程序在CentOS上的部署方案,今天就跟大家分享一下如何將ASP.NET Core應(yīng)用程序以生產(chǎn)的標(biāo)準(zhǔn)部署在CentOS上。
環(huán)境說(shuō)明
服務(wù)器系統(tǒng):CentOS 7.2.1511
相關(guān)工具:Xshel、Xftp
服務(wù)器軟件軟件:.netcore、nginx、supervisor、policycoreutils-python
準(zhǔn)備你的ASP.NET Core應(yīng)用程序
首先將你的應(yīng)用程序以便攜的模式進(jìn)行發(fā)布。
ps:這邊我使用一個(gè)空的Web項(xiàng)目來(lái)進(jìn)行演示,因?yàn)楸酒饕榻B生產(chǎn)環(huán)境的部署,與應(yīng)用無(wú)關(guān)。
命令為:
dotnet publish –c release
確保這份發(fā)布應(yīng)用可以在windows上運(yùn)行,以減少后續(xù)的問(wèn)題。
為什么不用自宿主的方式進(jìn)行部署?
自宿主的發(fā)布方式進(jìn)行部署會(huì)簡(jiǎn)單很多,為什么生產(chǎn)環(huán)境要使用便攜的方式進(jìn)行發(fā)布呢?
原因1:性能比便攜式的低(主)。
原因2:微軟給出的建議(次)。
口說(shuō)無(wú)憑,有圖有真相。
參考地址:https://docs.microsoft.com/zh-cn/dotnet/articles/core/app-types
so,既然是用于生產(chǎn)環(huán)境的,當(dāng)然我們要追求更高的性能。
安裝CentOS7
這個(gè)就不細(xì)說(shuō)了,網(wǎng)上教程很多,這邊我使用了Hyper-V來(lái)虛擬化了CentOS7。
安裝.NET Core SDK for CentOS7。
sudo yum install libunwind libicu
(安裝libicu依賴(lài))
curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=809131(下載sdk壓縮包) sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet(解壓縮) sudo ln -s /opt/dotnet/dotnet /usr/local/bin(創(chuàng)建鏈接)
輸入 dotnet –info 來(lái)查看是否安裝成功
如果可以執(zhí)行則表明.NET Core SDK安裝成功。
參考資料:https://www.microsoft.com/net/core#centos
部署ASP.NET Core應(yīng)用程序
上傳之前發(fā)布的文件夾至/home/wwwroot/。
這邊我使用了Xftp進(jìn)行文件的上傳。
檢查是否能夠運(yùn)行
命令:
dotnet /home/wwwroot/WebApplication1/WebApplication1.dll
如果出現(xiàn)這些信息則表示成功運(yùn)行。
這時(shí)候我們是無(wú)法訪(fǎng)問(wèn)到這個(gè)頁(yè)面的,這時(shí)候我們需要部署一個(gè)web容器來(lái)進(jìn)行轉(zhuǎn)發(fā)。
配置Nginx
安裝Nginx
curl -o nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
rpm -ivh nginx.rpm yum install nginx
安裝成功!
輸入:systemctl start nginx 來(lái)啟動(dòng)nginx。
輸入:systemctl enable nginx 來(lái)設(shè)置nginx的開(kāi)機(jī)啟動(dòng)(linux宕機(jī)、重啟會(huì)自動(dòng)運(yùn)行nginx不需要連上去輸入命令)。
配置防火墻
命令:firewall-cmd --zone=public --add-port=80/tcp --permanent(開(kāi)放80端口)
命令:systemctl restart firewalld(重啟防火墻以使配置即時(shí)生效)
測(cè)試nginx是否可以訪(fǎng)問(wèn)。
配置nginx對(duì)ASP.NET Core應(yīng)用的轉(zhuǎn)發(fā)
修改 /etc/nginx/conf.d/default.conf 文件。
將文件內(nèi)容替換為
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; } }
上傳至CentOS進(jìn)行覆蓋。
執(zhí)行:nginx –s reload 使其即時(shí)生效
運(yùn)行ASP.NET Core應(yīng)用程序
命令:
dotnet /home/wwwroot/WebApplication1/WebApplication1.dll
這時(shí)候再次嘗試訪(fǎng)問(wèn)。
想哭的心都有。。。經(jīng)過(guò)后續(xù)了解,這個(gè)問(wèn)題是由于SELinux保護(hù)機(jī)制所導(dǎo)致,我們需要將nginx添加至SELinux的白名單。
接下來(lái)我們通過(guò)一些命令解決這個(gè)問(wèn)題。。
yum install policycoreutils-python sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx sudo semodule -i mynginx.pp
再次嘗試訪(fǎng)問(wèn)。
至此基本完成了部署。
配置守護(hù)服務(wù)(Supervisor)
目前存在三個(gè)問(wèn)題
問(wèn)題1:ASP.NET Core應(yīng)用程序運(yùn)行在shell之中,如果關(guān)閉shell則會(huì)發(fā)現(xiàn)ASP.NET Core應(yīng)用被關(guān)閉,從而導(dǎo)致應(yīng)用無(wú)法訪(fǎng)問(wèn),這種情況當(dāng)然是我們不想遇到的,而且生產(chǎn)環(huán)境對(duì)這種情況是零容忍的。
問(wèn)題2:如果ASP.NET Core進(jìn)程意外終止那么需要人為連進(jìn)shell進(jìn)行再次啟動(dòng),往往這種操作都不夠及時(shí)。
問(wèn)題3:如果服務(wù)器宕機(jī)或需要重啟我們則還是需要連入shell進(jìn)行啟動(dòng)。
為了解決這個(gè)問(wèn)題,我們需要有一個(gè)程序來(lái)監(jiān)聽(tīng)ASP.NET Core 應(yīng)用程序的狀況。在應(yīng)用程序停止運(yùn)行的時(shí)候立即重新啟動(dòng)。這邊我們用到了Supervisor這個(gè)工具,Supervisor使用Python開(kāi)發(fā)的。
安裝Supervisor
yum install python-setuptools easy_install supervisor
配置Supervisor
mkdir /etc/supervisor echo_supervisord_conf > /etc/supervisor/supervisord.conf
修改supervisord.conf文件,將文件尾部的配置
修改為
ps:如果服務(wù)已啟動(dòng),修改配置文件可用“supervisorctl reload”命令來(lái)使其生效
配置對(duì)ASP.NET Core應(yīng)用的守護(hù)
創(chuàng)建一個(gè) WebApplication1.conf文件,內(nèi)容大致如下
[program:WebApplication1] command=dotnet WebApplication1.dll ; 運(yùn)行程序的命令 directory=/home/wwwroot/WebApplication1/ ; 命令執(zhí)行的目錄 autorestart=true ; 程序意外退出是否自動(dòng)重啟 stderr_logfile=/var/log/WebApplication1.err.log ; 錯(cuò)誤日志文件 stdout_logfile=/var/log/WebApplication1.out.log ; 輸出日志文件 environment=ASPNETCORE_ENVIRONMENT=Production ; 進(jìn)程環(huán)境變量 user=root ; 進(jìn)程執(zhí)行的用戶(hù)身份 stopsignal=INT
將文件拷貝至:“/etc/supervisor/conf.d/WebApplication1.conf”下
運(yùn)行supervisord,查看是否生效
supervisord -c /etc/supervisor/supervisord.conf ps -ef | grep WebApplication1
如果存在dotnet WebApplication1.dll 進(jìn)程則代表運(yùn)行成功,這時(shí)候在使用瀏覽器進(jìn)行訪(fǎng)問(wèn)。
至此關(guān)于ASP.NET Core應(yīng)用程序的守護(hù)即配置完成。
配置Supervisor開(kāi)機(jī)啟動(dòng)
新建一個(gè)“supervisord.service”文件
# dservice for systemd (CentOS 7.0+) # by ET-CS (https://github.com/ET-CS) [Unit] Description=Supervisor daemon [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf ExecStop=/usr/bin/supervisorctl shutdown ExecReload=/usr/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
將文件拷貝至:“/usr/lib/systemd/system/supervisord.service”
執(zhí)行命令:systemctl enable supervisord
執(zhí)行命令:systemctl is-enabled supervisord #來(lái)驗(yàn)證是否為開(kāi)機(jī)啟動(dòng)
測(cè)試
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net表單提交時(shí)防重復(fù)提交并執(zhí)行前臺(tái)的JS驗(yàn)證
今天遇到這樣的一個(gè)情況,就是用戶(hù)重復(fù)提交。當(dāng)然這個(gè)不能怪用戶(hù),只能怪.NET或者服務(wù)器反應(yīng)遲鈍,下面有個(gè)不錯(cuò)的教程,大家可以參考下2013-10-10asp.net System.Net.Mail 發(fā)送郵件
一個(gè)師弟發(fā)了段代碼給我,說(shuō)調(diào)試了很久發(fā)送郵件都沒(méi)有成功。自己使用過(guò)程中,也發(fā)現(xiàn)了很多問(wèn)題,但最簡(jiǎn)單的問(wèn)題是“發(fā)件方”地址根本不支持smtp發(fā)送郵件。2009-04-04.net core webapi 大文件上傳到wwwroot文件夾的操作代碼
這篇文章主要介紹了.net core webapi 大文件上傳到wwwroot文件夾的操作代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12ASP.NET?MVC創(chuàng)建XML文件并實(shí)現(xiàn)元素增刪改
這篇文章介紹了ASP.NET?MVC創(chuàng)建XML文件并實(shí)現(xiàn)元素增刪改的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07asp.net 通過(guò)httpModule計(jì)算頁(yè)面的執(zhí)行時(shí)間
有時(shí)候我們想檢測(cè)一下網(wǎng)頁(yè)的執(zhí)行效率。記錄下開(kāi)始請(qǐng)求時(shí)的時(shí)間和頁(yè)面執(zhí)行完畢后的時(shí)間點(diǎn),這段時(shí)間差就是頁(yè)面的執(zhí)行時(shí)間了。要實(shí)現(xiàn)這個(gè)功能,通過(guò)HttpModule來(lái)實(shí)現(xiàn)是最方便而且準(zhǔn)確的。2011-02-02在ASP.NET中用存儲(chǔ)過(guò)程執(zhí)行SQL語(yǔ)句
存儲(chǔ)過(guò)程:是一組為了完成特定功能的SQL語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中。用戶(hù)通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它。存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)中的一個(gè)重要對(duì)象,任何一個(gè)設(shè)計(jì)良好的數(shù)據(jù)庫(kù)應(yīng)用程序都應(yīng)該用到存儲(chǔ)過(guò)程。2010-04-04ASP.NET Core單文件和多文件上傳并保存到服務(wù)端的方法
這篇文章主要介紹了ASP.NET Core單文件和多文件上傳并保存到服務(wù)端的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04asp.net開(kāi)發(fā)微信公眾平臺(tái)之驗(yàn)證消息的真實(shí)性
這篇文章主要介紹了asp.net開(kāi)發(fā)微信公眾平臺(tái)之驗(yàn)證消息的真實(shí)性的相關(guān)資料,需要的朋友可以參考下2015-06-06asp.net實(shí)現(xiàn)生成靜態(tài)頁(yè)并添加鏈接的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)生成靜態(tài)頁(yè)并添加鏈接的方法,非常實(shí)用的功能,需要的朋友可以參考下2014-07-07