问题描述

在 GitLab 中,内置 Nginx 服务,但是在部分场景下,部署 GitLab 的主机还会部署 Web 服务,所以就会形成如下架构:

Client -->> Nginx -->> Nginx within GitLab -->> GitLab Backend
                \
                 \-->> Other Web Service

再比如,我们使用 GitLab Omnibus 部署 GitLab 服务,而外部使用 Nginx 反向代理,而非主机网络。所以就会形成如下架构:

Client -->> Nginx -->> Nginx within GitLab Omnibus -->> GitLab Backend

该笔记将记录:配置 Nginx 反响代理 GitLab 服务,以及其中可能会遇到的问题。

注意事项

1)当我们提到“Nginx”时,是专指 Client 请求的 Nginx,而不是 GitLab 内置的 Nginx;
2)我们将使用“Nginx within GitLab”来表示 GitLab 内置的 Nginx(包括 GitLab Omnibus 的 Nginx);

场景一、Nginx -->> GitLab Omnibus

Nginx 提供 HTTPS 服务,而以 HTTP 来请求后端的 GitLab 服务。

使用如下 Nginx 配置即可:

server {
    listen   443 ssl;
    server_name gitlab.example.com;

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key  /path/to/privkey.pem;

    location / {
            proxy_pass          http://127.0.0.1:8080;
    }
}

后端 GitLab 使用如下 gitlab.rb 配置:

...
external_url 'https://git.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 22
...
nginx['listen_port'] = 80
nginx['listen_https'] = false
...

参数 external_url 指定外部地址。当 GitLab 创建地址时(比如在页面中显示的 clone 地址),将使用该值作为前缀。但是当 external_url 以 https 为前缀时,GitLab(在容器内)将监听 443 端口,而不再监听 80 端口。这需要通过 nginx['listen_port']nginx['listen_https'] 进行控制,使 external_url 以 https 为前缀时依旧监听 80 端口。

注意事项:
1)这里仅演示最简单的配置(甚至连客户端的真实网络地址都无法正确传递)