這段時間在使用Rabbit RPC重構公司的一套系統(微信相關),而最近相關檢驗(邏輯測試、壓力測試)已經完成,接近部署至線上生產環境從而搗鼓了ASP.NET Core應用程序在CentOS上的部署方案,今天就跟你們分享一下如何將ASP.NET Core應用程序以生產的標準部署在CentOS上。
環境說明
服務器系統:CentOS 7.2.1511
相關工具:Xshel、Xftp
服務器軟件軟件:.netcore、nginx、supervisor、policycoreutils-python
準備你的ASP.NET Core應用程序
首先將你的應用程序以便攜的模式進行發佈。
ps:這邊我使用一個空的Web項目來進行演示,由於本篇主要介紹生產環境的部署,與應用無關。
命令爲:dotnet publish –c release
具體的能夠看:擁抱.NET Core,如何開發跨平臺的應用並部署至Ubuntu運行,這篇博文介紹了以便攜與自宿主方式發佈web應用。
確保這份發佈應用能夠在windows上運行,以減小後續的問題。
爲何不用自宿主的方式進行部署?
自宿主的發佈方式進行部署會簡單不少,爲何生產環境要使用便攜的方式進行發佈呢?
緣由1:性能比便攜式的低(主)。
緣由2:微軟給出的建議(次)。
口說無憑,有圖有真相。
參考地址:https://docs.microsoft.com/zh-cn/dotnet/articles/core/app-types
so,既然是用於生產環境的,固然咱們要追求更高的性能。
安裝CentOS7
這個就不細說了,網上教程不少,這邊我使用了Hyper-V來虛擬化了CentOS7。
安裝.NET Core SDK for CentOS7。
sudo yum install libunwind libicu(安裝libicu依賴)
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(建立連接)
輸入 dotnet –info 來查看是否安裝成功
若是能夠執行則代表.NET Core SDK安裝成功。
參考資料:https://www.microsoft.com/net/core#centos
部署ASP.NET Core應用程序
上傳以前發佈的文件夾至/home/wwwroot/。
這邊我使用了Xftp進行文件的上傳。
檢查是否可以運行
命令:dotnet /home/wwwroot/WebApplication1/WebApplication1.dll
若是出現這些信息則表示成功運行。
這時候咱們是沒法訪問到這個頁面的,這時候咱們須要部署一個web容器來進行轉發。
配置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 來啓動nginx。
輸入:systemctl enable nginx 來設置nginx的開機啓動(linux宕機、重啓會自動運行nginx不須要連上去輸入命令)。
配置防火牆
命令:firewall-cmd --zone=public --add-port=80/tcp --permanent(開放80端口)
命令:systemctl restart firewalld(重啓防火牆以使配置即時生效)
測試nginx是否能夠訪問。
配置nginx對ASP.NET Core應用的轉發
修改 /etc/nginx/conf.d/default.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;
}
}
上傳至CentOS進行覆蓋。
執行:nginx –s reload 使其即時生效
運行ASP.NET Core應用程序
命令:dotnet /home/wwwroot/WebApplication1/WebApplication1.dll
這時候再次嘗試訪問。
想哭的心都有。。。通過後續瞭解,這個問題是因爲SELinux保護機制所致使,咱們須要將nginx添加至SELinux的白名單。
接下來咱們經過一些命令解決這個問題。。
yum install policycoreutils-python
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
sudo semodule -i mynginx.pp
再次嘗試訪問。
至此基本完成了部署。
配置守護服務(Supervisor)
目前存在三個問題
問題1:ASP.NET Core應用程序運行在shell之中,若是關閉shell則會發現ASP.NET Core應用被關閉,從而致使應用沒法訪問,這種狀況固然是咱們不想遇到的,並且生產環境對這種狀況是零容忍的。
問題2:若是ASP.NET Core進程意外終止那麼須要人爲連進shell進行再次啓動,每每這種操做都不夠及時。
問題3:若是服務器宕機或須要重啓咱們則仍是須要連入shell進行啓動。
爲了解決這個問題,咱們須要有一個程序來監聽ASP.NET Core 應用程序的情況。在應用程序中止運行的時候當即從新啓動。這邊咱們用到了Supervisor這個工具,Supervisor使用Python開發的。
安裝Supervisor
yum install python-setuptools
easy_install supervisor
配置Supervisor
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
修改supervisord.conf文件,將文件尾部的配置
修改成
ps:若是服務已啓動,修改配置文件可用「supervisorctl reload」命令來使其生效
配置對ASP.NET Core應用的守護
建立一個 WebApplication1.conf文件,內容大體以下
[program:WebApplication1]
command=dotnet WebApplication1.dll ; 運行程序的命令
directory=/home/wwwroot/WebApplication1/ ; 命令執行的目錄
autorestart=true ; 程序意外退出是否自動重啓
stderr_logfile=/var/log/WebApplication1.err.log ; 錯誤日誌文件
stdout_logfile=/var/log/WebApplication1.out.log ; 輸出日誌文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 進程環境變量
user=root ; 進程執行的用戶身份
stopsignal=INT
將文件拷貝至:「/etc/supervisor/conf.d/WebApplication1.conf」下
運行supervisord,查看是否生效
supervisord -c /etc/supervisor/supervisord.conf
ps -ef | grep WebApplication1
若是存在dotnet WebApplication1.dll 進程則表明運行成功,這時候在使用瀏覽器進行訪問。
至此關於ASP.NET Core應用程序的守護即配置完成。
配置Supervisor開機啓動
新建一個「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」
執行命令:systemctl enable supervisord
執行命令:systemctl is-enabled supervisord #來驗證是否爲開機啓動