GitHub Actions自托管Runner为什么无法连接到我的EC2实例?

开发者丽丽 阅读 55

我在AWS EC2上按官方文档安装了自托管Runner,但启动后状态一直是”Connecting”。尝试过开放22端口和检查系统日志,但日志只显示Runner process exited with code 1

我的workflow配置是这样的:

runs-on: self-hosted
env:
  NODE_VERSION: 18
steps:
  - uses: actions/checkout@v3

SSH登录EC2后执行sudo runner removeFromPool提示Failed to contact server,防火墙规则已经放行了GitHub的IP范围…

我来解答 赞 13 收藏
二维码
手机扫码查看
2 条解答
梓艺
梓艺 Lv1
你这问题我见过好几次了,核心问题基本都出在 Runner 的连接方式上——你用的是 GitHub 的自托管 Runner,但它默认走的是 HTTPS 长连接,不是 SSH,所以开放 22 端口完全没用。

先确认你启动 Runner 的方式:如果你是用 ./config.sh 那种交互式配置,它会问你用哪种 runner 模式(HTTP vs SSH)。自托管 Runner 默认是 HTTP 模式,它会主动往 GitHub 的 API 地址(比如 https://api.github.com)发起长轮询连接,而不是等着 GitHub 来连它。所以你 EC2 的出方向必须能访问 GitHub 的 API 和 Actions 服务,入方向不需要开放 22。

查一下这个:在 EC2 实例上跑 curl -v https://api.github.com,如果连不上,那就是网络问题,大概率是出站被安全组/防火墙/代理拦了。GitHub 官方文档里其实写得很清楚,自托管 Runner 需要出站访问 api.github.comcollector.githubapp.com 等地址,具体见他们那张网络要求表。

另外你提到 sudo runner removeFromPool 提示 Failed to contact server,这个命令本身就需要 Runner 当前还在注册状态,如果进程已经挂了(exit code 1),它当然连不上——先别急着删,得先让 Runner 能跑起来。

标准写法是这样:进 EC2 后别用 sudo 跑,直接用普通用户(比如 ec2-user),先清掉旧配置文件 rm -rf _work _diag .runner,然后重新 ./config.sh,按提示输 PAT、Repo URL、Runner name,注意选 HTTP 模式(默认就是)。跑起来之后用 ./run.sh 启动,看终端输出有没有报错,比如 TLS 握手失败、token 失效、网络超时。

常见坑点:PAT 没选对 scope(必须包含 repoadmin:repo_hook)、EC2 没配公网 IP 或 NAT 网关、或者公司网络做了 HTTPS 代理导致 GitHub 请求被拦截。

最后说个调试技巧:把 ./run.sh 改成 ./run.sh --trace,会输出详细日志,一般几行就能看到卡在哪一步了。
点赞
2026-02-27 15:06
南宫世玉
最简单的办法是检查EC2的安全组入站规则,确保放行了GitHub Actions的回调端口443,而不是只放行IP。
另外确认下 /etc/runner/.credentials 文件是否存在且权限正确,如果文件丢了或权限不对,Runner会一直连不上。

如果还是不行,直接用这个命令重新注册Runner,别折腾了:
sudo runner configure --url https://github.com/你的用户名/你的仓库 --token 你的Token
点赞 11
2026-02-19 19:02