GitHub Actions自托管Runner为什么无法连接到我的EC2实例?
我在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范围…
先确认你启动 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.com、collector.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(必须包含
repo或admin:repo_hook)、EC2 没配公网 IP 或 NAT 网关、或者公司网络做了 HTTPS 代理导致 GitHub 请求被拦截。最后说个调试技巧:把
./run.sh改成./run.sh --trace,会输出详细日志,一般几行就能看到卡在哪一步了。另外确认下
/etc/runner/.credentials文件是否存在且权限正确,如果文件丢了或权限不对,Runner会一直连不上。如果还是不行,直接用这个命令重新注册Runner,别折腾了: