以下两个docker容器正在我的机器上运行:
nginx 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
gitlab/gitlab-ce:latest 0.0.0.0:32782->22/tcp, 0.0.0.0:32781->80/tcp, 0.0.0.0:32780->443/tcp gitlab
目前我还不知道如何配置 nginx 来反向代理用户请求。如果用户输入http://gitlab.domain.com我的设置返回 502 Bad Gateway Error。
Server config:
server{
listen 80;
listen [::]:80;
server_name gitlab.domain.com www.gitlab.domain.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://gitlab:32781;
proxy_redirect off;
}
}
答案1
对于我来说,jwilder/nginx-proxy 容器的配置如下。
web:
image: 'gitlab/gitlab-ce:latest'
hostname: 'gitlab.it-expert.com.ua'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.it-expert.com.ua'
registry_external_url 'https://registry.it-expert.com.ua'
VIRTUAL_HOST: gitlab.it-expert.com.ua,registry.it-expert.com.ua
VIRTUAL_PORT: 443
VIRTUAL_PROTO: https
volumes:
- './data/config:/etc/gitlab'
- './data/logs:/var/log/gitlab'
- './data/data:/var/opt/gitlab'
棘手的部分是弄清楚容器如何连接以及哪个容器和谁应该处理 SSL。
对于此配置,您应该为 nginx-proxy 和 gitlab-ce 容器提供 SSL 证书,因为它们之间的通信也使用 SSL。对于 gitlab-ce,请使用 ./data/config/ssl 文件夹。
您可以在我的博客文章如何通过方便的 docker 容器 certbot 从 Let's encrypt 快速获取有效证书。
答案2
这是一个有效的docker-compose.yml:
gitlab:
image: "gitlab/gitlab-ce:latest"
container_name: gitlab
volumes:
- ./gitlab/config:/etc/gitlab
- ./gitlab/logs:/var/log/gitlab
- ./gitlab/data:/var/opt/gitlab
- /home/user/nginx-proxy/certs:/etc/gitlab/ssl/
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://git.example.org'
VIRTUAL_HOST: git.example.org
VIRTUAL_PORT: 443
VIRTUAL_PROTO: https
LETSENCRYPT_HOST: git.example.org
LETSENCRYPT_EMAIL: [email protected]
restart: always
使用 jwilder/nginx-proxy 容器作为 Max Prokopov 的答案。对于我的情况来说,关键部分是 VIRTUAL_PORT 和 VIRTUAL_PROTO 环境变量。不正确地设置它们会导致 Nginx 400 错误:“ The plain HTTP request was sent to HTTPS port
”。
这是 conf.d/default.conf nginx 文件的 gitlab 部分的 spinet:
upstream git.example.org {
## Can be connect with "bridge" network
# gitlab
server 172.17.0.4:443;
}
server {
server_name git.example.org;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
return 301 https://$host$request_uri;
}
server {
server_name git.example.org;
listen 443 ssl http2 ;
access_log /var/log/nginx/access.log vhost;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ...;
ssl_certificate /etc/nginx/certs/git.example.org.crt;
ssl_certificate_key /etc/nginx/certs/igit.example.org.key;
ssl_dhparam /etc/nginx/certs/git.example.org.dhparam.pem;
add_header Strict-Transport-Security "max-age=31536000";
include /etc/nginx/vhost.d/default;
location / {
proxy_pass https://git.example.org;
}
}
答案3
你不需要将 gitlab 容器端口映射到主机端口,因为 nginx 容器知道其他容器,然后尝试
proxy_pass http://gitlab;
你必须先链接容器,然后才能运行 nginx 容器的命令
--link gitlab:gitlab