如何配置 GitLab 使用 HTTPS

本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或从新修改使用,但须要注明来源。 署名 4.0 国际 (CC BY 4.0)html

本文做者: 苏洋nginx

建立时间: 2019年08月18日 统计字数: 3653字 阅读时间: 8分钟阅读 本文连接: soulteary.com/2019/08/18/…git


如何配置 GitLab 使用 HTTPS

本文将聊聊如何在三种场景下,如何正确配置 GitLab ,为用户提供 HTTPS 服务。docker

为了行文的简单,这里一概使用容器进行搭建配置,若是你是源码、软件包部署,修改对应的文件配置便可。编程

直接使用 GitLab 处理 HTTPS

若是你既不须要统一管理 SSL 证书,又不须要强制流量只从一个网关入口进来,那么直接使用 GitLab 来处理 HTTPS 请求,或许是最好的方案。bash

这个方案只须要将证书部署到 GitLab 服务器上,而后稍加修改配置便可。服务器

若是使用 compose 配置来描述的话,删除掉全部不相关的配置后,涉及处处理 HTTPS 的配置以下(完整配置见历史文章、更多相关内容能够浏览 GitLab 标签):frontend

version: '3'

services:

  gitlab:
    image: 'gitlab/gitlab-ce:12.0.2-ce.0'
    hostname: 'gitlab.lab.com'
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - './cert/lab.com.crt:/etc/gitlab/ssl/lab.com.crt:ro'
      - './cert/lab.com.key:/etc/gitlab/ssl/lab.com.key:ro'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.lab.com'
        nginx['enable'] = true
        nginx['client_max_body_size'] = '250m'
        nginx['redirect_http_to_https'] = true
        nginx['redirect_http_to_https_port'] = 80
        nginx['ssl_certificate'] = "/etc/gitlab/ssl/lab.com.crt"
        nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/lab.com.key"
        nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
        nginx['ssl_prefer_server_ciphers'] = "on"
        nginx['ssl_protocols'] = "TLSv1.2"
        nginx['http2_enabled'] = true
        nginx['proxy_set_headers'] = {
          "X-Forwarded-Proto" => "http"
        }
复制代码

由于使用 GitLab 处理 HTTP/HTTPS 流量,因此须要开放 80443 端口。gitlab

正确配置端口以后,最关键的配置是 external_urlui

配置内容中须要包含 https 协议头,另外在 nginx['ssl_certificate']nginx['ssl_certificate_key'] 配置项中,须要填写正确的证书路径。

使用其余软件来处理 HTTPS

这里主要有两种场景,第一种是使用 Traefik 之类的代理软件,另外一种则是使用 云主机的 SLB 服务。

不管是出于想统一管理证书,仍是减小暴露在外的公开端口,流量通过统一入口转发到具体应用之上,均可以使用下面的方案来进行操做。

先聊聊使用 Traefik 做为网关的场景。

使用 Traefik 做为网关

traefik.toml 配置文件中涉及 HTTP 流量处理的配置主要是这部份内容:

defaultEntryPoints = ["http", "https"]

[entryPoints]
    [entryPoints.http]
        address = ":80"
        compress = true
        [entryPoints.http.redirect]
            entryPoint = "https"
    [entryPoints.https]
        address = ":443"
        compress = true
    [entryPoints.https.tls]
        [[entryPoints.https.tls.certificates]]
            certFile = "/data/ssl/lab.com.pem"
            keyFile = "/data/ssl/lab.com.key"
复制代码

和上一小节同样,删除掉全部不相关的配置后,核心配置以下:

version: '3'

services:

  gitlab:
    image: gitlab/gitlab-ce:12.1.6-ce.0
    hostname: 'gitlab.lab.com'
    expose:
      - 80
    labels:
      - "traefik.enable=true"
      - "traefik.gitlab.port=80"
      - "traefik.gitlab.frontend.rule=Host:gitlab.lab.com"
      - "traefik.gitlab.frontend.entryPoints=http,https"
      - "traefik.gitlab.frontend.headers.SSLProxyHeaders=X-Forwarded-For:https"
      - "traefik.gitlab.frontend.headers.STSSeconds=315360000"
      - "traefik.gitlab.frontend.headers.browserXSSFilter=true"
      - "traefik.gitlab.frontend.headers.contentTypeNosniff=true"
      - "traefik.gitlab.frontend.headers.customrequestheaders=X-Forwarded-Ssl:on"
      - "traefik.gitlab.frontend.passHostHeader=true"
      - "traefik.gitlab.frontend.passTLSCert=false"
    networks:
      - traefik
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.lab.com'
        nginx['enable'] = true
        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        nginx['http2_enabled'] = false
        nginx['redirect_http_to_https'] = true

networks:
  traefik:
    external: true
复制代码

由于使用 Traefik 处理 HTTP/HTTPS 流量,因此 GitLab 只须要开放 80 端口便可,可是须要在 label 中定义服务发现的各类规则。

一样的,这里的核心配置是 external_urlnginx['listen_https'],前者依旧要保持有 https 协议,可是后续则须要配置为 false

使用 SLB 做为网关

若是要使用云服务商的 SLB 来管理 HTTPS 流量和证书,那么上面的配置能够再简化一些:

version: '3'

services:

  gitlab:
    image: gitlab/gitlab-ce:12.1.6-ce.0
    hostname: 'gitlab.lab.com'
    ports:
      - 80:80
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.lab.com'
        nginx['enable'] = true
        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        nginx['proxy_set_headers'] = {
          "Host" => "$$http_host",
          "X-Real-IP" => "$$remote_addr",
          "X-Forwarded-For" => "$$proxy_add_x_forwarded_for",
          "X-Forwarded-Proto" => "http"
        }

networks:
  traefik:
    external: true
复制代码

在删除全部 labels 内容后,GitLab 还不可以正常运行,咱们必须再设置 nginx['proxy_set_headers'] ,配置 "X-Forwarded-Proto" => "http" ,让 GitLab 接受流量的时候,返回给代理软件正确的响应。

最后

此次就先折腾到这里,等项目上线后,再聊聊如何更高效的使用 GitLab

—EOF


我如今有一个小小的折腾群,里面汇集了一些喜欢折腾的小伙伴。

在不发广告的状况下,咱们在里面会一块儿聊聊软件、HomeLab、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。

喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核)

关于折腾群入群的那些事

相关文章
相关标签/搜索