背景
公司有一个公网 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 端口代理。
到此,整个配置就完成!