So konfigurieren Sie Jenkins mit SSL mit einem Nginx-Reverse-Proxy unter Ubuntu 18.04

Einführung

Standardmäßig verfügtJenkins über einen eigenen integrierten Winstone-Webserver, der Port8080 überwacht, was für den Einstieg praktisch ist. Es ist jedoch auch eine gute Idee, Jenkins mit SSL zu sichern, um Kennwörter und vertrauliche Daten zu schützen, die über die Weboberfläche übertragen werden.

In diesem Lernprogramm konfigurieren Sie Nginx als Reverse-Proxy, um Client-Anforderungen an Jenkins weiterzuleiten.

Voraussetzungen

Zu Beginn benötigen Sie Folgendes:

[[Schritt-1 - Konfigurieren von Nginx]] == Schritt 1 - Konfigurieren von Nginx

Im vorausgesetzten TutorialHow to Secure Nginx with Let’s Encrypt on Ubuntu 18.04 haben Sie Nginx so konfiguriert, dass SSL in der Datei/etc/nginx/sites-available/example.com verwendet wird. Öffnen Sie diese Datei, um Ihre Reverse-Proxy-Einstellungen hinzuzufügen:

sudo nano /etc/nginx/sites-available/example.com

Fügen Sie im Blockserver mit den SSL-Konfigurationseinstellungen Jenkins-spezifische Zugriffs- und Fehlerprotokolle hinzu:

/etc/nginx/sites-available/example.com

. . .
server {
        . . .
        # SSL Configuration
        #
        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        access_log            /var/log/nginx/jenkins.access.log;
        error_log             /var/log/nginx/jenkins.error.log;
        . . .
        }

Als nächstes konfigurieren wir die Proxy-Einstellungen. Da wir alle Anfragen an Jenkins senden, werden wir die Standardzeiletry_filesauskommentieren, die andernfalls einen 404-Fehler zurückgeben würde, bevor die Anfrage Jenkins erreicht:

/etc/nginx/sites-available/example.com

. . .
           location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;        }
. . .

Fügen wir nun die Proxy-Einstellungen hinzu, darunter:

  • proxy_params: Die Datei/etc/nginx/proxy_params wird von Nginx bereitgestellt und stellt sicher, dass wichtige Informationen, einschließlich des Hostnamens, des Protokolls der Clientanforderung und der Client-IP-Adresse, beibehalten werden und in den Protokolldateien verfügbar sind.

  • proxy_pass: Hiermit werden das Protokoll und die Adresse des Proxyservers festgelegt. In diesem Fall handelt es sich um den Jenkins-Server, auf den überlocalhost an Port8080 zugegriffen wird.

  • proxy_read_timeout: Dies ermöglicht eine Erhöhung von Nginx '60-Sekunden-Standard auf den von Jenkins empfohlenen 90-Sekunden-Wert.

  • proxy_redirect: Dies stellt sicher, dassresponses are correctly rewritten den richtigen Hostnamen enthält.

Stellen Sie sicher, dass Sieexample.com in der folgenden Zeileproxy_redirect durch Ihren SSL-gesicherten Domainnamen ersetzen:

/etc/nginx/sites-available/example.com

Location /
. . .
           location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;
                include /etc/nginx/proxy_params;
                proxy_pass          http://localhost:8080;
                proxy_read_timeout  90s;
                # Fix potential "It appears that your reverse proxy setup is broken" error.
                proxy_redirect      http://localhost:8080 https://example.com;

Wenn Sie diese Änderungen vorgenommen haben, speichern Sie die Datei und beenden Sie den Editor. Wir werden Nginx erst nach der Konfiguration von Jenkins neu starten, aber wir können unsere Konfiguration jetzt testen:

sudo nginx -t

Wenn alles in Ordnung ist, gibt der Befehl Folgendes zurück:

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Wenn nicht, beheben Sie alle gemeldeten Fehler, bis der Test bestanden ist.

[.Hinweis]##

Note:
Wenn Sieproxy_pass falsch konfigurieren (z. B. durch Hinzufügen eines abschließenden Schrägstrichs), erhalten Sie auf Ihrer JenkinsConfiguration-Seite etwas Ähnliches wie das Folgende.

Jenkins error: Reverse proxy set up is broken

Wenn dieser Fehler auftritt, überprüfen Sie Ihre Einstellungen fürproxy_pass undproxy_redirect in der Nginx-Konfiguration.

[[Schritt-2 - Konfigurieren von Jenkins]] == Schritt 2 - Konfigurieren von Jenkins

Damit Jenkins mit Nginx arbeiten kann, müssen Sie die Jenkins-Konfiguration aktualisieren, damit der Jenkins-Server nur dielocalhost-Schnittstelle und nicht alle Schnittstellen (0.0.0.0) überwacht. Wenn Jenkins alle Schnittstellen abhört, kann er möglicherweise über seinen ursprünglichen, unverschlüsselten Port (8080) darauf zugreifen.

Ändern Sie die Konfigurationsdatei von/etc/default/jenkins, um diese Anpassungen vorzunehmen:

sudo nano /etc/default/jenkins

Suchen Sie die ZeileJENKINS_ARGS und fügen Sie--httpListenAddress=127.0.0.1 zu den vorhandenen Argumenten hinzu:

/etc/default/jenkins

. . .
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"

Speichern und schließen Sie die Datei.

Starten Sie Jenkins neu, um die neuen Konfigurationseinstellungen zu verwenden:

sudo systemctl restart jenkins

Dasystemctl keine Ausgabe anzeigt, überprüfen Sie den Status:

sudo systemctl status jenkins

Sie sollten den Status vonactive (exited)in der ZeileActive sehen:

Output● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: active (exited) since Mon 2018-07-09 20:26:25 UTC; 11s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 29766 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
  Process: 29812 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)

Starten Sie Nginx neu:

sudo systemctl restart nginx

Überprüfen Sie den Status:

sudo systemctl status nginx
Output● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-07-09 20:27:23 UTC; 31s ago
     Docs: man:nginx(8)
  Process: 29951 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  Process: 29963 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 29952 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 29967 (nginx)

Wenn beide Server neu gestartet wurden, sollten Sie in der Lage sein, die Domäne über HTTP oder HTTPS zu besuchen. HTTP-Anfragen werden automatisch an HTTPS umgeleitet und die Jenkins-Site wird sicher bedient.

[[Schritt 3 - Testen der Konfiguration]] == Schritt 3 - Testen der Konfiguration

Nachdem Sie die Verschlüsselung aktiviert haben, können Sie die Konfiguration testen, indem Sie das Administratorkennwort zurücksetzen. Beginnen wir mit dem Besuch der Website über HTTP, um sicherzustellen, dass Sie Jenkins erreichen und zu HTTPS umgeleitet werden.

Geben Sie in Ihrem Webbrowserhttp://example.com ein und ersetzen Sieexample.com durch Ihre Domain. Nachdem SieENTER gedrückt haben, sollte die URL mithttps beginnen und die Positionsleiste sollte anzeigen, dass die Verbindung sicher ist.

Sie können den administrativen Benutzernamen, den Sie inHow To Install Jenkins on Ubuntu 18.04 erstellt haben, in das FeldUser und das Kennwort, das Sie im FeldPassword ausgewählt haben, eingeben.

Sobald Sie angemeldet sind, können Sie das Passwort ändern, um sicherzustellen, dass es sicher ist.

Klicken Sie auf Ihren Benutzernamen in der oberen rechten Ecke des Bildschirms. Wählen Sie auf der HauptprofilseiteConfigure aus der Liste auf der linken Seite aus:

Navigate to Jenkins password page

Sie gelangen auf eine neue Seite, auf der Sie ein neues Passwort eingeben und bestätigen können:

Jenkins create password page

Bestätigen Sie das neue Passwort, indem Sie aufSave klicken. Sie können das Jenkins-Webinterface jetzt sicher verwenden.

Fazit

In diesem Lernprogramm haben Sie Nginx als Reverse-Proxy für den integrierten Jenkins-Webserver konfiguriert, um Ihre Anmeldeinformationen und andere über die Weboberfläche übertragenen Informationen zu schützen. Jetzt, da Jenkins sicher ist, können Siehow to set up a continuous integration pipeline lernen, um Codeänderungen automatisch zu testen. Andere Ressourcen, die Sie berücksichtigen sollten, wenn Sie Jenkins noch nicht kennen, sindthe Jenkins project’s “Creating your first Pipeline” Tutorial oderthe library of community-contributed plugins.