Node.js mysql2通过SSH隧道连接RDS超时,同环境mysql客户端可正常连接
排查与解决思路
1. 检查mysql2连接配置的细节差异
- 强制使用TCP连接:mysql客户端输入
127.0.0.1会默认走TCP,但mysql2如果配置host: 'localhost'可能尝试用Unix socket连接,而非隧道的TCP端口。务必显式指定host: '127.0.0.1'。 - 调整连接超时参数:mysql2默认连接超时比官方mysql客户端短,可在配置中加
connectTimeout: 15000(15秒),避免因隧道延迟导致超时。 - 处理SSL要求:Aurora RDS默认启用SSL,mysql客户端会自动适配,但mysql2需要显式配置。如果用默认RDS证书,可添加:
若需严格验证,可传入RDS根证书内容。ssl: { rejectUnauthorized: false }
2. 确保SSH隧道完全就绪再执行迁移
GitHub Actions中启动隧道后,可能需要几秒时间建立连接,直接跑迁移会因隧道未就绪超时。可添加等待步骤:
- name: Start SSH tunnel run: ssh -f -N -L 3307:<AURORA_ENDPOINT>:3306 ec2-user@<BASTION_IP> -i ${{ secrets.SSH_PRIVATE_KEY }} - name: Wait for tunnel to be ready run: | sudo apt-get install -y netcat while ! nc -z 127.0.0.1 3307; do sleep 1; done - name: Run migration run: npm run migrate
3. 验证Node.js实际读取的配置
在迁移脚本开头添加日志,确认环境变量是否被正确读取:
console.log('DB Host:', process.env.DB_HOST); console.log('DB Port:', process.env.DB_PORT);
也可直接硬编码连接参数测试,排除环境变量覆盖问题。
4. 排查mysql2版本或环境兼容问题
- 尝试升级/降级mysql2版本,部分旧版本在容器环境下存在TCP连接bug。
- 检查GitHub Actions容器的网络限制,确保无进程占用3307端口,或隧道绑定地址错误(需绑定
127.0.0.1而非仅容器内部地址)。
内容的提问来源于stack exchange,提问作者gdbj
相关产品推荐
相关产品推荐

