Я использую две службы за сервером Apache: Jenkins (порт 8080) и SonarQube (порт 9000).
Моя конфигурация apache выглядит так:
<VirtualHost *:80>
ServerName server
Redirect permanent / https://server.domain.com/
</VirtualHost>
<VirtualHost *:80>
ServerName server.domain.com
Redirect permanent / https://server.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName server.domain.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
ProxyPass /jenkins http://localhost:8080/jenkins nocanon
ProxyPassReverse /jenkins http://localhost:8080/jenkins
ProxyPassReverse /jenkins http://server.domain.com/jenkins
ProxyPassReverse /jenkins https://server.domain.com/jenkins
ProxyPass /sonar http://localhost:9000/sonar nocanon
ProxyPassReverse /sonar http://localhost:9000/sonar
AllowEncodedSlashes NoDecode
ProxyRequests Off
ProxyPreserveHost On
<Proxy http://localhost:8080/*>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
Кажется, все работает нормально, за исключением того, что Дженкинс жалуется на это сообщение: Похоже, что ваш обратный прокси-сервер не работает.
Когда я запускаю ReverseProxySetupMonitor тест, предоставленный Jenkins, сообщение об ошибке указывает, что что-то с обратным прокси-сервером настроено неправильно, так как не заменяет http на https:
$ curl -iLk -e https://server.domain.com/jenkins/manage https://server.domain.com/jenkins/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/test
[...]
404 http://server.domain.com/jenkins/manage vs. https://server.domain.com/jenkins/manage
[...]
Это только появилось после Я включил SSL на сервере (который теперь использует самозаверяющий сертификат).
Вопрос: Как мне исправить настройку обратного прокси, чтобы Дженкинс был счастлив? Бонусные баллы за советы по улучшению файла конфигурации apache.
Я уже проверил следующие два связанных вопроса:
Эта страница в вики Дженкинс упомянул, что как за июль 2014 г., рекомендуемая конфигурация для обратного прокси Jenkins. Отсутствующий параметр RequestHeader set X-Forwarded-Proto "https"
и RequestHeader set X-Forwarded-Port "443"
Так конфигурация стала
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/cert.pem
ServerAdmin webmaster@localhost
ProxyRequests Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:8080/ nocanon
ProxyPassReverse / http://localhost:8080/
ProxyPassReverse / http://www.example.com/
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
</VirtualHost>
Настройка Windows Apache Front-end для Jenkins
Вот основные отличия:
Моя установка:
Установка была в d: \ (не c: \ - адаптируйте это под свои нужды)
Дженкинс находится на порту 8080
Разархивируйте Apache httpd-2.4.18-win64-VC14.zip (из http://www.apachelounge.com/download/) в d: \.
Установите OpenSSL Win64OpenSSL_Light-1_0_2f.exe (http://slproweb.com/products/Win32OpenSSL.html) в d: \ OpenSSL-Win64
Создайте сертификат ssl:
cd в каталог bin OpenSSL и запустите волшебство:
pushd d:\OpenSSL-Win64\bin
set OPENSSL_CONF=openssl.cfg
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
Скопируйте файлы server. * Из d: \ OpenSSL-Win64 \ bin в D: \ Apache24 \ conf
Отредактируйте d: \ Apache24 \ conf \ httpd.conf:
Найдите и замените "c: /" на "d: /"
Поменяйте после строки «Слушайте 80», добавив «Слушать 443»:
Listen 80
Listen 443
Раскомментируйте эти строки:
LoadModule headers_module modules/mod_headers.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
Обновите "#ServerName www.example.com:80" следующим образом:
ServerName myserver.mydomain:80
Добавьте это в конце:
<IfModule socache_shmcb_module>
SSLSessionCache "shmcb:logs/ssl_scache(512000)"
</IfModule>
<VirtualHost *:80>
ServerName myserver
Redirect permanent / https://myserver.mydomain/
</VirtualHost>
<VirtualHost *:80>
ServerName myserver.mydomain
Redirect permanent / https://myserver.mydomain/
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile conf/server.crt
SSLCertificateKeyFile conf/server.key
ServerAdmin me@mydomain
ProxyRequests Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:8080/ nocanon
ProxyPassReverse / http://localhost:8080/
ProxyPassReverse / http://myserver.mydomain/
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
</VirtualHost>
Я не останавливал Jenkins для прослушивания порта 8080, поэтому я все еще могу подключиться, если apache не работает. Моя цель при использовании https - скрыть параметры.