问题描述
在 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)这里仅演示最简单的配置(甚至连客户端的真实网络地址都无法正确传递)