zoukankan      html  css  js  c++  java
  • 将ASP.NET Core应用程序部署至生产环境中(CentOS7)

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

    image

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

    image

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

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

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

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

    口说无凭,有图有真相。

    image

    image

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

    image

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

    image

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

    image

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

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

    部署ASP.NET Core应用程序

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

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

    image

    image

    检查是否能够运行

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

    image

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

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

    配置Nginx

    安装Nginx

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

    image

    sudo rpm -ivh nginx.rpm

    sudo yum install nginx

    image

    安装成功!

    输入:sudo systemctl start nginx 来启动nginx。

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

    配置防火墙

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

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

    测试nginx是否可以访问。

    image

    配置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进行覆盖。

    执行:sudo nginx -s reload 使其即时生效

    运行ASP.NET Core应用程序

    image

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

    这时候再次尝试访问。

    image

    想哭的心都有。。。经过后续了解,这个问题是由于SELinux保护机制所导致,我们需要将nginx添加至SELinux的白名单。

    接下来我们通过一些命令解决这个问题。。

    sudo yum install policycoreutils-python

    sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx

    sudo semodule -i mynginx.pp

    image

    再次尝试访问。

    image

    至此基本完成了部署。

    配置守护服务(Supervisor)

    目前存在三个问题

    问题1:ASP.NET Core应用程序运行在shell之中,如果关闭shell则会发现ASP.NET Core应用被关闭,从而导致应用无法访问,这种情况当然是我们不想遇到的,而且生产环境对这种情况是零容忍的。

    问题2:如果ASP.NET Core进程意外终止那么需要人为连进shell进行再次启动,往往这种操作都不够及时。

    问题3:如果服务器宕机或需要重启我们则还是需要连入shell进行启动。

    为了解决这个问题,我们需要有一个程序来监听ASP.NET Core 应用程序的状况。在应用程序停止运行的时候立即重新启动。这边我们用到了Supervisor这个工具,Supervisor使用Python开发的。

    安装Supervisor

    sudo yum install python-setuptools

    sudo easy_install supervisor

    配置Supervisor

    sudo mkdir /etc/supervisor

    echo_supervisord_conf > /etc/supervisor/supervisord.conf

    修改supervisord.conf文件,将文件尾部的配置

    image

    修改为

    image

    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

    image

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

    image

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

    image

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

    image

    测试

    GIF

  • 相关阅读:
    网络测量中基于Sketch方法的简单介绍
    Reading SBAR SDN flow-Based monitoring and Application Recognition
    Reading Meticulous Measurement of Control Packets in SDN
    Reading SketchVisor Robust Network Measurement for Sofeware Packet Processing
    ovs加dpdk在日志中查看更多运行细节的方法
    后缀数组
    (转载)LCA问题的Tarjan算法
    Codeforces Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) A. Checking the Calendar(水题)
    Vijos 1816统计数字(计数排序)
    卡特兰数
  • 原文地址:https://www.cnblogs.com/valu/p/6746958.html
Copyright © 2011-2022 走看看