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