Centos7.2部署.Net Core2.0 WebApi
部署前準備
1.VisualStudio2017+.netcore2.0SDK
2.Centos7.2
3.SecureCRT,Xftp(根據自己喜好)
建立WebApi項目
修改Program.cs中的BuildWebHost方法為(不改也可,core預設使用Kestrel作為Server)
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseUrls("http://localhost:5000")
.UseStartup<Startup>()
.Build();
嘗試使用IIS Express啟動應用程式,啟動項配置在
一切正常,然後我們釋出程式,右鍵項目-釋出-釋出到檔案夾,釋出完成後的應用程式位置在\bin\Release\CoreTest.WebApi\
Xftp注意兩處連接配接選項,使用Xftp将釋出好的程式上傳到伺服器,位置在/home/wwwroot/
安裝CentOS7下.NET Core SDK
(參考https://www.microsoft.com/net/core#linuxcentos)
sudo yum install libunwind libicu
curl -sSL -o dotnet.tar.gz https://aka.ms/dotnet-sdk-2.0.0-linux-x64
mkdir -p ~/dotnet && tar zxf dotnet.tar.gz -C ~/dotnet
sudo ln -s /root/dotnet/dotnet /usr/local/bin
輸入指令dotnet --info檢視sdk的安裝資訊,如下圖
輸入指令dotnet /home/wwwroot/CoreTest.WebApi/CoreTest.WebApi.dll 出現下圖資訊表明運作成功,我們的程式正在監聽localhost:5000,此時還不能通過外網通路,我們使用Nginx将外部請求轉發到應用程式上
安裝Centos7下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
設定開機啟動:systemctl enable nginx
此時通過IP通路,出現Nginx的預設通路頁面,表明安裝成功
修改Nginx的配置檔案,轉發外部請求到應用程式
vi /etc/nginx/conf.d/default.conf
鍵入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;
}
}
然後按Esc退出輸入模式,進入指令模式,輸入:wq回車,儲存并退出
儲存成功後
重新加載service nginx reload
輸入指令dotnet /home/wwwroot/CoreTest.WebApi/CoreTest.WebApi.dll啟動應用程式
此時再通路接口/api/values(建立項目的時候自帶的) Nginx監聽80端口接收外部請求并将請求轉發給應用程式
配置守護服務(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
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
vi /etc/supervisor/supervisord.conf
修改supervisord.conf檔案,将檔案尾部的配置
修改成(注意前面的兩個分号去掉)
Esc後:wq回車,儲存退出ps:如果服務已啟動,修改配置檔案後可用supervisorctl reload指令來使其生效
監聽應用程式配置
建立conf.d檔案夾:mkdir /etc/supervisor/conf.d
建立并編輯CoreTest.conf配置檔案:vi /etc/supervisor/conf.d/CoreTest.conf
[program:CoreTest]
command=/bin/bash -c "dotnet CoreTest.WebApi.dll"
directory=/home/wwwroot/CoreTest.WebApi/
autorestart=true
stderr_logfile=/var/log/CoreTest.err.log
stdout_logfile=/var/log/CoreTest.out.log
environment=ASPNETCORE_ENVIRONMENT=Production
user=root
stopsignal=INT
運作supervisord,檢視是否生效
supervisord -c /etc/supervisor/supervisord.conf
ps -ef | grep CoreTest
出現下圖所示,則表示配置成功
此時不用手動dotnet CoreTest.WebApi.dll啟動應用程式也能通路(由Supervisor程序在背景監聽)
配置Supervisor開機啟動
建立一個“supervisord.service”檔案 vi /usr/lib/systemd/system/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
設定開機啟動:systemctl enable supervisord
驗證開機啟動是否成功:systemctl is-enabled supervisord
重新開機伺服器:reboot 此時不能通路
重新開機完成後,所有服務自動開啟,正常通路
部分内容參考:http://www.cnblogs.com/ants/p/5732337.html