Назад | Перейти на главную страницу

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.

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

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. Щелкните Управление Jenkins.
  3. Нажмите Настроить систему.
  4. Прокрутите до Местоположение Дженкинса и найдите URL-адрес Jenkins.

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