Gitlab показывает 404 при работе за обратным прокси-сервером nginx, все в сети docker

Как следует из названия, я пытаюсь обслуживать Gitlab через обратный прокси nginx, причем обе программы запускаются в отдельных контейнерах docker, подключенных через сеть docker. Изображение в качестве примера:

Linux Host
 ____________________________
|                            |
| Docker                     |
|  __________________________|
| |                          |
| | Docker network (test-net)|
| |  ________________________|
| | |                        |
| | | nginx        gitlab    | Only nginx has a port bound to the host (443).
| | | |   |        |   |     | TLS is terminated at nginx as well.
| | | |   |   -->  |   |     | in my test, I have nginx running as localhost.
| | | |___|        |___|     | To access gitlab, hit https://localhost/git/
| | |________________________|
| |__________________________|
|____________________________|

nginx выполняется с помощью этой команды docker:

docker run -dit --network=test-net --name=nginx -p 443:443 -v "$PWD/conf":/etc/nginx:ro nginx:alpine && docker logs -f nginx

nginx.conf

<Removed unnecessary config from here, very basic setup>
http {
    keepalive_timeout 65;
    server {
        listen 443 ssl;
        server_name localhost;
        ssl_certificate localhost.crt;
        ssl_certificate_key localhost.key;
        ssl_protocols   TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5;
        location /git/ {
            proxy_pass http://test/;
        }
    }
}

gitlab.rb

<only relevant parts added here>
external_url 'https://localhost'
nginx['listen_port'] = 80
nginx['listen_https'] = false
nginx['proxy_set_headers'] = {
 "Host" => "$http_host_with_default",
 "X-Real-IP" => "$remote_addr",
 "X-Forwarded-For" => "$proxy_add_x_forwarded_for",
 "X-Forwarded-Proto" => "http",
 "Upgrade" => "$http_upgrade",
 "X-Forwarded-Ssl" => "on",
 "Connection" => "$connection_upgrade"
}
nginx['custom_error_pages'] = {
  '404' => {
    'title' => '404',
    'header' => 'You\'ve been hit by !! You\'ve been struck by ! A false URL.',
    'message' => 'Double check that URL! Is it correct?'
  }
}

docker-compose.yml for gitlab:

version: '3.7'
services:
  gitlab:
    image: 'internal-docker-repo:1234/gitlab/gitlab-ce:11.8.3-ce.0'
    restart: always
    hostname: 'test'
    container_name: test
    volumes:
      - './config:/etc/gitlab:rw'
    networks:
      - net
networks:
  net:
    external: true
    name: test-net

Внутренне (для сетей докеров) nginx известен как nginx, а gitlab известен как test. Я подтвердил, что могу пинговать каждый контейнер изнутри другого, используя их имена контейнеров.

Как и сейчас, она почти работает. Когда я захожу в https://localhost/git/ на моем хосте Linux, я получаю страницу ошибки 404 от gitlab, но без экрана входа.

the 404 screen. Custom, so I know gitlab is running and picked up the configuration

Я, очевидно, упускаю что-то , но я не уверен, что это такое. Мне трудно сказать, является ли это проблемой конфигурации NGinx или проблемой конфигурации Gitlab.

Вывод журнала при нажатии https://localhost/git/

nginx log output:

172.19.0.1 - - [07/Jan/2020:21:28:35 +0000] "GET /git/ HTTP/1.1" 404 2289 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"      

gitlab log output:

test      | ==> /var/log/gitlab/nginx/gitlab_access.log <==
test      | 172.19.0.3 - - [07/Jan/2020:21:28:35 +0000] "GET / HTTP/1.0" 404 2289 "" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
test      | 
test      | ==> /var/log/gitlab/gitlab-workhorse/current <==
test      | 2020-01-07_21:28:35.10649 test 127.0.0.1:0 - - [2020/01/07:21:28:35 +0000] "GET / HTTP/1.1" 404 3108 "" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0" 0.001
test      | 
0
задан 7 January 2020 в 23:38
4 ответа

Я думаю, что по крайней мере одна из проблем (если не самая важная) заключается в том, что gitlab ожидает https: // localhost в качестве URL-адреса в вашем браузере. К сожалению, вы не даете ему это, а https: // localhost / git , хотя запрос явно достигает серверной части (которая является контейнером gitlab).

Изменение внешней директивы url на внутреннем nginx на « https: // localhost / git » может сработать как быстрое решение. Очевидно, вам необходимо впоследствии перенастроить gitlab:

sudo gitlab-ctl reconfig

Однако на вашем месте я бы использовал выделенный домен для gitlab (т.е. отдельный серверный блок в nginx), так как это было бы для меня более понятным. Что-то вроде:

server {
        listen 443 ssl;
        server_name gitlab.example.com;
        ssl_certificate localhost.crt;
        ssl_certificate_key localhost.key;
        ssl_protocols   TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5;
        location / {
            proxy_pass http://test/;
              }
        }

А затем, конечно, измените external_url на gitlab.example.com.

Поскольку вы все равно используете localhost, я не думаю, что вам будет очень сложно, если вы добавите этот новый домен в / etc / hosts: 127.0.0.1 gitlab.example.com

1
ответ дан 14 January 2020 в 20:23

Причина

Причина, по которой вы не можете подключиться, связана с местоположением в Nginx не соответствует URL-адресу external_url , определенному в gitlab.rb.

В конфигурации Nginx вы указываете location / git / , а в конфигурации Gitlab вы используете https: // localhost . Это вызовет ошибку: когда клиент запрашивает доступ к https: // localhost / git , он всегда будет следовать за «git /» в конце URI, однако ваш Gitlab настроен для доступа через https: // localhost , поэтому он никогда не сможет найти веб-страницу!

Решение:

Или измените location / git / на location / или измените https: // localhost на https : // localhost / git .

Пример

Вот моя полная конфигурация на моем докере, вы можете использовать это как ссылку:

* Примечание: 172.16.0.10 - это IP-адрес сервера Gitlab, gitlab .drive.nr разрешает IP-адрес сервера Nginx

Докер Nginx:

$ cat nginx-r.sh 
sudo docker run -itd --name=nginx-r \
    --network=testenv \
    --ip 172.16.0.3 \
    --dns 172.16.0.2 \
    -h rproxy.drive.nr \
    -p 80:80 -p 443:443 \
    -v nginx-config:/etc/nginx \
    -v nginx-certs:/etc/ssl/private \
    nginx:alpine

Докер Gitlab:

$ cat gitlab.sh 
sudo docker run --detach \
  --hostname gitlab.drive.nr \
  --name gitlab \
  --restart always \
  --network testenv \
  --ip 172.16.0.10 \
  --dns 172.16.0.2 \
  --volume gitlab-config:/etc/gitlab \
  --volume gitlab-logs:/var/log/gitlab \
  --volume gitlab-data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest

Конфигурации Nginx:

# cat conf.d/sites-enabled/gitlab.conf 
server {
  listen   80;
  location / {
    return 301 https://172.16.0.10;
    }
}

server {
  listen   443 ssl;
  server_name   gitlab.drive.nr;
  ssl_certificate /etc/ssl/private/gitlab.crt;
  ssl_certificate_key /etc/ssl/private/gitlab.key;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  location /git {
    proxy_pass http://172.16.0.10;
  }
}

Конфигурации Gitlab:

# cat gitlab-config/gitlab.rb |grep -v ^#
external_url 'http://gitlab.drive.nr/git'

Тестовый диск

enter image description here

Вход в Nginx:

172.16.0.1 - - [14/Jan/2020:23:35:26 +0000] "GET /git HTTP/1.1" 302 102 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:26 +0000] "GET /git/users/sign_in HTTP/1.1" 302 150 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:26 +0000] "GET /git/users/password/edit?reset_password_token=ayjmm32J3Ry_gDR8JbzU HTTP/1.1" 200 9502 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:26 +0000] "GET /git/assets/application-aeddf31361633b3d1196c6483f25c484855e0f243e7f7e62686a4de9e10ec03b.css HTTP/1.1" 200 149097 "https://gitlab.drive.nr/git/users/password/edit?reset_password_token=ayjmm32J3Ry_gDR8JbzU" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:26 +0000] "GET /git/assets/print-74c3df10dad473d66660c828e3aa54ca3bfeac6d8bb708643331403fe7211e60.css HTTP/1.1" 200 382 "https://gitlab.drive.nr/git/users/password/edit?reset_password_token=ayjmm32J3Ry_gDR8JbzU" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:26 +0000] "GET /git/assets/webpack/runtime.ee78bc38.bundle.js HTTP/1.1" 200 2134 "https://gitlab.drive.nr/git/users/password/edit?reset_password_token=ayjmm32J3Ry_gDR8JbzU" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:26 +0000] "GET /git/assets/highlight/themes/white-3144068cf4f603d290f553b653926358ddcd02493b9728f62417682657fc58c0.css HTTP/1.1" 200 864 "https://gitlab.drive.nr/git/users/password/edit?reset_password_token=ayjmm32J3Ry_gDR8JbzU" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:26 +0000] "GET /git/assets/webpack/main.b91d0a07.chunk.js HTTP/1.1" 200 830262 "https://gitlab.drive.nr/git/users/password/edit?reset_password_token=ayjmm32J3Ry_gDR8JbzU" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:26 +0000] "GET /git/assets/webpack/default.ca6f81b2.chunk.js HTTP/1.1" 200 159 "https://gitlab.drive.nr/git/users/password/edit?reset_password_token=ayjmm32J3Ry_gDR8JbzU" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:27 +0000] "GET /git/assets/icons-e91700f3f1ecff110fc2c35aa62aec8f2aad69d1bfb35844186a11175a79e25f.svg HTTP/1.1" 200 25983 "https://gitlab.drive.nr/git/users/password/edit?reset_password_token=ayjmm32J3Ry_gDR8JbzU" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:27 +0000] "GET /git/assets/touch-icon-ipad-retina-8ebe416f5313483d9c1bc772b5bbe03ecad52a54eba443e5215a22caed2a16a2.png HTTP/1.1" 200 5662 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
172.16.0.1 - - [14/Jan/2020:23:35:27 +0000] "GET /git/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png HTTP/1.1" 200 1611 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
1
ответ дан 14 January 2020 в 22:40

Я столкнулся с проблемой, описанной здесь.

Следующие настройки заработали.

GitLab Docker:

      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://<domain>/gitlab/'

[...]

    ports:
      - "8929:80"

NGINX:

   location /gitlab/ {

      #  ## https://github.com/gitlabhq/gitlabhq/issues/694
      #  ## Some requests take more than 30 seconds.
       proxy_read_timeout      300;
       proxy_connect_timeout   300;
       proxy_redirect          off;

       proxy_http_version 1.1;

       proxy_set_header    Host                $http_host;
       proxy_set_header    X-Real-IP           $remote_addr;
       proxy_set_header    X-Forwarded-Ssl     on;
       proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
       proxy_set_header    X-Forwarded-Proto   $scheme;

       proxy_pass http://<domain>:8929/gitlab/;
}
0
ответ дан 13 October 2020 в 19:26

У меня была похожая проблема (и Gitlab, и Nginx работали как контейнеры Docker).

Причиной моей ошибки было ошибочное использование протокола https при определении параметра external_url.

Т.е. это должно быть:

external_url 'http://MY_DOMAIN'

а не:

external_url 'https://MY_DOMAIN'

Моя конфигурация Nginx обрабатывала для меня перенаправление http -> https.

Надеюсь, это поможет людям, столкнувшимся с той же проблемой.

0
ответ дан 20 January 2021 в 12:35

Теги

Похожие вопросы