Jenkins сообщает о неправильной настройке обратного прокси-сервера в Apache с использованием виртуальных узлов с SNI

Я настраиваю сервер Jenkins для работы под Tomcat за Apache. Я использую виртуальные хосты с SSL с использованием SNI, поэтому я могу получить к нему доступ по адресу https://jenkins.example.com/ и обслуживать что-то еще, например, на http://www.example.com/.

Я запустил его и запустил, но когда я нажимаю "Управление Дженкинсом", он говорит мне, что кажется, что ваш обратный прокси-сервер нарушен.

Обратите внимание, что я использую самозаверяющий сертификат SSL, а jenkins.example.com не является виртуальным хостом по умолчанию.

Соответствующая конфигурация apache выглядит следующим образом:

<VirtualHost *:80>
        ServerName jenkins.example.com
        Redirect / https://jenkins.example.com/
</VirtualHost>

<VirtualHost *:443>
  ServerName jenkins.example.com

  SSLEngine on

  SSLCertificateFile    /etc/ssl/certs/jenkins.example.com.crt
  SSLCertificateKeyFile /etc/ssl/private/jenkins.example.com.key

  <Location />
     AuthType Digest
     AuthName "Jenkins"
     AuthUserFile "/etc/htpasswords"
     Require valid-user
   </Location>

   ProxyRequests     Off
   ProxyPreserveHost On

   <Proxy http://localhost:8080*>
     Order deny,allow
       Allow from all
   </Proxy>

   ProxyPass         /  http://localhost:8080/
   ProxyPassReverse  /  http://localhost:8080/
   ProxyPassReverse  /  https://jenkins.example.com

</VirtualHost>

Если я сделаю:

curl --user "username:password" --digest -k https://jenkins.example.com/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/test -L

Тогда я вижу вывод:

<div/>

Если я запускаю wget с отладкой, то вижу, что в какой-то момент wget получает указатель на http вместо https, не уверенный, почему это происходит или он связан, но он перенаправляет правильно:

---response begin---
HTTP/1.1 302 Moved Temporarily
Date: Tue, 17 Jan 2012 19:47:16 GMT
Server: Apache-Coyote/1.1
Location: http://jenkins.example.com/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/test-for-reverse-proxy-setup
Content-Length: 0
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/plain

Я работаю на Ubuntu 11.04, Apache 2.2.17, Tomcat 6.0.28, Jenkins 1.448.

3 ответа

Решение

Одна проблема, которую я вижу с вашей конфигурацией, заключается в том, что:

ProxyPassReverse  /  https://jenkins.example.com

Должно быть:

ProxyPassReverse  /  https://jenkins.example.com/

Похоже, сервис отправляет http:// вместо https:// заголовки местоположения (вероятно, потому что ваше соединение с его слушателем из Apache незашифровано на слушателе localhost), в этом случае вам нужно добавить:

ProxyPassReverse  /  http://jenkins.example.com/

Итак, что, вероятно, происходит в настоящее время, так это то, что вызов API не выполняется, потому что он получает http:// адрес в Location: заголовок перенаправления (который пропущен для непереведения в ProxyPassReverse потому что это не http).

Он отправляет запрос в это место и получает еще один ответ перенаправления от вашего <VirtualHost *:80>, Их проверка достоверности знает, что это не так и ошибки, в то время как curl следует за еще одним перенаправлением и получает действительный ответ.

Добавить ProxyPassReverse за http:// выше и это должно исправить проблему, если я прав.

Если вы используете Apache в качестве обратного прокси-сервера, он должен быть как минимум 2.2.18 и установить опцию AllowEncodedSlashes NoDecode (более ранние версии имеют только значения On и Off, оба из которых неверны); так же как nocanon в ProxyPass директивы.

Оба должны быть установлены в VirtualHost, поскольку AllowEncodedSlashes не наследуется.

<VirtualHost *:80>
        AllowEncodedSlashes NoDecode
        ServerName build.example.org
        ProxyPass         /  http://localhost:8080/ nocanon
        ProxyPassReverse  /  http://localhost:8080/
        ProxyRequests     Off
</VirtualHost>

Через https://stackoverflow.com/a/33179008/923560:

Убедитесь, что URL-адрес Jenkins, настроенный в конфигурации системы, совпадает с URL-адресом, который вы используете для доступа к Jenkins.

Чтобы перейти к настройке системы:

  1. Перейти на страницу Дженкинс
  2. Нажмите Управление Дженкинс
  3. Нажмите Настроить систему
  4. Выделите Дженкинс Местоположение и найдите URL Дженкинса.

Убедитесь, что значение порта совпадает со значением порта, установленным в <arguments> раздел файла jenkins.xml, расположенный в папке Jenkins на вашем компьютере.

Другие вопросы по тегам