Nginx反向代理GitLab时SSH克隆失败问题求助
GitLab SSH克隆连接拒绝问题排查与解决
问题回顾
三台GitLab服务器部署在Nginx反向代理后方,HTTP协议克隆仓库正常,但使用git clone git@...方式克隆时出现以下错误:
FATAL ERROR: Network error: Connection refused fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
已关闭Nginx和GitLab服务器防火墙,SSH密钥已添加至GitLab账号,服务器22端口均处于监听状态,配置了Nginx stream模块转发但问题依旧。
排查与解决步骤
1. 修正SSH端口转发配置(核心问题)
默认git@方式克隆会使用22端口连接代理服务器,但当前Nginx stream模块监听的是8022端口,导致请求无法被转发到GitLab。有两种解决方式:
方式一:修改Nginx监听22端口(推荐,无需开发者调整)
如果代理服务器自身的SSH服务未占用22端口(或可以修改自身SSH端口),将Nginx stream的监听端口改为22:
修改nginx.conf中的stream区块:
stream { upstream ssh { # 加入三台GitLab服务器地址,配置负载均衡策略(如least_conn) least_conn; server 10.*.*.1:22; server 10.*.*.2:22; server 10.*.*.3:22; } server { listen 22; # 替换原8022为22 proxy_pass ssh; } }
- 如果代理服务器自身SSH占用22端口:
- 修改
/etc/ssh/sshd_config,将Port 22改为其他端口(如2222) - 重启SSH服务:
systemctl restart sshd - 再按上述配置Nginx监听22端口
- 修改
方式二:让开发者指定克隆端口
如果无法修改Nginx监听端口,开发者需要调整克隆命令或本地SSH配置:
- 直接指定端口克隆:
git clone ssh://git@bla.bla.bla:8022/your-group/your-repo.git - 或配置本地
~/.ssh/config,简化后续操作:
之后可直接使用:Host bla.bla.bla HostName bla.bla.bla User git Port 8022git clone bla.bla.bla:your-group/your-repo.git
2. 完善三台GitLab的负载均衡配置
当前stream的upstream仅配置了一台GitLab服务器,另外两台无法接收SSH请求。必须将三台服务器全部加入upstream,并配置合适的负载均衡策略(如least_conn或round_robin),配置示例见步骤1中的代码块。
3. 验证Nginx配置与状态
- 检查Nginx配置合法性:
nginx -t - 配置合法后重启Nginx:
systemctl restart nginx - 确认Nginx已监听目标端口:
输出中应包含ss -tulpn | grep nginxLISTEN状态的对应端口(如22或8022)。
4. 验证GitLab SSH服务状态
- 在GitLab服务器上检查sshd是否正常监听22端口:
ss -tulpn | grep sshd - 确认git用户的shell为
git-shell(GitLab专用shell,限制命令执行):
输出应类似:cat /etc/passwd | grep gitgit:x:998:998:GitLab:/var/opt/gitlab:/usr/bin/git-shell
5. 网络连通性测试
- 从开发者机器测试代理服务器端口连通性:
能连通则会显示SSH服务的欢迎信息。telnet bla.bla.bla 22 # 或对应的8022端口 - 从代理服务器测试GitLab端口连通性:
确保所有三台GitLab的22端口都能被代理服务器访问。telnet 10.*.*.1 22 telnet 10.*.*.2 22 telnet 10.*.*.3 22
内容的提问来源于stack exchange,提问作者Iceforest
相关产品推荐
相关产品推荐

