本文使用「署名 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、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。
喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核)