场景描述
网络环境:GitLab 部署在内网,通过内网穿透(如 frp)映射到外网。
外网访问:https://gitlab.dev.example.com(不带端口)。
内网转发:穿透工具将流量转发至内网机器的 http://127.0.0.1:10022。
一、 Web 访问配置 (HTTPS)
目标:解决 HTTPS 域名访问内网 HTTP 端口导致的链接生成错误、登录重定向问题。
- 修改 GitLab 配置文件 /etc/gitlab/gitlab.rb
# 1. 设置外网显示的完整域名,协议必须为 https
external_url 'https://gitlab.dev.example.com'
# 2. 指定 GitLab 内部 Nginx 监听的内网物理端口
nginx['listen_port'] = 9600
# 3. 关键:虽然外部是 HTTPS,但内部穿透转发是 HTTP,所以关闭内部 SSL 监听
nginx['listen_https'] = false
# 4. 强制传递协议头,避免登录后跳转到 http 或重定向次数过多
nginx['proxy_set_headers'] = {
"X-Forwarded-Proto" => "https",
"X-Forwarded-Ssl" => "on"
}
- 生效配置
sudo gitlab-ctl reconfigure
二、 SSH 访问配置 (Git Clone)
问题排查:ssh -T 提示输入密码是因为请求打到了外网服务器自身的 22 端口,而非内网 GitLab。
- 内网穿透工具 (frp) 配置
需要在 frp 客户端增加一个 TCP 协议转发,将外网某个端口(如 10022)映射到内网 GitLab 的 22 端口。 - 修改 GitLab 的 SSH 端口显示
为了让 GitLab 网页端显示的克隆链接正确(带上穿透端口),修改 /etc/gitlab/gitlab.rb:
# 告知 GitLab 页面显示的 SSH 克隆地址使用 10022 端口
gitlab_rails['gitlab_shell_ssh_port'] = 10022
三、 核心知识点总结
external_url:不仅是访问地址,还决定了 GitLab 内部链接、邮件、克隆地址的生成格式。
listen_https = false:当外网穿透工具已处理了 SSL 证书并以 HTTP 方式转发给 GitLab 时,此项必须设为 false。
X-Forwarded-Proto:这是前后端协议一致性的“桥梁”,配置后可解决 HTTPS 环境下的登录失效和跳转错误。
SSH 穿透:Nginx 的 http 模块无法转发 SSH 流量。必须通过 frp 的 tcp 模式转发,或者使用 Nginx 的 stream 模块。