You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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端口:
    1. 修改/etc/ssh/sshd_config,将Port 22改为其他端口(如2222)
    2. 重启SSH服务:systemctl restart sshd
    3. 再按上述配置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 8022
    
    之后可直接使用:git 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 nginx
    
    输出中应包含LISTEN状态的对应端口(如22或8022)。

4. 验证GitLab SSH服务状态

  • 在GitLab服务器上检查sshd是否正常监听22端口:
    ss -tulpn | grep sshd
    
  • 确认git用户的shell为git-shell(GitLab专用shell,限制命令执行):
    cat /etc/passwd | grep git
    
    输出应类似:git:x:998:998:GitLab:/var/opt/gitlab:/usr/bin/git-shell

5. 网络连通性测试

  • 从开发者机器测试代理服务器端口连通性:
    telnet bla.bla.bla 22 # 或对应的8022端口
    
    能连通则会显示SSH服务的欢迎信息。
  • 从代理服务器测试GitLab端口连通性:
    telnet 10.*.*.1 22
    telnet 10.*.*.2 22
    telnet 10.*.*.3 22
    
    确保所有三台GitLab的22端口都能被代理服务器访问。

内容的提问来源于stack exchange,提问作者Iceforest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:06:19