Korrigieren Sie die Apache Reverse Proxy-Konfiguration mit SSL für Jenkins und Sonar

11

Ich verwende zwei Dienste hinter einem Apache-Server: Jenkins (Port 8080) und SonarQube (Port 9000).

Meine Apache-Konfiguration sieht folgendermaßen aus:

<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>

Alles scheint gut zu funktionieren, außer dass Jenkins sich mit dieser Meldung beschwert: Es scheint, dass Ihre Reverse-Proxy-Einrichtung defekt ist.

Wenn ich den von Jenkins bereitgestellten ReverseProxySetupMonitor- Test ausführe , zeigt die Fehlermeldung an, dass etwas mit dem Reverse-Proxy nicht korrekt eingerichtet ist, da http nicht durch https ersetzt wird:

$ 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
[...]

Dies wurde erst angezeigt, nachdem ich SSL auf dem Server aktiviert hatte (der jetzt ein selbstsigniertes Zertifikat verwendet).

Frage: Wie behebe ich das Reverse-Proxy-Setup, damit Jenkins zufrieden ist? Bonuspunkte für Tipps zur Verbesserung der Apache-Konfigurationsdatei.

Ich habe bereits die folgenden zwei verwandten Fragen geprüft:

friederbluemle
quelle

Antworten:

9

Diese Seite im Wiki Jenkins erwähnte, dass ab Juli 2014 die empfohlene Konfiguration für Jenkins Reverse Proxy. Der fehlende Parameter ist RequestHeader set X-Forwarded-Proto "https"undRequestHeader set X-Forwarded-Port "443"

So wurde die Konfiguration

<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>
masegaloeh
quelle
2
Super, das hat perfekt funktioniert! Ich musste es auch tun sudo a2enmod headers, sonst würde ichInvalid command 'RequestHeader'
friederbluemle
Können Sie erklären, warum Sie zwei ProxyPassReverseAnweisungen für denselben Pfad verwenden ( /)?
Ortomala Lokni
1

Windows Apache Front-End-Setup für Jenkins

Die Hauptunterschiede hier sind:

  • So richten Sie ein temporäres Zertifikat ein
  • Stoppen Sie Apache Winging, weil Sie keinen SSL-Cache haben

Mein Setup:

  • Die Installation war auf d: \ (nicht auf c: \ - passen Sie dies an Ihre Bedürfnisse an)

  • Jenkins ist auf Port 8080

  • Entpacken Sie Apache httpd-2.4.18-win64-VC14.zip (von http://www.apachelounge.com/download/ ) nach d: \.

  • Installieren Sie OpenSSL Win64OpenSSL_Light-1_0_2f.exe ( http://slproweb.com/products/Win32OpenSSL.html ) unter d: \ OpenSSL-Win64

  • Erstellen Sie das SSL-Zertifikat:

    • CD in das OpenSSL bin-Verzeichnis und führen Sie die Magie aus:

       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
      
  • Kopieren Sie die Server. * -Dateien von d: \ OpenSSL-Win64 \ bin nach D: \ Apache24 \ conf

  • Bearbeiten Sie d: \ Apache24 \ conf \ httpd.conf:

    • Suchen und ersetzen Sie "c: /" durch "d: /"

    • Ändern Sie nach der Zeile "Listen 80" und fügen Sie "Listen 443" hinzu:

      Listen 80
      Listen 443
      
    • Kommentieren Sie diese Zeilen aus:

      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
      
    • Aktualisieren Sie "#ServerName www.example.com:80" auf:

      ServerName myserver.mydomain:80
      
    • Fügen Sie dies am Ende hinzu:

      <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>
      

Ich habe Jenkins nicht daran gehindert, Port 8080 abzuhören, sodass ich immer noch eine Verbindung herstellen kann, wenn Apache fehlschlägt. Mein Ziel bei der Verwendung von https ist es, Parameter auszublenden.

David Robson
quelle