Gitlab Omnibus: как переписать URL с помощью nginx в комплекте - PullRequest
0 голосов
/ 27 сентября 2018

Текущая конфигурация

Я перенес свой GitLab на новый сервер.В рамках миграции некоторые хранилища были реорганизованы.У нас есть веб-сайт, который напрямую ссылается на файлы raw и blob в GitLab.Я хотел бы перенаправить все HTTPS-запросы со старых URL-адресов на новые, для этих raw и blob файлов.

Я использую пакет Gitlab Omnibus, св комплекте установка nginx.Я основывался на принятом ответе на этот вопрос: Gitlab Omnibus: как перенаправить все запросы в другой домен , что в свою очередь ссылается на официальную документацию GitLab: https://docs.gitlab.com/omnibus/settings/nginx.html#inserting-custom-settings-into-the-nginx-config.

  1. Создать каталог конфигурации nginx, поскольку он еще не существует:

    sudo mkdir -p /etc/nginx/conf.d/

  2. Создать /etc/nginx/conf.d/redirect.conf:

.

server {
  server_name gitlab.itextsupport.com;
  rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;
}

Отредактируйте файл конфигурации в /etc/gitlab/gitlab.rb, добавив следующую строку:

nginx['custom_nginx_config'] = "include /etc/nginx/conf.d/redirect.conf;"

Перепишите конфигурацию nginx:

sudo gitlab-ctl reconfigure

Перезапустите пакетный nginx:

sudo gitlab-ctl restart nginx

Убедитесь, что в комплект поставки nginx входитфайл перенаправления:

sudo grep 'redirect.conf' /var/opt/gitlab/nginx/conf/nginx.conf

Проверка конфигурации

curl -I https://gitlab.itextsupport.com/itext/tutorial/blob/master/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java

Ожидаемый результат

/samples вставляется после/blob/master.Я ожидаю увидеть 301 переписать в https://gitlab.itextsupport.com/itext/tutorial/blob/master/samples/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java

Фактический результат

200 ОК на неизмененном URL.

Гадкий хак

Добавить эту строку в/var/opt/gitlab/nginx/conf/gitlab-http.conf и перезапустите пакет nginx:

rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;

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

Недостаток: эта строка будет потеряна каждый развремя gitlab-ctl reconfigure запущено.

Вопрос

Что мне нужно изменить, чтобы перезапись URL-адресов работала должным образом?Без безобразного хака?

Дополнительная информация

Когда я запускаю sudo /opt/gitlab/embedded/sbin/nginx -p /var/opt/gitlab/nginx -T, я вижу два server { } блока.До сих пор моя рабочая теория состояла в том, что nginx выбирает только первый блок сервера и игнорирует второй.Если бы я мог найти способ объединить оба блока сервера способом, совместимым с файлом конфигурации /etc/gitlab/gitlab.rb, то моя проблема, скорее всего, будет решена.

1 Ответ

0 голосов
/ 27 сентября 2018

Ну, похоже, ответ смотрел мне в лицо в gitlab.rb.На одну строку выше nginx['custom_nginx_config'], есть nginx['custom_gitlab_server_config'].Я поместил туда оператор include и убрал скобки server {} вокруг правил перезаписи.Это также описано в документации GitLab по адресу https://docs.gitlab.com/omnibus/settings/nginx.html#inserting-custom-nginx-settings-into-the-gitlab-server-block:

. Вставляет определенную строку в конец блока сервера /var/opt/gitlab/nginx/conf/gitlab-http.conf.

Так что эточто я сделал:

  1. В /etc/gitlab/gitlab.rb закомментируйте строку nginx['custom_nginx_config'] и добавьте:

    nginx['custom_gitlab_server_config'] = "include /etc/nginx/conf.d/redirect.conf;"

  2. В /etc/nginx/conf.d/redirect.conf, только оставьте строку перезаписи самостоятельно:

    rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;

  3. Переконфигурируйте GitLab:

    sudo gitlab-ctl reconfigure

  4. Перезапустите nginx:

    sudo gitlab-ctl restart nginx

  5. Проверьте конфигурацию nginx:

    sudo /opt/gitlab/embedded/sbin/nginx -p /var/opt/gitlab/nginx -T | tail -n 20

.

nginx: the configuration file /var/opt/gitlab/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /var/opt/gitlab/nginx/conf/nginx.conf test is successful

  include /etc/nginx/conf.d/redirect.conf;
}

# configuration file /etc/nginx/conf.d/redirect.conf:
rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;

# configuration file /var/opt/gitlab/nginx/conf/nginx-status.conf:
server  {
    listen 127.0.0.1:8060;
    server_name localhost;
    location /nginx_status {
      stub_status on;
      server_tokens off;
      access_log off;
      allow 127.0.0.1;
      deny all;
    }
}

Проверьте перезапись URL:

curl -I https://gitlab.itextsupport.com/itext/tutorial/blob/master/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java

.

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 27 Sep 2018 11:32:23 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://gitlab.itextsupport.com/itext/tutorial/blob/master/samples/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java
Strict-Transport-Security: max-age=31536000

Одна вещь, которую я до сих порЛюбопытно о:

  • Строка rewrite завершилась за пределами блок server{}.
  • В строке rewrite используется переменная $server_name.
  • Переменная $server_name определена внутри блока server{}.

Это визуально сбивает с толку из-за того, как странные способы отображения включенных операторов отображаютсяnginx -T?Линия rewrite действительно внутри блока server{}, даже если она выглядит как снаружи ?Почему вещи не таковы, какими кажутся, и почему документация GitLab написана на герметичном языке?Увы, эти размышления могут навсегда остаться без ответа.

...