本文使用「署名 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 服務。docker
爲了行文的簡單,這裏一概使用容器進行搭建配置,若是你是源碼、軟件包部署,修改對應的文件配置便可。編程
若是你既不須要統一管理 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 流量,因此須要開放 80
和 443
端口。gitlab
正確配置端口以後,最關鍵的配置是 external_url
。ui
配置內容中須要包含 https
協議頭,另外在 nginx['ssl_certificate']
和 nginx['ssl_certificate_key']
配置項中,須要填寫正確的證書路徑。
這裏主要有兩種場景,第一種是使用 Traefik 之類的代理軟件,另外一種則是使用 雲主機的 SLB 服務。
不管是出於想統一管理證書,仍是減小暴露在外的公開端口,流量通過統一入口轉發到具體應用之上,均可以使用下面的方案來進行操做。
先聊聊使用 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_url
和 nginx['listen_https']
,前者依舊要保持有 https
協議,可是後續則須要配置爲 false
。
若是要使用雲服務商的 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、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)