You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Github Actions部署至多台自托管Runner服务器?

问题解答

一、实现同时部署到两台服务器的方法

你的工作流当前使用runs-on: self-hosted时,GitHub Actions会随机选择一台在线的自托管Runner执行Job,所以只会部署到其中一台。要实现同时部署,需要给两台Runner添加专属标签,再通过工作流的矩阵策略让Job在所有目标Runner上并行执行:

  1. 给两台服务器的Runner打标签:

    • 第一台服务器的Runner添加标签prod-server-1
    • 第二台服务器的Runner添加标签prod-server-2
      (操作路径:GitHub仓库 → Settings → Actions → Runners → 对应Runner的"Edit"按钮添加标签)
  2. 修改GitHub Actions工作流文件:

name: Node.js CI

on:
  push:
    branches: [ "main" ]

jobs:
  deploy:
    # 遍历所有目标服务器标签,每个标签对应一个独立Job
    strategy:
      matrix:
        server: [prod-server-1, prod-server-2]
        node-version: [14.x]

    # 指定当前Job在对应标签的Runner上执行
    runs-on: ${{ matrix.server }}

    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm install
    - run: npm run build
    - run: pm2 restart nextjs
      env:
        CI: true

这样每次推送main分支时,会同时启动两个Job,分别在两台服务器的Runner上执行部署流程。

二、当前方案的可行性

当前方案完全可行,只要保证两台服务器的环境(Node.js版本、Nginx配置、PM2配置等)完全一致,就能实现多节点的同步部署和负载均衡。需要注意的点:

  • 部署时两台服务器的代码版本通过actions/checkout可严格同步
  • 可在Runner上配置依赖缓存目录,避免每次部署重复安装依赖,提升效率
  • 若要避免部署期间服务中断,可给PM2配置滚动重启,或者先停止一台服务器的流量再部署,完成后切回,再部署另一台

三、更优的部署及负载均衡方案(不熟悉Docker的情况下)

1. 基于Ansible的批量部署优化

手动维护两台服务器配置易出现不一致,用Ansible可批量管理服务器配置、执行部署命令:

  • 编写Ansible playbook,定义应用的安装、构建、重启流程
  • 在GitHub Actions中调用Ansible脚本,一次性完成两台服务器的部署
  • 优势是统一管理服务器配置,避免手动操作误差

2. PM2集群+Nginx负载均衡强化

如果是Next.js这类Node.js应用,可在每台服务器上用PM2启动多进程集群(比如根据CPU核心数启动进程),再通过Nginx反向代理到两台服务器的所有PM2进程:

  • 单服务器执行pm2 start nextjs -i max启动集群模式
  • Nginx配置中添加两台服务器的所有PM2进程端口,实现更细粒度的负载均衡

3. 轻量化容器入门(Docker Compose)

若想尝试容器化但不想直接接触Kubernetes,可先用Docker Compose:

  • 编写简单的Dockerfile打包应用(无需复杂配置)
  • 用Docker Compose定义应用的启动命令、端口映射
  • 在两台服务器上部署Docker Compose应用,Nginx反向代理到两台服务器的容器端口
  • 优势是隔离应用环境,避免服务器依赖冲突,后续迁移到Kubernetes也更平滑

4. 负载均衡器选型

除了Nginx,HAProxy也是不错的选择,它在TCP层负载均衡上表现更优,适合处理大量并发请求的场景;如果是纯前端静态资源+Node.js接口,Nginx的配置更简单,足够满足需求。

内容的提问来源于stack exchange,提问作者Ilya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:48:20