• 使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序


    本文于2019年04月10日将标题「CentOS7 部署 ASP.NET Core应用程序」修改为「使用 Nginx 在 Linux 上托管 ASP.NET Core 应用程序」。

    环境准备

    虚拟机安装、系统镜像配置过程,大家参考网上教程应该没啥问题,我这不再赘述。

    成功安装并登陆 CentOS 7 Minimal 系统后,发现无法上网,后来搜索找到原因:CentOS 7 Minimal 默认没有启动网络配置。

    接下来就通过vi命令编辑网卡配置文件ifcfg-ens33(其他版本名称可能略有不同,但路径一致)。具体命令如下:

    vi /etc/sysconfig/network-scripts/ifcfg-ens33
    

    ONBOOT=no改为ONBOOT=yes,设置随系统开机运行。然后:wq强制保存并退出编辑文件即可。

    最后,需要重启一下网络服务。命令如下:

    service network restart
    

    目前应该可以上网了,可以尝试用命令ping www.baidu.com来检查下网络是否通畅。

    如上图,可以接收响应,证明网络畅通。反之,证明你的网络还是不通,就需要考虑其他原因了。

    暂时还没有安装 VMware Tools,直接在虚拟机中编(复)写(制)命令非常不便,这里可以通过连接工具 PuTTY 在Window系统中连接虚拟机中的 CentOS 系统,连接服务器也同样适用。

    软件截图:

    选择SSH连接协议,输入 CentOS 系统 IP 地址,点击【Open】按钮连接。输入系统用户名密码即可登录系统。

    问:怎么知道虚拟机中 CentOS 系统的 IP 地址呢?

    答:可以通过ifconfig命令来获取系统的IP地址。说明一点,因为这里我选的是 CentOS 7 Minimal 最小化安装,需要联网后先执行命令yum install net-tools下载网络工具包,然后才能使用ifconfig命令。

    安装 .NET Core SDK

    Linux各个发行版如何安装 .NET Core SDK,微软官方已经给出了标准答案,我这里就把在 CentOS 上的安装方法做一个简要说明。

    Step1:安装 dotnet 产品提要

    要开始安装 .NET,您需要注册 Microsoft 签名密钥并添加 Microsoft 产品提要。每台机器只需要做一次。 打开命令提示符并运行以下命令:

    sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
    sudo sh -c 'echo -e "[packages-microsoft-com-prod]
    name=packages-microsoft-com-prod 
    baseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod
    enabled=1
    gpgcheck=1
    gpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'
    

    Step2:安装 .NET SDK

    更新可用于安装的产品,安装 .NET 所需的组件,然后安装 .NET SDK。
    在命令提示符下,运行以下命令:

    sudo yum update
    sudo yum install libunwind libicu
    sudo yum install dotnet-sdk-2.1.3  #最新版本请关注官网
    

    两步即可完成 .NET Core SDK 在 CentOS7 系统下的安装,最后可执行一下命令dotnet --version,如果正常输出版本号则说明安装没有出现问题。

    Linux 其他发行版安装 .NET Core SDK 教程请参见官方教程 Get started with .NET in 10 minutes

    部署 ASP.NET Core 应用程序

    下面就尝试把我用 ASP.NET Core Web API 开发的一个接口网站部署到我们已经安装 .NET SDK 的 CentOS 系统(下文简称服务器)中。

    程序发布过程省略,把编译后的程序发布到了本地F:wwwrootScorpio文件夹。

    然后借助 FTP 工具 FileZilla 把程序文件传输到服务器/home/wwwroot/scorpio文件夹。

    上传截图:

    上传完毕后,需要先通过cd命令进入网站根目录/home/wwwroot/scorpio/,再输入如下命令启动网站程序:

    dotnet Scorpio.WebApi.dll 
    

    如果在任意非站点根目录,通过下面这种方式直接运行,程序会抛异常,不知是程序原因还是其他原因。

    dotnet /home/wwwroot/scorpio/Scorpio.WebApi.dll 
    

    如果你可以看到如下界面则表示程序启动成功。

    Nginx 配置反向代理

    Nginx 是一个高性能的Web服务器软件。这是一个比 Apache HTTP Server 更加灵活和轻量级的程序。

    我们的网站程序启动的端口是5000,可以借助 Nginx 把程序5000端口映射到80端口。

    Nginx官方文档 & Nginx开发从入门到精通 - Tengine

    安装 Nginx

    首先,我们需要在服务器上安装 Nginx。

    Step1:添加 Nginx 存储库

    要添加 CentOS 7 EPEL 仓库,请打开终端并使用以下命令:

    sudo yum install epel-release
    

    Step2:安装 Nginx

    现在 Nginx 存储库已经安装在您的服务器上,请使用以下yum命令安装 Nginx:

    sudo yum install nginx
    

    Step3:启动 Nginx

    Nginx 不会自行启动。要运行 Nginx,请输入:

    sudo systemctl start nginx
    

    如果您正在运行防火墙,请运行以下命令以允许 HTTP 和 HTTPS 通信:

    sudo firewall-cmd --permanent --zone=public --add-service=http 
    sudo firewall-cmd --permanent --zone=public --add-service=https
    sudo firewall-cmd --reload
    

    此时,可以在本机的浏览器中访问服务器的 IP 地址http://192.168.83.128来验证 Nginx 是否成功运行。

    如果能看到 Nginx 的默认转发网页则说明一切正常。如下截图:

    Nginx

    如果拒绝访问,考虑服务器80端口是否开放。可尝试通过下面两条命令开放80端口、重启防火墙使修改即时生效。

    firewall-cmd --zone=public --add-port=80/tcp --permanent
    systemctl restart firewalld
    

    设置 Nginx 开机启动

    避免开机需要手动开启 Nginx,可以通过如下快捷命令把 Nginx 配置成系统服务,并设置为开机启动:

    systemctl enable nginx  #设置开机启动
    

    其他命令:

    systemctl disable nginx   #禁止开机启动
    systemctl status nginx     #查看运行状态
    systemctl restart nginx    #重启服务
    

    修改 Nginx 配置文件

    首先,拿到 Nginx 的默认配置文件/etc/nginx/nginx.conf,把默认80端口转发配置server节点用#符注释掉。

    然后,我们新建一个配置文件netcore.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;
        }
    }
    

    保存并上传到 Nginx 的配置加载目录/etc/nginx/conf.d,最后执行命令nginx -s reload重载 Nginx 配置,使其生效。

    在本地浏览器上访问服务器地址,运行结果如下:

    这个问题是由于 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
    

    再次访问,运行结果如下:

    可以看到,访问的接口成功返回数据,证明 Nginx 已经完成对我们部署应用程序的转发。

    Supervisor 配置守护进程

    Supervisor 是用 Python 开发的 Linux/Unix 系统下的一个进程管理工具。它可以使进程脱离终端,变为后台守护进程(daemon)。实时监控进程状态,异常退出时能自动重启。

    Supervisor 不支持任何版本的 Window 系统;仅支持在 Python2.4 或更高版本,但不能在任何版本的 Python 3 下工作。

    其主要组成部分:

    supervisord:Supervisor 的守护进程服务,用于接收进程管理命令;

    supervisorctl:Supervisor 命令行工具,用于和守护进程通信,发送管理进程的指令;

    Web Server:Web 端进程管理工具,提供与 supervisorctl 类似功能,管理进程;

    XML-RPC Interface:提供 XML-RPC 接口,请参阅 XML-RPC API文档

    安装 Supervisor

    联网状态下,官方推荐首选安装方法是使用easy_install,它是setuptools(Python 包管理工具)的一个功能。所以先执行如下命令安装 setuptools:

    yum install python-setuptools
    

    请更换root用户,执行如下命令安装 Supervisor:

    easy_install supervisor
    

    配置 Supervisor

    运行supervisord服务的时候,需要指定 Supervisor 配置文件,如果没有显示指定,默认会从以下目录中加载:

    $CWD/supervisord.conf  #$CWD表示运行 supervisord 程序的目录
    $CWD/etc/supervisord.conf
    /etc/supervisord.conf
    /etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
    ../etc/supervisord.conf (Relative to the executable)
    ../supervisord.conf (Relative to the executable)
    

    所以,先通过如下命令创建目录,以便让 Supervisor 成功加载默认配置:

    mkdir /etc/supervisor
    

    加载目录有了,然后通过echo_supervisord_conf程序(用来生成初始配置文件)来初始化一个配置文件:

    echo_supervisord_conf > /etc/supervisor/supervisord.conf
    

    打开supervisord.conf文件,可以看到echo_supervisord_conf已经帮我们初始化好了一个样例配置,我们需要简单修改一下。

    尾部找到如下文本片段:

    ;[include]
    ;files = relative/directory/*.ini
    

    改为:

    [include]
    files = conf.d/*.conf
    

    即,把注释去除、设置/etc/supervisor/conf.d为 Supervisor 进程配置文件加载目录。

    这样,Supervisor 会自动加载该目录下.conf后缀的文件作为共同服务配置。Supervisor 管理的每个进程单独写一个配置文件放在该目录下,supervisord.conf配置文件中保留公共配置。

    创建进程配置加载目录:

    mkdir /etc/supervisor/conf.d
    

    接下来就需要为我们已经部署的 ASP .NET Core 程序的宿主进程创建一个进程配置文件netcore.conf,保存并上传到/etc/supervisor/conf.d目录。

    配置文件netcore.conf内容如下:

    [program:Scorpio.WebApi]                 		;自定义进程名称
    command=dotnet Scorpio.WebApi.dll 		 		;程序启动命令
    directory=/home/wwwroot/scorpio			 		;命令执行的目录
    autostart=true 								    ;在Supervisord启动时,程序是否启动
    autorestart=true 								;程序退出后自动重启
    startretries=5       							;启动失败自动重试次数,默认是3
    startsecs=1 									;自动重启间隔
    user=root   							        ;设置启动进程的用户,默认是root
    priority=999         							;进程启动优先级,默认999,值小的优先启动
    stderr_logfile=/var/log/Scorpio.WebApi.err.log  ;标准错误日志
    stdout_logfile=/var/log/Scorpio.WebApi.out.log  ;标准输出日志
    environment=ASPNETCORE_ENVIRONMENT=Production   ;进程环境变量
    stopsignal=INT								    ;请求停止时用来杀死程序的信号
    

    启动 Supervisor 服务,命令如下:

    supervisord -c /etc/supervisor/supervisord.conf
    

    这时,在会发现我们部署的网站程序不在 shell 中通过dotnet xxx.dll启动,同样可以访问。

    设置 Supervisor 开机启动

    首先为 Supervisor 新建一个启动服务脚本supervisor.service,然后保存并上传至服务器/usr/lib/systemd/system/目录。

    脚本内容如下:

    # supervisord service 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 $OPTIONS shutdown
    ExecReload=/usr/bin/supervisorctl $OPTIONS reload
    KillMode=process
    Restart=on-failure
    RestartSec=42s
    
    [Install]
    WantedBy=multi-user.target
    

    设置开启启动:

    systemctl enable supervisor
    

    验证是否成功:

    systemctl is-enabled supervisor
    

    如果输出enabled则表示设置成功,也可重启服务器验证。

    其它 Linux 发行版开机启动脚本 User-contributed OS init scripts for Supervisor

    Supervisorctl 管理进程

    Supervisor 服务启动后,受其管理的进程会在后台运行。可以通过supervisorctl客户端管理进程。

    输入如下命令进入supervisorctl交互终端,按Ctrl+C键退出:

    supervisorctl
    

    输入help查询帮助:

    supervisor> help
    
    default commands (type help <topic>):
    =====================================
    add    exit      open  reload  restart   start   tail
    avail  fg        pid   remove  shutdown  status  update
    clear  maintail  quit  reread  signal    stop    version
    
    

    输入help ****查询详细命令,比如输入help stop

    supervisor> help stop
    
    stop <name>             Stop a process
    stop <gname>:*          Stop all processes in a group
    stop <name> <name>      Stop multiple processes or groups
    stop all                Stop all processes
    
    

    如何启动、停止、重启进程等命令,我这里就不在记录,大家自行查找吧。

    除此之外,Supervisor 还提供了 Web 管理界面用来管理进程,如何配置启动请参考官方文档。

    至此,我们已经完成了 ASP.NET Core 应用程序在 CentOS7 服务器上的部署。

    相关阅读

  • 相关阅读:
    通过存储过程的游标修改某个字段的全部数据
    spring cloud配置注册中心显示服务的ip地址和端口
    git几个必知托管平台
    hdu5790
    hdu5794
    hdu5739
    hdu5829
    线性规划初探
    bzoj4199
    bzoj4197
  • 原文地址:https://www.cnblogs.com/esofar/p/8043792.html
Copyright © 2020-2023  润新知