如何配置Nginx作为Jenkins的反向代理并启用SSL

介绍

默认情况下,Jenkins 自带内置的 Web 服务器,监听端口为 8080。如果您运行一个私有的 Jenkins 实例,或者只是需要快速启动一些东西而不关心安全性,这很方便。但是,一旦您的主机开始接收真实的生产数据,使用更安全的 Web 服务器(如 Nginx)来处理流量是个不错的选择。

本文将详细介绍如何使用 Nginx Web 服务器作为 Jenkins 实例的反向代理,为您的网站添加 SSL 包装。本教程假设您对 Linux 命令有一定了解,已经安装了 Jenkins,并且使用了 Ubuntu 20.04。

如果您尚未安装 Jenkins,您可以在本教程中安装。

先决条件

此指南假定您正在使用Ubuntu 20.04。在开始之前,您应该在系统上设置一个非root用户帐户,并具有sudo权限。您可以通过按照Ubuntu 20.04 初始服务器设置教程学习如何执行此操作。您还需要安装并托管您的域名的Nginx服务器。您可以通过在Ubuntu 20.04上安装Nginx教程学习如何执行此操作。

另外,通过SSL对Jenkins实例进行安全设置非常重要。如果它在互联网上可见,您可以使用Let’s Encrypt来确保其安全。您可以通过如何在Ubuntu 22.04上使用Let’s Encrypt安全Nginx教程学习如何执行此操作。
如前所述,本教程假定Jenkins已经安装。如果需要,此教程将向您展示如何安装Jenkins。您可能需要切换到root用户来完成这篇文章。

第一步 — 配置Nginx

近年来,Nginx因其速度和灵活性而成为了首选的Web服务器,这使其成为我们应用程序的理想选择。

编辑配置

接下来,您需要编辑默认的 Nginx 配置文件。以下示例使用 nano

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

以下是最终配置的样子;下面简要解释了各个部分。您可以更新或替换现有的配置文件,但您可能希望先备份一份。

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

server {

    listen 443;
    server_name jenkins.domain.com;

    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;

      proxy_pass          http://localhost:8080;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
    }
    
    ...
}

您需要使用您自己的域名更新或替换 server_nameproxy_redirect 行。此外,还有一些额外的 Nginx 魔法,告诉请求在 Nginx 上被读取并在响应端被重写,以确保反向代理正常工作。

保存并关闭文件。如果您使用的是 nano,您可以按 Ctrl + X,然后按 Y,最后按 Enter

第一部分告诉 Nginx 服务器监听任何进入端口 80(默认 HTTP)的请求,并将它们重定向到 HTTPS。

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

之后,进行代理。它基本上接受任何传入请求,并将它们代理到本地网络接口上绑定/监听端口 8080 的 Jenkins 实例。

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

    proxy_pass          http://localhost:8080;
    proxy_read_timeout  90;

    proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
}
...

注意:如果您想了解更多关于在 Nginx 中进行代理的信息,这个教程有一些关于 Nginx 代理设置的好信息。

A few quick things to point out here. If you don’t have a domain name that resolves to your Jenkins server, then the proxy_redirect statement above won’t function correctly without modification, so keep that in mind. Also, if you misconfigure the proxy_pass (by adding a trailing slash for example), you will get something similar to the following in your Jenkins Configuration page.

所以,如果你看到这个错误,请仔细检查你在Nginx配置中的proxy_passproxy_redirect设置!

步骤2 — 配置Jenkins

为了让Jenkins与Nginx配合工作,我们需要更新Jenkins配置,只监听localhost地址而不是所有地址(0.0.0.0),以确保流量能够正确处理。这是一个重要的安全步骤,因为如果Jenkins仍然监听所有地址,那么它仍然有可能通过其原始端口(8080)进行访问。我们将修改/etc/default/jenkins配置文件来进行这些调整。

  1. sudo nano /etc/default/jenkins

找到JENKINS\_ARGS行,并将其更新如下:

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

注意–httpListenAddress=127.0.0.1设置必须被添加或修改。

然后继续重新启动Jenkins和Nginx。

  1. sudo service jenkins restart
  2. sudo service nginx restart

现在你应该能够使用HTTPS访问你的域名,并且Jenkins网站将会安全地提供服务。

可选 — 更新OAuth URL

如果您正在使用 GitHub 或其他 OAuth 插件进行身份验证,那么此时它可能已经无法正常工作。例如,当尝试访问URL时,您将收到“无法打开页面”消息,并且URL类似于http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string

要解决此问题,您需要更新 Jenkins 中的一些设置,包括 OAuth 插件设置。首先,在 Jenkins GUI 中更新 Jenkins URL;可以在Jenkins -> 管理 Jenkins -> 配置系统 -> Jenkins 位置菜单中找到。

将 Jenkins URL 更新为使用 HTTPS – https://jenkins.domain.com/

接下来,更新外部提供者的 OAuth 设置。此示例是针对 GitHub 的。在 GitHub 上,可以在设置 -> 应用程序 -> 开发人员应用程序中找到。

应该有一个关于 Jenkins 的条目。更新主页 URL授权回调 URL以反映 HTTPS 设置。可能看起来类似于以下内容:

结论

唯一剩下的事情就是验证一切是否正确。如上所述,您现在应该能够通过 HTTP 或 HTTPS 浏览到您新配置的 URL – jenkins.domain.com。您应该会被重定向到安全站点,并且应该看到一些站点信息,包括您新更新的 SSL 设置。如前所述,如果您没有通过 DNS 使用主机名,则您的重定向可能无法按预期工作。在这种情况下,您需要修改 Nginx 配置文件中的 proxy_pass 部分。

Source:
https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-with-ssl-as-a-reverse-proxy-for-jenkins