(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7) 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7。 部署ASP.NET Core应用程序 配置Nginx 配置守护服务(Supervisor)

这段时间在使用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应用。

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

确保这份发布应用可以在windows上运行,以减少后续的问题。

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

为什么不用自宿主的方式进行部署?

自宿主的发布方式进行部署会简单很多,为什么生产环境要使用便携的方式进行发布呢?

原因1:性能比便携式的低(主)。

原因2:微软给出的建议(次)。

口说无凭,有图有真相。

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

参考地址: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依赖)

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

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(创建链接)

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

输入 dotnet –info 来查看是否安装成功

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

如果可以执行则表明.NET Core SDK安装成功。

参考资料:https://www.microsoft.com/net/core#centos

部署ASP.NET Core应用程序

上传之前发布的文件夹至/home/wwwroot/。

这边我使用了Xftp进行文件的上传。

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

检查是否能够运行

命令:dotnet /home/wwwroot/WebApplication1/WebApplication1.dll

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

如果出现这些信息则表示成功运行。

这时候我们是无法访问到这个页面的,这时候我们需要部署一个web容器来进行转发。

配置Nginx

安装Nginx

curl -o  nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

rpm -ivh nginx.rpm

yum install nginx

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

安装成功!

输入:systemctl start nginx 来启动nginx。

输入:systemctl enable nginx 来设置nginx的开机启动(linux宕机、重启会自动运行nginx不需要连上去输入命令)。

配置防火墙

命令:firewall-cmd --zone=public --add-port=80/tcp --permanent(开放80端口)

命令:systemctl restart firewalld(重启防火墙以使配置即时生效)

测试nginx是否可以访问。

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

配置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应用程序

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

命令:dotnet /home/wwwroot/WebApplication1/WebApplication1.dll

这时候再次尝试访问。

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

想哭的心都有。。。经过后续了解,这个问题是由于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

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

再次尝试访问。

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

至此基本完成了部署。

配置守护服务(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文件,将文件尾部的配置

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

修改为

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

启动supervisor :

 supervisord -c  /etc/supervisor/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

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

如果存在dotnet WebApplication1.dll 进程则代表运行成功,这时候在使用浏览器进行访问。

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

至此关于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

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

执行命令:systemctl is-enabled supervisord #来验证是否为开机启动

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)

测试

(转) 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
环境说明
准备你的ASP.NET Core应用程序
安装CentOS7
安装.NET Core SDK for CentOS7。
部署ASP.NET Core应用程序
配置Nginx
配置守护服务(Supervisor)


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载文章之后须在文章页面明显位置给出作者和原文连接,谢谢