使用 Nginx 代理内网 GitLab 并确保 SSH / HTTP 克隆地址正确

背景

 

公司有一个公网 IP 被分配或者映射到了某台内网的 CentOS 虚拟机上面,在这台机器上面安装 Nginx,实现了内网服务的域名解析等功能,提供外部访问能力。这可能是大多小公司的目前办公室内部的网络结构。

而 GitLab 直接安装的运行建议则是理想中的状态,也就是那台机器本身具有公网 IP 地址,域名可以直接解析到上面。

直接 nginx 反向代理用户是可以直接使用的,但是 ssh 克隆和 HTTP 克隆在页面上显示的地址可能会是内网 IP 地址,这样会导致:

当使用域名登录页面,在线浏览某个文件的时候,可能会跳转到 IP 地址的页面去,导致登录失效,甚至无法打开。

 

配置方法

 

GitLab 安装完成后自己是有 Nginx 的,也是因为其存在,导致代理容易出问题,所以需要修改配置:

1. 修改配置文件 gitlab.yml:

vim /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

# 修改内容如下
gitlab:
  host: git.baidu.com
  port: 443
  https: true

  ssh_host: git.baidu.com

我这里使用的是 HTTPS 的,所以端口使用 443 并开启了 https,配置 ssh 地址。

 

2. 修改配置文件 gitlab.rb:

vim /etc/gitlab/gitlab.rb

# 配置域名地址
external_url 'https://git.baidu.com'

# 配置 ssh 地址
gitlab_rails['gitlab_ssh_host'] = 'git.baidu.com'

# Nginx 授信地址
gitlab_rails['trusted_proxies'] = ['192.168.0.10']

# SSH 端口
gitlab_rails['gitlab_shell_ssh_port'] = 10022

# 服务监听方式
gitlab_workhorse['listen_network'] = "tcp"

# 服务监听地址
gitlab_workhorse['listen_addr'] = "0.0.0.0:10080"

# 禁用自带的 nginx
nginx['enable'] = false

修改这些配置之后达到的效果:

gitlab 自带的 nginx 关闭了,换成了监听 tcp 10080 端口,这样就能使用前置 nginx 反向代理该端口。

配置了域名地址和 ssh 地址,端口,这样页面上的克隆地址就会是这里配置的地址,ssh 端口使用 10022 是到时候 nginx 上面会使用的端口,gitlab 本身还是 22 的 ssh 端口。

 

3. 配置完成后重启 gitlab:

gitlab-ctl reconfigure
gitlab-ctl restart

 

4. 配置作为代理的 nginx:

http 反向代理配置,用于 http 克隆和 web 访问:

server {
    listen      443 ssl;
    server_name git.baidu.com;

    ssl_certificate      cert/git.baidu.com.pem;
    ssl_certificate_key  cert/git.baidu.com.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_redirect http:// https://;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.0.20:10080;
    }
}

注意,反向代理一定需要配置:proxy_set_header X-Forwarded-Ssl on; 否则会出现登录 422 的问题!

 

tcp 反向代理,用于 ssh 克隆:

upstream GITLAB {
    hash   $remote_addr consistent;
    server 192.168.0.20:22;
}

server {
    listen  10022;
    proxy_connect_timeout   30s;
    proxy_timeout   300s;
    proxy_pass  GITLAB;
}

注意 TCP 代理配置在 nginx 中和 HTTP 代理配置的位置不一样,如果不明白可以看之前的 Nginx 文章关于 TCP 端口代理。

到此,整个配置就完成!

 

posted @ 2021-01-14 09:43  Dy1an  阅读(931)  评论(0编辑  收藏  举报