• Centos7下Supervisor和Jexus两种方式部署.NETCore3.1项目


    • 由于需要,最近在调试linux下部署.NetCore项目,所以在此记录一下

    一、.NETCore3.1 环境安装以及运行测试

    • 直接运行
    ~$ sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
    
    ~$ sudo yum install dotnet-sdk-3.1
    
    • 验证一下:

    dotnet --infodotnet --version

    .NETCore3.1环境安装具体内容可翻看以前文章 https://www.cnblogs.com/shook/p/11639799.html

    之后我们运行测试一下我们的.NETCore项目是否可以在本地运行起来

    • 我这里是一个准备好的.NetCore3.1的web项目,可以看到项目文件为web.csporj

    • 我们进入项目的目录,是未编译过的源代码,可以用dotnet run或dotnet run 项目名.csporj 来运行项目方便查看

    • dotnet run的官方解释:dotnet run - 无需任何显式编译或启动命令即可运行源代码。

    • 具体的dotnet所有命令可以参考官方文档:https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-run

    • 这里启动的是本地的,记得开放端口或安全策略

    • 如果程序没问题可以跳过dotnet build 直接用dotnet publish命令来进行打包编译生成发布文件用来部署

    dotnet publish web.csproj --configuration Release -o /wwwroot/web/publish

    • 我这里是放到另一个目录下方便管理,进入编译后的目录

    • 可以看到目录已生成 web(项目名).dll

    • 我们直接运行 dotnet web(项目名).dll

    crit: Microsoft.AspNetCore.Server.Kestrel[0]
          Unable to start Kestrel.
    System.IO.IOException: Failed to bind to address http://127.0.0.1:5000: address already in use.
     ---> Microsoft.AspNetCore.Connections.AddressInUseException: Address already in use
     ---> System.Net.Sockets.SocketException (98): Address already in use
    ...............
    

    如果出现以上报错,说明端口占用,使用以下命令指定端口运行即可

    dotnet web.dll --urls=http://localhost:5010

    我们的项目到这就起来了,但是我们的项目有的是部署在云服务器上的,不能直接浏览,而且dotnet的命令退出项目就无法启动了,那我们可以用以下三种方式其中一种来进行.NetCore在Linux下的部署,其中第二种supervisor进程管理是需要Nginx来进行的,如没有Nginx或者不需要Nginx的请跳到第三种方式,个人建议用第三种jexus方式,supervisor配置的比较多略麻烦

    二、supervisor进程管理.NetCore,web默认管理界面

    2.1 Nginx安装以及配置配置反向代理

    我们在上面用dotnet命令启动指定的端口是5010,我们需要把启动的5010端口映射到Nginx上80等端口

    nginx的介绍这里就不介绍了,这里只介绍Nginx的安装以及反向代理配置

    2.1.1 Nginx安装
    1. 首先添加Centos7 yum epel源
      [root@slave1 ~]# sudo yum -y install epel-release
    2. yum安装Nginx
      [root@slave1 ~]# sudo yum install nginx
    3. 运行Nginx
      [root@slave1 ~]# sudo systemctl start nginx
    4. 验证是否开启
      [root@slave1 ~]# ps -ef | grep nginx

    1. 访问ip验证一下,我这里是默认的centos静态页,说明没有问题

    1. Nginx设置开机启动

    [root@slave1 ~]# systemctl enable nginx

    • 如果访问错误可查看端口是否开放,防火墙是否关闭,等Nginx的这些操作百度查一下,这里不再赘述
    2.1.2 Nginx反向代理配置
    • 进入Nginx 的配置加载目录 [root@slave1 ~]# cd /etc/nginx/conf.d

    新建一个配置文件,具体配置文件如下

        {
            listen 9870;							# 监听端口:使用域名的话为80
            server_name 192.168.105.191;					# IP地址,或者服务器绑定域名,在hosts做一个本地域名也可以,这里就不做演示了
            index index.html index.htm index.php;			        # 入口文件,可不填
            root  /www/wwwroot/publish/web/wwwroot;				# 运行目录 .NetCore web项目需要把项目目录指向到wwwroot目录
    
            location / {
              proxy_pass http://localhost:5010;				# 本地需要代理的地址
            }								# 以下配置如不需要可忽略
            location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
            {
                expires      30d;
            }
    
            location ~ .*.(js|css)?$
            {
                expires      12h;
            }
    
            location ~ /.
            {
                deny all;
            }
    
            access_log  /www/wwwlogs/access.log;
        }
    

    Nginx配置完成后执行命令nginx -s reload重载配置,使其生效
    按照第一步的方法现在可以运行项目即可看到项目页面

    2.2 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文档。

    2.2.1 安装 Supervisor

    官方推荐安装方法是使用easy_install,所以先执行如下命令安装 setuptools:

    yum install python-setuptools|
    easy_install supervisor
    

    2.2.2 配置 Supervisor

    Supervisor加载默认配置:

    mkdir /etc/supervisor
    echo_supervisord_conf > /etc/supervisor/supervisord.conf
    

    打开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 程序的宿主进程创建一个进程配置文件web.conf,保存并上传到/etc/supervisor/conf.d目录。

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

    [program:web]                 		                                        ;自定义名称
    command=dotnet web.dll 		 		                                ;程序启动命令
    directory=/www/wwwroot/publish/web		 		                ;命令执行的目录
    autostart=true 								        ;是否自启动
    autorestart=true 								;程序退出后自动重启
    startretries=5       							        ;启动失败自动重试次数,默认是3
    startsecs=1 									;自动重启间隔
    user=root   							                ;设置启动进程的用户,默认是root
    priority=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

    2.2.3 Supervisor 开机启动

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

    脚本内容如下:

    [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则表示设置成功,也可重启服务器验证

    2.2.4 supervisor默认web配置

    vim /etc/supervisor/supervisord.conf
    
    [inet_http_server]        
    port=192.168.0.1:8989    
    username=admin             
    password=admin
    

    有需要配置Web统一管理界面cesi的可以参考如下文章,

    https://www.jianshu.com/p/d655d8cd67bb,
    https://blog.csdn.net/acherson/article/details/101443310?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1

    我的python环境冲突就不在此演示了

    三、Jexus部署.NetCore

    如果之前安装了Supervisor 需要将其停止,再把开机启动禁止,禁用开机启动命令:systemctl disable supervisord ,查看是否为开机启动命令:systemctl is-enabled supervisord

    Jexus 即 Jexus Web Server,简称JWS,是Linux平台上 的一款ASP.NET WEB服务器。它是 Linux、Unix、FreeBSD 等非Windows系统架设 ASP.NET WEB 服务器的核心程序。

    将HTTP自宿主应用程序(如Asp.net Core应用程序、Node.js应用程序等)统一纳入Jexus的工作进程序列进行管控(启动、停止、重启、崩溃后自动恢复等管理、监控功能),为Asp.Net Core应用程序进入企业化生产环境提供了强有力的平台保障。使用 jexus整合asp.net core的优点:  

    1. 支持多站点,同一端口可以同时支持任何多的asp.net core应用程序;

    2. 应用程序启动、停止、重启与站点的启动、停止、重启等操作一致,无需手工管理asp.net core应用程序;

    3. 具有应用程序崩溃后自动重启功能,为企业级不间断运行保障;

    4. 提供与IIS相同的HTTP环境参数。

    5. 具有比反向代理更高的性能优势。

    3.1 安装jexus独立版(2020.04已更新到6.2.x版本)

    有两种安装方式:

    • 1是使用官方自动安装脚本:

    [root@slave2 ~]# curl https://jexus.org/release/x64/install.sh|sudo sh

    安装完成的目录地址为/usr/jexus

    若提示没有Wget,手动yum install wget -y即可

    • 2是使用手动安装,可以自定义目录,我们这里也安装到/usr/lexus/目录下方便理解
    wget https://linuxdot.net/down/jexus-6.2.x-x64.tar.gz
    tar zxvf jexus-6.2.x-x64.tar.gz
    

    3.2 jexus配置文件

    [root@slave2 ~]# cd siteconf/                    #进入配置文件目录
    [root@slave2 siteconf ~]# vim web                #新建一个配置文件名为web,并进行编辑
    
    ######################
    # Web Site: web 
    ########################################
    																				
    port=80						# 监听端口:使用域名的话为80
    root=/ /www/wwwroot/publish/web/wwwroot		# 运行目录 .NetCore web项目需要把项目目录指向到wwwroot目录,不支持虚拟目录
    hosts=web.test.com				# 服务器绑定域名,在hosts做一个本地域名也可以,也可以是IP地址,这里就不做演示了
    # User=www-data
    
    # AspNet.Workers=2  # Set the number of asp.net worker processes. Defauit is 1.
    
    # addr=0.0.0.0
    # CheckQuery=false
    # NoLog=true
    																				                
    AppHost={                                        # 新建AppHost配置
      cmd=dotnet /www/wwwroot/publish/web/web.dll;	 # 进行dotnet 项目名.dll运行操作
      root=/www/wwwroot/publish/web/; 	         # 项目的工作目录
      # port=5001					 # 可选项。表示这个应用程序的侦听端口,多个端口用英文逗号分隔
      #OutLog=/log/out.txt;				 # OutLog:可选项。表示将这个应用程序的控制台输出重定向到指定的文件(需填写完整路径);
      #ErrLog=/log/out.txt;		                 # ErrLog:可选项。表示将这个应用程序的异常输出重定向到指定的文件(需填写完整路径),如果不原意输出日志,可以不用OutLog项。这时, jexus会自动关掉控制台输出
      }
    
    

    确保配置和项目文件无误后,进入目录运行jexus

    [root@slave2 ~]#  cd /usr/jexus
    [root@slave2 jexus]# sudo ./jws start
     ... OK.
    

    进入本地域名查看,成功运行

    3.3 jexus设置开机启动

    • 1.新建 jexus.service
    cd /lib/systemd/system
    vim jexus.service
    

    添加如下配置

    [Unit]
    Description=jexus
    After=network.target
    [Service]
    Type=forking
    ExecStart=/usr/jexus/jws start
    ExecReload=/usr/jexus/jws restart
    ExecStop=/usr/jexus/jws stop
    PrivateTmp=true
    [Install]
    WantedBy=multi-user.target
    

    jexus加入服务: systemctl enable jexus.service

    启动jexus服务: systemctl start jexus.service

    查看jexus服务状态: systemctl status jexus.service

    reboot执行重启测试一下,看到站点启动即成功

    相比supervisor对比,jexus更加便捷方便部署,日志的部分配置上即可查看,这里也就不表了

    四、Linux下.Netcore跨平台其他方式部署

    还有pm2方式来进行部署,我以前使用pm2来进行部署vue的项目,感觉十分好用,比Supervisor方便配置本来想写上pm2的部署方式,想起来看过晓晨写过pm2守护.NETCore的相关文章特别详细,
    所以有需要的传送门:https://www.cnblogs.com/stulzq/p/9775973.html

    还有systemctl构建后台服务等方式,根据自己情况选一种适合自己即可

    相关资料:https://www.cnblogs.com/esofar/p/8043792.html#2535191668

  • 相关阅读:
    自定义开发服务器_2_使用webpack_dev_middleware和express
    自定义开发服务器_1_使用webpack_dev_middleware
    用webpack搭建专用于实时重加载html的开发服务器
    如何批量导入组件,并在vue-router中批量设置?
    [webpack]在package.json中设置开发服务器"start": "webpack serve --open"的一小坑
    【读书笔记】node.js实战第二版中关于ejs的一个小坑
    动态的修改页面标题title
    vue-cropperjs 基本使用 及其裁剪前压缩,相同图片第二次选择失效,第二次压缩失效,第一次图片转Base64 失效 打印‘data:,' 的问题
    原生js 首次加载的loading效果
    vue 首次加载的loading效果
  • 原文地址:https://www.cnblogs.com/shook/p/12721103.html
Copyright © 2020-2023  润新知