So konfigurieren Sie Nginx mit SSL als Reverse Proxy für Jenkins

Einführung

Standardmäßig wird Jenkins mit einem eigenen integrierten Webserver ausgeliefert, der Port 8080 überwacht. Dies ist praktisch, wenn Sie eine private Jenkins-Instanz ausführen oder wenn Sie nur schnell etwas einrichten und sich nicht um die Sicherheit kümmern müssen. Sobald Sie jedoch echte Produktionsdaten auf Ihrem Host haben, empfiehlt es sich, einen sichereren Webserver wie Nginx zu verwenden.

In diesem Beitrag erfahren Sie, wie Sie Ihre Site mit SSL unter Verwendung des Nginx-Webservers als Reverse-Proxy für Ihre Jenkins-Instanz verpacken. * Dieses Tutorial setzt voraus, dass Sie mit Linux-Befehlen, einer funktionierenden Jenkins-Installation und einer Ubuntu 14.04-Installation vertraut sind. *

Sie können Jenkins später in diesem Lernprogramm installieren, wenn Sie es noch nicht installiert haben.

Erster Schritt - Konfigurieren Sie Nginx

Nginx hat sich in den letzten Jahren aufgrund seiner Geschwindigkeit und Flexibilität zu einem bevorzugten Webserver entwickelt. Diesen Webserver werden wir also einsetzen.

Die Befehle in diesem Abschnitt setzen voraus, dass Sie einen Benutzer mit https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-an-ubuntu-14-04- eingerichtet haben. vps [sudo access].

Installieren Sie Nginx

Aktualisieren Sie Ihre Paketlisten und installieren Sie Nginx:

sudo apt-get update
sudo apt-get install nginx

Dies ist nicht entscheidend, aber Sie können die Version von Nginx überprüfen, falls Sie später Probleme beheben müssen. Neuere Versionen von Nginx bieten noch einige weitere Funktionen.

nginx -v

Ein Zertifikat bekommen

Als Nächstes müssen Sie ein SSL-Zertifikat erwerben oder erstellen. Diese Befehle gelten für ein selbstsigniertes Zertifikat. Sie sollten jedoch eine offizielle https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs [ signiertes Zertifikat], wenn Sie Browser-Warnungen vermeiden möchten.

Wechseln Sie in das richtige Verzeichnis und generieren Sie ein Zertifikat:

cd /etc/nginx
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

Sie werden aufgefordert, einige Informationen zum Zertifikat einzugeben. Sie können dies ausfüllen, wie Sie möchten. Beachten Sie jedoch, dass die Informationen in den Zertifikateigenschaften angezeigt werden. Wir haben die Anzahl der Bits auf 2048 festgelegt, da dies das Minimum ist, das zum Signieren durch eine Zertifizierungsstelle erforderlich ist. Wenn Sie das Zertifikat signieren lassen möchten, müssen Sie eine CSR erstellen.

Bearbeiten Sie die Konfiguration

Als nächstes müssen Sie die Standard-Nginx-Konfigurationsdatei bearbeiten.

sudo nano /etc/nginx/sites-enabled/default

Hier ist, wie die endgültige Konfiguration aussehen könnte; die abschnitte sind unten aufgeschlüsselt und werden kurz erklärt. Sie können die vorhandene Konfigurationsdatei aktualisieren oder ersetzen, obwohl Sie möglicherweise zuerst eine Schnellkopie erstellen möchten.

server {
   listen 80;
   return 301 https://$host$request_uri;
}

server {

   listen 443;
   server_name ;

   ssl_certificate           /etc/nginx/cert.crt;
   ssl_certificate_key       /etc/nginx/cert.key;

   ssl on;
   ssl_session_cache  builtin:1000  shared:SSL:10m;
   ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
   ssl_prefer_server_ciphers on;

   access_log            /var/log/nginx/jenkins.access.log;

   location / {

     proxy_set_header        Host $host;
     proxy_set_header        X-Real-IP $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header        X-Forwarded-Proto $scheme;

     # Fix the “It appears that your reverse proxy set up is broken" error.
     proxy_pass          http://localhost:8080;
     proxy_read_timeout  90;

     proxy_redirect      http://localhost:8080 https://;
   }
 }

In unserer Konfiguration geben die Einstellungen und den Speicherort an, an dem wir unser SSL-Zertifikat erstellt haben. Sie müssen die Zeilen und "proxyredirect" mit Ihrem eigenen Domainnamen aktualisieren. Es gibt auch eine zusätzliche Nginx-Magie, die anweist, dass Anforderungen von Nginx gelesen und auf der Antwortseite neu geschrieben werden müssen, um sicherzustellen, dass der Reverse-Proxy funktioniert.

Im ersten Abschnitt wird der Nginx-Server angewiesen, alle an Port 80 eingehenden Anforderungen (Standard-HTTP) abzuhören und an HTTPS umzuleiten.

...
server {
  listen 80;
  return 301 https://$host$request_uri;
}
...

Als nächstes haben wir die SSL-Einstellungen. Dies ist ein guter Satz von Standardeinstellungen, der jedoch definitiv erweitert werden kann. Weitere Erklärungen finden Sie unter this tutorial.

...
 listen 443;
 server_name ;

 ssl_certificate           /etc/nginx/cert.crt;
 ssl_certificate_key       /etc/nginx/cert.key;

 ssl on;
 ssl_session_cache  builtin:1000  shared:SSL:10m;
 ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
 ssl_prefer_server_ciphers on;
 ...

Der letzte Abschnitt ist der Ort, an dem das Proxying stattfindet. Eingehende Anforderungen werden grundsätzlich entgegengenommen und an die Jenkins-Instanz weitergeleitet, die an Port 8080 auf der lokalen Netzwerkschnittstelle gebunden ist bzw. diese überwacht. Dies ist eine etwas andere Situation, aber this tutorial hat einige gute Informationen zu den Nginx-Proxy-Einstellungen.

...
location / {

   proxy_set_header        Host $host;
   proxy_set_header        X-Real-IP $remote_addr;
   proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header        X-Forwarded-Proto $scheme;

   # Fix the “It appears that your reverse proxy set up is broken" error.
   proxy_pass          http://localhost:8080;
   proxy_read_timeout  90;

   proxy_redirect      http://localhost:8080 https://;
}
...

Hier ein paar kurze Hinweise. Wenn Sie keinen Domain-Namen haben, der auf Ihren Jenkins-Server aufgelöst wird, funktioniert die obige Anweisung ohne Änderung nicht ordnungsgemäß. Denken Sie daran. Wenn Sie die falsch konfigurieren (z. B. durch Hinzufügen eines abschließenden Schrägstrichs), wird auf Ihrer Jenkins-Konfigurationsseite Folgendes angezeigt.

image: https: //assets.digitalocean.com/articles/nginx_jenkins/1.jpg [Jenkins-Fehler: Reverse-Proxy-Einrichtung ist fehlerhaft]

Wenn Sie diesen Fehler sehen, überprüfen Sie Ihre Einstellungen und in der Nginx-Konfiguration!

Schritt Zwei - Konfigurieren Sie Jenkins

Wie bereits erwähnt, wird in diesem Lernprogramm davon ausgegangen, dass Jenkins bereits installiert ist. This tutorial zeigt Ihnen, wie Sie Jenkins bei Bedarf installieren. Möglicherweise müssen Sie für diesen Artikel zum Root-Benutzer wechseln.

Damit Jenkins mit Nginx zusammenarbeitet, müssen wir die Jenkins-Konfiguration so aktualisieren, dass nur die localhost-Schnittstelle (0.0.0.0) abgehört wird, um sicherzustellen, dass der Datenverkehr ordnungsgemäß verarbeitet wird. Dies ist ein wichtiger Schritt, denn wenn Jenkins immer noch alle Schnittstellen überwacht, ist der Zugriff möglicherweise immer noch über den ursprünglichen Port (8080) möglich. Wir werden die Konfigurationsdatei ändern, um diese Anpassungen vorzunehmen.

sudo nano /etc/default/jenkins

Suchen Sie die Zeile "+ JENKINS \ ARGS" und aktualisieren Sie sie folgendermaßen:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=127.0.0.1 --httpPort=$HTTP_PORT -ajp13Port=$AJP_PORT"

Beachten Sie, dass die Einstellung * –httpListenAddress = 127.0.0.1 * hinzugefügt oder geändert werden muss.

Dann fahren Sie fort und starten Sie Jenkins und Nginx neu.

sudo service jenkins restart
sudo service nginx restart

Sie sollten jetzt in der Lage sein, Ihre Domain über HTTP oder HTTPS zu besuchen, und die Jenkins-Site wird sicher bedient. Wenn Sie ein selbstsigniertes Zertifikat verwendet haben, wird eine Zertifikatwarnung angezeigt.

Optional - Aktualisieren Sie die OAuth-URLs

Wenn Sie den GitHub oder ein anderes OAuth-Plugin zur Authentifizierung verwenden, ist es wahrscheinlich an dieser Stelle fehlerhaft. Wenn Sie beispielsweise versuchen, die URL aufzurufen, wird die Meldung "Seite konnte nicht geöffnet werden" mit einer URL angezeigt, die der folgenden ähnelt:

http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string

Um dies zu beheben, müssen Sie einige Einstellungen aktualisieren, einschließlich der Einstellungen Ihres OAuth-Plugins. Aktualisieren Sie zuerst die Jenkins-URL (in der Jenkins-GUI). es kann hier gefunden werden:

  • Jenkins → Jenkins verwalten → System konfigurieren → Jenkins-Speicherort *

Aktualisieren Sie die Jenkins-URL, um HTTPS zu verwenden - + https: // +

Aktualisieren Sie anschließend Ihre OAuth-Einstellungen beim externen Anbieter. Dieses Beispiel ist für GitHub. Auf GitHub finden Sie dies unter * Einstellungen → Anwendungen → Entwickleranwendungen * auf der GitHub-Site.

Es sollte einen Eintrag für Jenkins geben. Aktualisieren Sie die URL * Homepage * und * Authorization Callback URL *, um die HTTPS-Einstellungen widerzuspiegeln. Es könnte ungefähr so ​​aussehen:

Bild: https://assets.digitalocean.com/articles/nginx_jenkins/3.jpg [Jenkins-Einstellungen auf GitHub; https: // wurde mit beiden URLs verwendet]

Fazit

Sie müssen nur noch überprüfen, ob alles ordnungsgemäß funktioniert hat. Wie oben erwähnt, sollten Sie nun in der Lage sein, über HTTP oder HTTPS zu Ihrer neu konfigurierten URL zu navigieren. Sie sollten auf die sichere Site umgeleitet werden und einige Site-Informationen sehen, einschließlich Ihrer neu aktualisierten SSL-Einstellungen. Wie bereits erwähnt, funktioniert Ihre Umleitung möglicherweise nicht wie gewünscht, wenn Sie keine Hostnamen über DNS verwenden. In diesem Fall müssen Sie den Abschnitt in der Nginx-Konfigurationsdatei ändern.

Möglicherweise möchten Sie auch Ihren Browser verwenden, um Ihr Zertifikat zu überprüfen. Sie sollten in der Lage sein, auf das Schloss zu klicken, um die Zertifikateigenschaften in Ihrem Browser anzuzeigen.