HAProxy反向代理下GitLab的HTTPS与SSH共存配置问题
解决HAProxy反向代理GitLab时HTTPS与SSH共存问题
GitLab的HTTPS和SSH服务依赖不同端口(默认443和22),HAProxy需要针对这两种流量分别做TCP层转发配置——HTTPS可选择SSL终止或纯透传,SSH本身是加密协议,直接做TCP转发即可。以下是具体配置和验证步骤:
1. 修改HAProxy配置
编辑HAProxy主配置文件(通常为/etc/haproxy/haproxy.cfg),新增SSH流量转发规则,同时保留原有HTTPS配置。
新增SSH转发规则
# 监听服务器22端口,处理SSH流量 frontend gitlab_ssh bind *:22 mode tcp option tcplog default_backend gitlab_ssh_backend # 将SSH流量转发到GitLab服务器的SSH端口(默认22,若GitLab改了端口需同步修改) backend gitlab_ssh_backend mode tcp option tcplog server gitlab_ssh_node <你的GitLab服务器IP>:22 check inter 5s rise 2 fall 3
保留HTTPS转发配置(示例)
如果HAProxy做SSL终止(即HAProxy处理HTTPS加密,转发HTTP到GitLab),原有配置保持不变即可:
frontend gitlab_https bind *:443 ssl crt /path/to/your/ssl_cert.pem mode http option httplog default_backend gitlab_https_backend backend gitlab_https_backend mode http server gitlab_http_node <你的GitLab服务器IP>:80 check inter 5s rise 2 fall 3
若HAProxy仅做HTTPS流量透传(不终止SSL),则HTTPS的frontend和backend也要改为mode tcp,配置类似SSH规则,监听443端口转发到GitLab的443端口。
修改后重启HAProxy生效:
sudo systemctl restart haproxy
2. 确认GitLab的SSH配置
检查GitLab的SSH服务端口与HAProxy转发端口一致:
- 编辑GitLab配置文件
/etc/gitlab/gitlab.rb,确认以下配置(默认22,修改过需同步HAProxy的backend端口):gitlab_rails['gitlab_shell_ssh_port'] = 22 - 重新加载GitLab配置:
sudo gitlab-ctl reconfigure - 确认SSH服务正常运行:
sudo gitlab-ctl status sshd
3. 放行防火墙端口
确保HAProxy服务器的22和443端口被防火墙允许:
- 对于ufw防火墙:
sudo ufw allow 22/tcp sudo ufw allow 443/tcp sudo ufw reload - 对于firewalld防火墙:
sudo firewall-cmd --add-port=22/tcp --permanent sudo firewall-cmd --add-port=443/tcp --permanent sudo firewall-cmd --reload
4. 测试验证
- 测试SSH连通性:执行
ssh git@<HAProxy服务器IP>,能进入GitLab的SSH交互界面则转发正常。 - 测试Git SSH操作:尝试克隆或推送代码,比如
git clone git@<HAProxy服务器IP>:username/repo.git,验证流程顺畅。 - 验证HTTPS服务:保持原有HTTPS方式的代码提交/克隆操作,确认功能不受影响。
常见问题排查
- SSH连接超时:检查HAProxy是否正常监听22端口(
netstat -tulpn | grep haproxy),以及GitLab服务器的22端口是否能被HAProxy访问。 - SSH连接被拒绝:检查HAProxy的backend服务器IP和端口是否正确,GitLab的sshd服务是否正常运行。
- 权限错误:确认用户已在GitLab中添加正确的SSH公钥,且
git用户在GitLab服务器上的权限正常。
内容的提问来源于stack exchange,提问作者Dswiter
相关产品推荐
相关产品推荐

