fragen stichworte

Jenkins meldet ein falsches Proxy-Setup mit Apache, das virtuelle Hosts mit SNI verwendet

Ich richte einen Jenkins-Server ein, der unter Tomcat hinter Apache läuft. Ich verwende virtuelle Hosts mit SSL mit SNI, so dass ich unter https://jenkins.example.com darauf zugreifen und etwas anderes auf http://www.example liefern kann .com.

Ich habe es fertiggestellt, aber wenn ich auf "Jenkins verwalten" klicke, wird darauf hingewiesen, dass Ihr Reverse-Proxy-Setup fehlerhaft ist.

Beachten Sie, dass ich ein selbstsigniertes SSL-Zertifikat verwende und jenkins.example.com nicht die virtuellen Standardhosts ist.

Die entsprechende Apache-Konfiguration sieht folgendermaßen aus:

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

Wenn ich dies tue:

curl --user "username:password" --digest -k https://jenkins.example.com/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/test -L

Dann sehe ich die Ausgabe:

<div/>

Wenn ich wget mit debug starte, sehe ich an diesem Punkt, dass wget irgendwann einen Zeiger auf http anstelle von https abruft. Ich weiß nicht, warum das so ist oder ob es zusammenhing, aber es leitet richtig um:

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

Ich arbeite unter Ubuntu 11.04, Apache 2.2.17, Tomcat 6.0.28, Jenkins 1.448.

antworten

Das einzige Problem, das ich mit Ihrer Konfiguration sehe, ist folgendes:

ProxyPassReverse / https://jenkins.example.com

Sollte sein:

ProxyPassReverse / https://jenkins.example.com/

Anscheinend sendet der Dienst http:// anstelle von https:// Standortheatern (wahrscheinlich, weil Ihre Verbindung zu seinem Listener von Apache auf dem localhost-Listener unverschlüsselt ist). In diesem Fall müssen Sie Folgendes hinzufügen:

ProxyPassReverse / http://jenkins.example.com/

Wahrscheinlich ist derzeit der API-Aufruf fehlgeschlagen, weil im Location: -Header der Weiterleitung eine http:// -Adresse abgerufen wird (die in ProxyPassReverse für die Übersetzung nicht vorhanden ist, da sie nicht http ist >).

Er sendet die Anfrage an diesen Ort und erhält eine weitere Weiterleitungsantwort von Ihrem <VirtualHost *:80>. Ihr Gültigkeitsprüfer weiß, dass dies nicht richtig ist und Fehler, während curl einer weiteren Weiterleitung folgt und eine gültige Antwort erhält.

Fügen Sie oben http:// das ProxyPassReverse hinzu und dies sollte das Problem beheben, wenn ich Recht habe.

Wenn Sie Apache als Reverse Proxy verwenden, muss er mindestens 2.2.18 sein und die Option AllowEncodedSlashes NoDecode setzen (frühere Versionen haben nur die Werte On und Off, beide sind falsch); sowie nocanon in der ProxyPass -Richtlinie.

Beide müssen innerhalb des VirtualHost gesetzt werden, da AllowEncodedSlashes nicht vererbt wird.

<VirtualHost *:80>
        AllowEncodedSlashes NoDecode
        ServerName build.example.org
        ProxyPass/http://localhost:8080/nocanon
        ProxyPassReverse/http://localhost:8080/ProxyRequests     Off
</VirtualHost>

über https://stackoverflow.com/a/33179008/923560:

Stellen Sie sicher, dass die in der Systemkonfiguration konfigurierte Jenkins-URL mit der URL übereinstimmt, die Sie für den Zugriff auf Jenkins verwenden.

So erreichen Sie die Systemkonfiguration:

  1. Gehen Sie zu Ihrer Jenkins-Seite
  2. Klicken Sie auf Jenkins verwalten
  3. Klicken Sie auf Configure System (System konfigurieren)
  4. Blättern Sie zu Jenkins Location und suchen Sie nach Jenkins URL.

Stellen Sie sicher, dass der Portwert mit dem Portwert übereinstimmt, der im Abschnitt <arguments> der Datei jenkins.xml im Ordner Jenkins auf Ihrem Computer festgelegt ist.