配置 nginx 代理 GitLab CE(均为 docker 容器)

配置 nginx 代理 GitLab CE(均为 docker 容器)

以下两个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  

相关内容