使用 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 端口代理。

到此,整個配置就完成!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM