如何让Github Actions部署至多台自托管Runner服务器?
问题解答
一、实现同时部署到两台服务器的方法
你的工作流当前使用runs-on: self-hosted时,GitHub Actions会随机选择一台在线的自托管Runner执行Job,所以只会部署到其中一台。要实现同时部署,需要给两台Runner添加专属标签,再通过工作流的矩阵策略让Job在所有目标Runner上并行执行:
给两台服务器的Runner打标签:
- 第一台服务器的Runner添加标签
prod-server-1 - 第二台服务器的Runner添加标签
prod-server-2
(操作路径:GitHub仓库 → Settings → Actions → Runners → 对应Runner的"Edit"按钮添加标签)
- 第一台服务器的Runner添加标签
修改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
相关产品推荐
相关产品推荐

