如何配置 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、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)

關於折騰羣入羣的那些事

相關文章
相關標籤/搜索