Nginx

使用 docker-compose 在一個虛擬機中安裝 gitlab,該代理在另一個虛擬機中添加 https

  • March 27, 2022

我有一個帶有多個虛擬機的伺服器,其中一個是我的代理,它將正確的域引導到正確埠上的正確 VM。

  1. 我使用標準的 docker-compose 文件來創建 gitlab-ce 和 gitlab-runner
  2. 我按代理中的域重定向到我的 docker VM 中的埠 8080

這一切都很好,我可以使用https://gitlab.mydomain.de登錄我的瀏覽器。

現在的問題是:所有指向跑步者的連結和指向複製儲存庫的連結都以http://localhost而不是https://gitlab.mydomain.de.

docker-compose 文件中的選項 GITLAB_OMNIBUS_CONFIG->external_url包含 http://localhost,所以我將其更改為https://gitlab.mydomain.de,停止並重新啟動 docker 容器

docker-compose down; docker-compose up

但是這次我只在瀏覽器中收到502 Bad Gateway 錯誤。

這是我的代理配置:

server {
 listen 10.77.77.254:443 ssl;
 listen [2a01:4f8:241:1d02:0:77:77:254]:443 ssl;
 server_name gitlab.mydomain.de;
 include snippets.d/ssl_generic;
 ssl_certificate     /etc/letsencrypt/live/gitlab.mydomain.de/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/gitlab.mydomain.de/privkey.pem;
 include snippets.d/standard;
 location / {
     include                     snippets.d/proxy_generic;
     proxy_pass                  http://10.77.77.107:8080;
 }
}

這是我的docker-compose.yml

version: '3.7'
services:
 web:
   image: 'gitlab/gitlab-ce:latest'
   restart: always
   hostname: 'localhost'
   container_name: gitlab-ce
   environment:
     GITLAB_OMNIBUS_CONFIG: |
       external_url 'https://gitlab.mydomin.de'
   ports:
     - '8080:80'
     - '8443:443'
   volumes:
     - '/var/docker/gitlab/config:/etc/gitlab'
     - '/var/docker/gitlab/logs:/var/log/gitlab'
     - '/var/docker/gitlab/data:/var/opt/gitlab'
   networks:
     - gitlab
 gitlab-runner:
   image: gitlab/gitlab-runner:alpine
   container_name: gitlab-runner    
   restart: always
   depends_on:
     - web
   volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     - '/var/docker/gitlab/gitlab-runner:/etc/gitlab-runner'
   networks:
     - gitlab

networks:
 gitlab:
   name: gitlab-network

如果我改變

external_url 'https://gitlab.mydomain.de'

返回 http

external_url 'http://gitlab.mydomain.de'

然後設置再次工作(但現在網路界面上的錯誤 URL 僅以“http://”開頭)。

問題似乎出https在 external_url 中。

如果我將 proxy_pass 更改為http://10.77.77.107:8433docker-compose 文件中將 ssl 埠呈現給主機的位置,則會收到400 Bad Request 錯誤:

400 Bad Request The plain HTTP request was sent to HTTPS port

更新: 他們在這裡說:

預設情況下,當您指定 external_url 時,Omnibus GitLab 將設置一些 NGINX 代理標頭,這些標頭在大多數環境中被認為是正常的。

例如,Omnibus GitLab 將設置:

"X-Forwarded-Proto" => "https",
"X-Forwarded-Ssl" => "on"

如果您在 external_url 中指定了 https 架構。

但是,如果您的 GitLab 處於更複雜的設置中,例如在反向代理後面,您將需要調整代理標頭以避免錯誤,例如您想要的更改被拒絕或無法驗證 CSRF 令牌真實性已完成 422 無法處理。

我嘗試覆蓋預設標題。在綜合部分的 docker-compose 文件中,我添加了 X-Forwarded-Proto: http:

environment:
 GITLAB_OMNIBUS_CONFIG: |
   external_url 'https://gitlab.mydomain.de'
   letsencrypt['enabled'] = false
   nginx['listen_port'] = 80
   nginx['proxy_set_headers'] = { "X-Forwarded-Proto" => "http", 'X-Forwarded-Ssl' => 'off' }

但這也無濟於事

我該如何解決這個問題?

無需覆蓋預設標題。在docker-compose.ymlGITLAB_OMNIBUS_CONFIG 部分的文件中,只需添加nginx['listen_https'] = false

environment:
 GITLAB_OMNIBUS_CONFIG: |
   external_url 'https://gitlab.mydomain.de'
   letsencrypt['enabled'] = false
   nginx['listen_https'] = false
   nginx['listen_port'] = 80

這將禁用 docker 內的 SSL,並且您的 reverse_proxy 可以執行 SSL 操作

https://docs.gitlab.com/omnibus/settings/nginx.html#external-proxy-and-load-balancer-ssl-termination

引用自:https://unix.stackexchange.com/questions/696924