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.
Чтобы перейти к настройке системы:
- Перейти на страницу Дженкинс
- Нажмите Управление Дженкинс
- Нажмите Настроить систему
- Выделите Дженкинс Местоположение и найдите URL Дженкинса.
Убедитесь, что значение порта совпадает со значением порта, установленным в <arguments>
раздел файла jenkins.xml, расположенный в папке Jenkins на вашем компьютере.