在 .net core 发布之后,基于 .Net 开发的 Web 应用(AspNet.Core)可以平滑的部署到Linux系统上,抛弃了坑爹的IIS后,应用的稳定性也大大提升。这里总结一下如何在 Linux 上部署 .net core 开发的应用。
总的来说,发布 ASP.Net Core 应用,一般需要以下步骤:
1)从Visual Stuido中 发布(Publish)到服务器的某个目录
2)设置进程管理
3)设置反向代理
1、服务器运行环境设置
以下部署,基于CentOS 7.2 完成,其他系统可参考 https://www.microsoft.com/net/learn/get-started-with-dotnet-tutorial
按如图位置选择,可查看具体步骤,本文中都使用 CentOS,其他系统可自行选择。
具体步骤:
1)进入Centos系统,命令行下执行下面的命令,加入 dotnet 产品源
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# 如果只需要运行环境,可不用安装 dotnet-sdk-2.1,直接安装 dotnet-runtime-2.1即可
yum install dotnet-runtime-2.1
3)测试安装,输入下面的命令查看 版本信息
dotnet --version
2、安装 Nginx
ASP.NET Core 应用是一个控制台程序,需要用到一个服务管理软件来进行管理,在服务器启动时启动应用,在崩溃时重启该应用。ASP.NET Core 应用常见部署环境有以下:
Window:IIS,Windows Service
Linux: Nginx, Apache
本例中,我们采用Nginx进行反向代理。
CENTOS 7.2 中安装Nginx 可使用以下命令
yum install nginx
3、配置 Systemd 服务
Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。CentOS上可用Systemd来进行服务管理。
具体步骤
1)上传 ASP.NET Core应用到指定目录。本例中,将应用部署到 /data/www/website,并将该目录owner设置为nginx:nginx
cd /data/www
chown -R nginx:nginx /data/www/website
2)假设应用启动文件为 WebApplication1.dll,创建 app1.service 配置文件
cd /etc/systemd/system
vim app1.service
app1.service 文件内容如下
[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
其中粗斜体内容,可根据实际情况进行修改
3)启动该服务
systemctl enable app1.service
systemctl start app1.service
4)查看服务状态
systemctl status app1.service
如果显示为 active=running ,则表明服务已正确启动,如果显示错误,可使用 journalctl -xe 命令查看完整的错误日志进行排查
4、配置Nginx
在第三步,我们配置的APP的服务 ,是在 127.0.0.1 的 5002 端口上监听,外网是无法访问的,这里我们需要用到 nginx 进行反向代理。反向代理nginx的介绍,就不在这里赘述了。
ASP.NET Core 默认是用 Kestrel 来运行服务,Kestrel 是一个精简的http服务,有较高的性能,但多个服务无法共享同一个IP和端口,不能通过Http中的Host来区分不同的服务,因此这时候就需要用到反向代理服务。
使用反向代理服务,可以减少应用对外暴露更多细节,提供额外的配置层与防御,可以与已有架构集成得更好,简化负载均衡与SSL配置,只需要在反向代理服务器上配置SSL证书。
配置步骤如下,这里我们演示使用虚拟服务器的方式来进行配置
1)创建Nginx虚拟配置文件
cd /etc/nginx/conf.d
vim app1.test.com.conf
2)配置文件内容如下:
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配置文件没有语法错误
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 域名解析到服务器地址,或者使用hosts文件 进行配置 之后,即可通过 app1.test.com 访问到已部署的 ASP.NET Core服务。
参考:
【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