Исправьте конфигурацию обратного прокси-сервера Apache с SSL для Jenkins и Sonar
Я использую две службы на сервере 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.
Я уже проверил следующие два связанных вопроса:
3 ответа
 На этой странице вики Jenkins упоминается, что по состоянию на июль 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 для Jenkins
Основными отличиями здесь являются:
- Как настроить временный сертификат
- остановка apache winging по поводу отсутствия ssl-кэша
Моя настройка:
- Установить было в 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: - Перейдите в каталог 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
 
- Скопируйте файлы.* Сервера из d:\OpenSSL-Win64\bin в D:\Apache24\conf 
- Отредактируйте d:\Apache24\conf\httpd.conf: - Найдите и замените "c: /" на "d: /" 
- Измените после строки "Listen 80", добавив "Listen 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 - скрыть параметры.
Я создал контейнер Docker для запуска Apache2 в качестве обратного прокси-сервера для Sonarqube на том же хосте.
Следуйте исходному коду.https://github.com/clebermasters/sonarqube-https-apache2