一. 流程步骤总览

  1. 安装 dotnet SDK/运行环境

  2. 打包/发布项目, 将发布文件 copylinux

  3. 安装进程守护管理工具 PM2 ,用**PM2**启动 .net core 服务

  4. 开启防火墙端口, 例如开放 8080 端口

二. 安装 dotnet SDK

(以下步骤以安装 .net core 3.1 为例)

(一)手动安装 SDK
  1. 下载 SDK 二进制安装包

    • 下载地址: https://dotnet.microsoft.com/download/dotnet/3.1

    • 可先在windows里下载完, 再复制到Linux 中;

      也可使用Linux 直接下载, 脚本如下:

      #cd 到下载或安装路径文件夹
      cd /youPath/dotnet/
      #下载
      wget https://download.visualstudio.microsoft.com/download/pr/e89c4f00-5cbb-4810-897d-f5300165ee60/027ace0fdcfb834ae0a13469f0b1a4c8/dotnet-sdk-3.1.426-linux-x64.tar.gz
  2. 解压、添加环境变量

    # 解压到当前目录
    tar zxf dotnet-sdk-3.1.426-linux-x64.tar.gz 
    # 添加到环境变量
    vi /etc/profile #打开配置文件
    
    export DOTNET_ROOT=/youPath/dotnet
    export PATH=$PATH:/youPath/dotnet
    
    # 生效配置
    source /etc/profile  
(二)包管理器 yum 安装 SDK
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum -y install dotnet-sdk-3.1
(三)检查安装是否成功
[root@localhost]# dotnet --info
# 安装成功, 应显示如下信息
.NET Core SDK (reflecting any global.json):
 Version:   3.1.426
 Commit:    e81f6c8565

Runtime Environment:
 OS Name:     centos
 OS Version:  7
 OS Platform: Linux
 RID:         centos.7-x64
 Base Path:   /home/dotnet/sdk/3.1.426/

Host (useful for support):
  Version: 3.1.32
  Commit:  f94bb2c3ff

.NET Core SDKs installed:
  3.1.426 [/home/dotnet/sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.App 3.1.32 [/home/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.32 [/home/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

三. 发布项目(此步略…)

四. 安装 PM2 并启动项目

(一)安装NodeJs
# 下载node安装包到指定目录 官网下载: https://nodejs.org/en/download 选择Linux对应的二进制包
wget https://registry.npmmirror.com/-/binary/node/v14.18.1/node-v14.18.1-linux-x64.tar.xz

# 解压安装包
tar -xvf node-v14.18.1-linux-x64.tar.gz
mv node-v14.18.1-linux-x64 /usr/local/nodejs

# 配置环境变量
vi /etc/profile # 打开配置文件
export NODE_HOME=/usr/local/nodejs
export PATH=$NODE_HOME/bin:$PATH

# :wq保存,然后运行命令,使得环境变量生效
source /etc/profile

# 检查是否安装成功
node -v
# 输出> V x.x.x
npm -v
# 输出> x.x.x
(二)安装 PM2
# 全局安装PM2
npm install pm2 -g
# 检查安装结果
pm2 -v # 成功 输出 x.x.x
(三)PM2 启动程序
pm2 start "dotnet testwebapi.dll" --name testwebapi
  1. 常见PM2 命令

    1. 启动
    # pm2 start app.js
    # pm2 start app.js --name my-api   #my-api为PM2进程名称
    # pm2 start app.js -i 0           #根据CPU核数启动进程个数
    # pm2 start app.js --watch   #实时监控app.js的方式启动,当app.js文件有变动时,pm2会自动reload
    
    2. 查看进程
    # pm2 list
    # pm2 show 0 或者 # pm2 info 0  #查看进程详细信息,0为PM2进程id
    
    3. 监控
    # pm2 monit
    
    4. 停止
    # pm2 stop all  #停止PM2列表中所有的进程
    # pm2 stop 0    #停止PM2列表中进程为0的进程
    
    5. 重载
    # pm2 reload all    #重载PM2列表中所有的进程
    # pm2 reload 0     #重载PM2列表中进程为0的进程
    
    6. 重启
    # pm2 restart all     #重启PM2列表中所有的进程
    # pm2 restart 0      #重启PM2列表中进程为0的进程
    
    7. 删除PM2进程
    # pm2 delete 0     #删除PM2列表中进程为0的进程
    # pm2 delete all   #删除PM2列表中所有的进程
    
    8. 日志操作
    # pm2 logs [--raw]   #Display all processes logs in streaming
    # pm2 flush              #Empty all log file
    # pm2 reloadLogs    #Reload all logs
    
    9. 升级PM2
    # npm install pm2@lastest -g   #安装最新的PM2版本
    # pm2 updatePM2                    #升级pm2
    
    10. 更多命令参数请查看帮助, 或官方文档
    # pm2 --help
  2. PM2 使用配置文件 启动管理服务

    要生成示例配置文件,可以键入以下命令:

    $ pm2 init simple

    这将生成一个默认的配置文件 ecosystem.config.js:

    module.exports = {
      apps : [{
        name   : "server1",
        script : "dotnet webapi.dll"
      }]
    }

    使用配置文件

    启动所有的应用程序

    $ pm2 start ecosystem.config.js

    停止所有应用程序

    $ pm2 stop ecosystem.config.js

    重启所有应用程序

    $ pm2 restart ecosystem.config.js

    重载所有应用程序

    $ pm2 reload ecosystem.config.js

    删除所有应用程序

    $ pm2 delete ecosystem.config.js

    应用于特定的应用程序

    我们还可以通过使用选项 --only <app_name> 指定应用程序名称对特定应用程序进行操作:

    $ pm2 start   ecosystem.config.js --only api-app

    注意–only 选项也适用于启动/重启/停止/删除

    甚至可以通过指定用逗号分隔的每个应用程序名称来指定要对其执行操作的多个应用程序:

    $ pm2 start ecosystem.config.js --only "api-app,worker-app"

    切换环境

    可以通过 env_* 选项指定不同的环境变量集。

    示例

    module.exports = {
      apps : [{
        name   : "app1",
        script : "./app.js",
        env_production: {
           NODE_ENV: "production"
        },
        env_development: {
           NODE_ENV: "development"
        }
      }]
    }

    现在要在不同环境中的变量之间切换,请指定 --env [env name] 选项:

    $ pm2 start process.json --env production
    $ pm2 restart process.json --env development

    配置文件可用属性

    可以使用以下属性调整应用程序行为和配置:

    通用属性

    字段 类型 示例 描述
    name (string) “my-api” 应用程序名称 (默认为脚本名称)
    script (string) ”./api/app.js” 相对于 pm2 start 的脚本路径
    cwd (string) “/var/www/” 将启动您的应用程序的目录
    args (string) “-a 13 -b 12” 包含通过 CLI 传递给脚本的所有参数的字符串
    interpreter (string) “/usr/bin/python” 解释器绝对路径(默认为 node )
    interpreter_args (string) ”–harmony” 传递给解释器的选项
    node_args (string) interpreter_args的别名

    高级特性

    字段 类型 示例 描述
    instances number -1 要启动的应用程序实例数
    exec_mode string “cluster” 启动应用程序的模式,可以是“cluster”或“fork”,默认fork
    watch boolean or [] true 启用监视和重启功能,如果文件夹或子文件夹中的文件发生更改,您的应用程序将重新加载
    ignore_watch list [”[/]./”, “node_modules”] 通过监视功能忽略某些文件或文件夹名称的正则表达式列表
    max_memory_restart string “150M” 如果超过指定的内存量,您的应用程序将重新启动。 人性化的格式:可以是“10M”、“100K”、“2G”等等……
    env object {“NODE_ENV”: “development”, “ID”: “42”} env variables which will appear in your app
    env_ object {“NODE_ENV”: “production”, “ID”: “89”} 在执行 pm2 restart app.yml --env 时注入
    source_map_support boolean true 默认为 true,[启用/禁用源映射文件]
    instance_var string “NODE_APP_INSTANCE” 查看文档
    filter_env array of string [ “REACT_” ] 排除以“REACT_”开头的全局变量,并且不允许它们渗透到集群中。

    日志文件

    字段 类型 示例 描述
    error_file (string) 指定错误日志文件 (默认 $HOME/.pm2/logs/XXXerr.log)
    out_file (string) 指定标准输出日志文件 (默认 $HOME/.pm2/logs/XXXout.log)
    pid_file (string) 指定pid进程文件 (默认 $HOME/.pm2/pid/app-pm_id.pid)
    merge_logs boolean true 如果设置为 true,则避免使用进程 id 后缀日志文件
    log_date_format (string) “YYYY-MM-DD HH:mm Z” 日志时间日期格式

    控制流

    字段 类型 示例 描述
    min_uptime (string) 被视为启动的应用程序的最小正常运行时间
    listen_timeout number 8000 如果应用程序未在侦听,则强制重新加载之前的时间(以毫秒为单位)
    kill_timeout number 1600 发送最终 SIGKILL 之前的时间(以毫秒为单位)
    shutdown_with_message boolean false 使用 process.send(‘shutdown’) 而不是 process.kill(pid, SIGINT) 关闭应用程序
    wait_ready boolean false 等待 process.send(‘ready’) 而不是重新加载等待监听事件
    max_restarts number 10 在您的应用程序被视为错误并停止重新启动之前,连续不稳定重新启动的次数(小于 1 秒间隔或通过 min_uptime 自定义时间)
    restart_delay number 4000 在重新启动崩溃的应用程序之前等待的时间(以毫秒为单位)。 默认为 0。
    autorestart boolean false 默认为 true 。 如果为 false,如果应用程序崩溃或和平结束,PM2 将不会重新启动您的应用程序
    cron_restart string “1 0 * * *” 使用 cron 模式定时任务来重新启动你的应用程序。 应用程序必须正在运行才能使 cron 功能正常工作
    vizion boolean false 默认为真。 如果为 false,PM2 将在没有 vizion 功能的情况下启动(版本控制元数据)
    post_update list [“npm install”, “echo launching the app”] 从 Keymetrics 控制面板执行 Pull/Upgrade 操作后将执行的命令列表
    force boolean true 默认为 false。 如果为 true,可以多次启动同一个脚本,这通常是 PM2 不允许的

五. 开放防火墙端口

# 安装Firewall命令(没有则安装)
yum install firewalld firewalld-config

# 开放常见端口命令:
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --zone=public --add-port=22/tcp --permanent
firewall-cmd --zone=public --add-port=21/tcp --permanent
firewall-cmd --zone=public --add-port=53/udp --permanent

# 开启本项目8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent

# 关闭常见端口命令
firewall-cmd --zone=public --remove-port=80/tcp --permanent
firewall-cmd --zone=public --remove-port=443/tcp --permanent
firewall-cmd --zone=public --remove-port=22/tcp --permanent
firewall-cmd --zone=public --remove-port=21/tcp --permanent
firewall-cmd --zone=public --remove-port=53/udp --permanent

# 批量添加区间端口
firewall-cmd --zone=public --add-port=4400-4600/udp --permanent
firewall-cmd --zone=public --add-port=4400-4600/tcp --permanent

# 开启防火墙命令
systemctl start firewalld.service

# 重启防火墙命令
firewall-cmd --reload 或者 service firewalld restart

# 查看防火墙端口列表
firewall-cmd --permanent --list-port

# 禁用防火墙
systemctl stop firewalld

# 查看防火墙状态
systemctl status firewalld或者 firewall-cmd --state