Gerrit, проксируемый nginx, работает, только если "размещен" в каталоге верхнего уровня - PullRequest
2 голосов
/ 27 июня 2019

У меня супер странная проблема. Я пытаюсь использовать nginx для переноса gerrit в SSL / HTTPS, и он работает только в том случае, если я позволю dev.company.com/ указать на gerrit (я бы предпочел dev.company.com/gerrit/, так как веб-сервер также должен хост другие услуги.)

Это единственное рабочее решение, которое мне удалось найти.

gerrit's etc / gerrit.config:

[gerrit]
    canonicalWebUrl = https://dev.company.com/
[httpd]
    listenUrl = proxy-https://127.0.0.1:8081/
(snip)

Конфигурация nginx на сайтах-доступно:

server {
  listen 443 ssl;
  server_name dev.company.com;

  ssl on;
  (ssl certificates blah blah)

  location / {
    proxy_pass        http://127.0.0.1:8081;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  Host $host;
  }
}

Если я перехожу на следующее:

gerrit.config:

[gerrit]
    canonicalWebUrl = https://dev.company.com/gerrit/
[httpd]
    listenUrl = proxy-https://127.0.0.1:8081/
(snip)

Конфигурация nginx:

server {
  listen 443 ssl;
  server_name dev.company.com;

  ssl on;
  (ssl certificates blah blah)

  location /gerrit/ {
    proxy_pass        http://127.0.0.1:8081/;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  Host $host;
  }
}

(Обратите внимание на косую черту на proxy_pass.)

Вещи работают, кроме запросов с экранированными символами (например,% 2F, у которых gerrit много.) Итак, gerrit, как сайт, будет работать на полпути.

Я чувствую, что этот ответ должен вести в правильном направлении, но я просто не мог заставить вещи работать.

Редактировать: я думаю это обсуждение затронет ту же ошибку.

Ответы [ 2 ]

1 голос
/ 15 июля 2019

Последнее обсуждение, на которое вы ссылаетесь, https://groups.google.com/forum/#!topic/repo-discuss/iSHHa4krRLo, на самом деле содержит разрешение:

Однако, для записи, я даю попытку nginx с директивой proxy_pass без / gerrit, и это сработало.

Это потому, что вы не должны использовать косую черту или любую другую спецификацию пути в пределах proxy_pass согласно https://stackoverflow.com/a/49702013,, на которую вы и они оба ссылаетесь, чтобы избежать нормализации пути и декодируется.


gerrit.config:

[gerrit]
    canonicalWebUrl = https://dev.example.com/gerrit/
[httpd]
    listenUrl = proxy-https://127.0.0.1:8081/gerrit/

nginx.conf:

server {
  listen 443;
  server_name dev.example.com;

  ssl  on;
  ssl_certificate      conf/server.crt;
  ssl_certificate_key  conf/server.key;

  location ^~ /gerrit/ {
    proxy_pass        http://127.0.0.1:8081;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  Host $host;
  }
}

Все это действительно просто из https://gerrit -review.googlesource.com / Documentation / config-reverseproxy.html , TBH.

Казалось бы, конечный /gerrit/ в httpd.listenUrl и отсутствие конечного / в proxy_pass - это изменения, которые необходимо внести в вашу конфигурацию для правильной работы.

Проблема, с которой вы сталкиваетесь при декодировании экранированных символов, действительно описана в https://stackoverflow.com/a/49702013, и именно из-за косой черты в proxy_pass, которую вы использовали без веской причины.

1 голос
/ 11 июля 2019

Речь идет только о правильной конфигурации context path (/gerrit в вашем случае).

Пожалуйста, попробуйте:

gerrit.conf

[gerrit]
    canonicalWebUrl = https://dev.company.com/gerrit/
[httpd]
    listenUrl = proxy-https://127.0.0.1:8081/gerrit/

listenUrl также позволяет настроить контекстный путь - https://gerrit -review.googlesource.com / Documentation / config-gerrit.html # httpd.listenUrl

nginx config

server {
  listen 443 ssl;
  server_name dev.company.com;

  ssl on;
  (ssl certificates blah blah)

  location /gerrit/ {
    proxy_pass        http://127.0.0.1:8081/gerrit/;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  Host $host;
  }
}

Edit:

Попробуйте это proxypass, чтобы избежать декодирования:

proxy_pass    http://127.0.0.1:8081/gerrit$request_uri;
...