在 .net core 發(fā)布之后,基于 .Net 開(kāi)發(fā)的 Web 應(yīng)用(AspNet.Core)可以平滑的部署到Linux系統(tǒng)上,拋棄了坑爹的IIS后,應(yīng)用的穩(wěn)定性也大大提升。這里總結(jié)一下如何在 Linux 上部署 .net core 開(kāi)發(fā)的應(yīng)用。
總的來(lái)說(shuō),發(fā)布 ASP.Net Core? 應(yīng)用,一般需要以下步驟:
1)從Visual Stuido中 發(fā)布(Publish)到服務(wù)器的某個(gè)目錄
2)設(shè)置進(jìn)程管理
3)設(shè)置反向代理
1、服務(wù)器運(yùn)行環(huán)境設(shè)置
以下部署,基于CentOS 7.2 完成,其他系統(tǒng)可參考?https://www.microsoft.com/net/learn/get-started-with-dotnet-tutorial
按如圖位置選擇,可查看具體步驟,本文中都使用 CentOS,其他系統(tǒng)可自行選擇。

具體步驟:
? ? 1)進(jìn)入Centos系統(tǒng),命令行下執(zhí)行下面的命令,加入 dotnet 產(chǎn)品源
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
? ? 2)安裝 .net SDK 或 runtime
sudo yum updatesudo
yum install dotnet-sdk-2.1?# 如果只需要運(yùn)行環(huán)境,可不用安裝 dotnet-sdk-2.1,直接安裝 dotnet-runtime-2.1即可
yum install dotnet-runtime-2.1??
? ? 3)測(cè)試安裝,輸入下面的命令查看 版本信息
dotnet --version
2、安裝 Nginx
ASP.NET Core 應(yīng)用是一個(gè)控制臺(tái)程序,需要用到一個(gè)服務(wù)管理軟件來(lái)進(jìn)行管理,在服務(wù)器啟動(dòng)時(shí)啟動(dòng)應(yīng)用,在崩潰時(shí)重啟該應(yīng)用。ASP.NET Core 應(yīng)用常見(jiàn)部署環(huán)境有以下:
? ? Window:IIS,Windows Service
? ? Linux: Nginx, Apache
本例中,我們采用Nginx進(jìn)行反向代理。
CENTOS 7.2 中安裝Nginx 可使用以下命令
yum install nginx
3、配置 Systemd 服務(wù)
Systemd 是 Linux 系統(tǒng)工具,用來(lái)啟動(dòng)守護(hù)進(jìn)程,已成為大多數(shù)發(fā)行版的標(biāo)準(zhǔn)配置。CentOS上可用Systemd來(lái)進(jìn)行服務(wù)管理。
具體步驟
1)上傳 ASP.NET Core應(yīng)用到指定目錄。本例中,將應(yīng)用部署到 /data/www/website,并將該目錄owner設(shè)置為nginx:nginx
cd /data/www
chown -R nginx:nginx /data/www/website
2)假設(shè)應(yīng)用啟動(dòng)文件為? WebApplication1.dll,創(chuàng)建 app1.service 配置文件
cd /etc/systemd/system
vim app1.service
app1.service 文件內(nèi)容如下
[Unit]
Description=WebApplication1[Service]
WorkingDirectory=/data/www/website?
ExecStart=/usr/bin/dotnet /data/www/website/WebApplication1.dll
Restart=always
RestartSec=30
SyslogIdentifier=Web Application 1
User=nginx
Environment=ASPNETCORE_ENVIROMENT=Production
Environment=ASPNETCORE_URLS=http://127.0.0.1:5002
[Install]
WantedBy=multi-user.target
其中粗斜體內(nèi)容,可根據(jù)實(shí)際情況進(jìn)行修改
3)啟動(dòng)該服務(wù)
systemctl enable app1.service
systemctl start app1.service
4)查看服務(wù)狀態(tài)
systemctl status app1.service
如果顯示為 active=running ,則表明服務(wù)已正確啟動(dòng),如果顯示錯(cuò)誤,可使用 journalctl -xe 命令查看完整的錯(cuò)誤日志進(jìn)行排查
4、配置Nginx
在第三步,我們配置的APP的服務(wù) ,是在 127.0.0.1 的 5002 端口上監(jiān)聽(tīng),外網(wǎng)是無(wú)法訪問(wèn)的,這里我們需要用到 nginx 進(jìn)行反向代理。反向代理nginx的介紹,就不在這里贅述了。
ASP.NET Core 默認(rèn)是用?Kestrel 來(lái)運(yùn)行服務(wù),Kestrel 是一個(gè)精簡(jiǎn)的http服務(wù),有較高的性能,但多個(gè)服務(wù)無(wú)法共享同一個(gè)IP和端口,不能通過(guò)Http中的Host來(lái)區(qū)分不同的服務(wù),因此這時(shí)候就需要用到反向代理服務(wù)。
使用反向代理服務(wù),可以減少應(yīng)用對(duì)外暴露更多細(xì)節(jié),提供額外的配置層與防御,可以與已有架構(gòu)集成得更好,簡(jiǎn)化負(fù)載均衡與SSL配置,只需要在反向代理服務(wù)器上配置SSL證書(shū)。
配置步驟如下,這里我們演示使用虛擬服務(wù)器的方式來(lái)進(jìn)行配置
1)創(chuàng)建Nginx虛擬配置文件
cd /etc/nginx/conf.d
vim app1.test.com.conf
2)配置文件內(nèi)容如下:
server
{
????listen 80;
? ? server_name app1.test.com;
????root /data/www/website;? ??
? ? access_log /var/log/www/app1.test.com.log main;
? ? error_log /var/log/www/app1.test.com_error.log;
? ? location / {
? ? ? ? proxy_pass http://localhost:5002;
? ? ? ? proxy_http_version 1.1;
? ? ? ? proxy_set_header X-Real-IP $remote_addr;
? ? ? ? proxy_set_header Upgrade $http_upgrade;
? ? ? ? proxy_set_header Connection keep-alive;
? ? ? ? proxy_set_header Host $host;
? ? ? ? proxy_cache_bypass $http_upgrade;
? ? ? ? client_max_body_size 8m;
? ? }
}
3)檢查配置文件
nginx -t
顯示如下,表示nginx配置文件沒(méi)有語(yǔ)法錯(cuò)誤
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
4)重啟nginx
systemctl restart nginx
至此,部署步驟完畢,將app1.test.com 域名解析到服務(wù)器地址,或者使用hosts文件 進(jìn)行配置 之后,即可通過(guò) app1.test.com 訪問(wèn)到已部署的 ASP.NET Core服務(wù)。
參考:
【1】https://www.microsoft.com/net/learn/get-started-with-dotnet-tutorial
【2】https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1&tabs=aspnetcore2x#when-to-use-kestrel-with-a-reverse-proxy
【3】https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.1&tabs=aspnetcore2x