介绍

默认情况下,Jenkins 带有自己的内置 Web 服务器,它侦听端口 8080。如果您运行私有 Jenkins 实例,或者您只需要快速启动某些东西而不关心安全性,这很方便。但是,一旦您将真实的生产数据发送到您的主机,最好使用更安全的 Web 服务器,例如 Nginx 来处理流量。

这篇文章将详细介绍如何使用 Nginx Web 服务器作为 Jenkins 实例的反向代理来使用 SSL 包装您的站点。 本教程假设您熟悉 Linux 命令、有效的 Jenkins 安装和 Ubuntu 20.04 安装。

如果您还没有安装 Jenkins,您可以在本教程后面安装它。

先决条件

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

此外,让您的 Jenkins 实例受 SSL 保护非常重要。如果在 Internet 上可见,您可以使用 Let's Encrypt 保护它。您可以通过 [如何在 Ubuntu 22.04 上使用 Let's Encrypt 保护 Nginx 教程](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s -encrypt-on-ubuntu-22-04)。如前所述,本教程假设 Jenkins 已经安装。 本教程将向您展示如何在必要时安装 Jenkins。您可能需要切换到该文章的 root 用户。

步骤 1 — 配置 Nginx

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

编辑配置

接下来,您将需要编辑默认的 Nginx 配置文件。以下示例使用“纳米”。

sudo nano etc/nginx/sites-enabled/default

这是最终配置的样子;下面对这些部分进行了细分和简要说明。您可以更新或替换现有的配置文件,但您可能需要先制作备份副本。

服务器{23
听 80;
返回 301 https://$host$request_uri;
}

服务器 {

听443;
server_name jenkins.domain.com;

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

地点 / {

proxy_set_header 主机 $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_name 和 proxy_redirect 行。还有一些额外的 Nginx 魔法正在发生,它告诉 Nginx 读取请求并在响应端重写以确保反向代理正常工作。

保存并关闭文件。如果你使用了 nano,你可以通过按 Ctrl + XY,然后按 Enter 来实现。

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

...
服务器 {
听 80;
返回 301 https://$host$request_uri;
}
...

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

...
地点 / {

proxy_set_header 主机 $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 代理的信息,[本教程](https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-as-a- front-end-proxy-for-apache)有一些关于 Nginx 代理设置的好信息。

这里需要指出一些快速的事情。如果您没有解析到您的 Jenkins 服务器的域名,那么上面的 proxy_redirect 语句如果不进行修改将无法正常运行,因此请记住这一点。此外,如果您错误配置了代理_pass(例如,通过添加尾部斜杠),您将在 Jenkins 配置页面中获得类似于以下内容的内容。

Jenkins错误:反向代理设置被破坏

因此,如果您看到此错误,请仔细检查 Nginx 配置中的 proxy_pass 和 proxy_redirect 设置!

第 2 步 - 配置 Jenkins

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

须藤纳米 /etc/default/jenkins

找到 JENKINS\_ARGS 行并将其更新为如下所示:

JENKINS_ARGSu003d"--webrootu003d/var/cache/jenkins/war --httpListenAddressu003d127.0.0.1 --httpPortu003d$HTTP_PORT -ajp13Portu003d$AJP_PORT"

请注意,必须添加或修改 –httpListenAddressu003d127.0.0.1 设置。

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

须藤服务詹金斯重启
sudo 服务 nginx 重启

您现在应该能够使用 HTTPS 访问您的域,并且 Jenkins 站点将得到安全服务。

可选 - 更新 OAuth URL

如果您使用 GitHub 或其他 OAuth 插件进行身份验证,此时它可能会被破坏。例如,当尝试访问该 URL 时,您将收到一个“无法打开页面”,其 URL 类似于 http://jenkins.domain.com:8080/securityRealm/finishLogin?codeu003drandom-string

要解决此问题,您需要更新 Jenkins 中的一些设置,包括您的 OAuth 插件设置。首先在 Jenkins GUI 中更新 Jenkins URL;它可以在 Jenkins -> Manage Jenkins -> Configure System -> Jenkins Location 菜单中找到。

更新 Jenkins URL 以使用 HTTPS - https://jenkins.domain.com/

Jenkins URL

接下来,使用外部提供商更新您的 OAuth 设置。此示例适用于 GitHub。在 GitHub 上,可以在 GitHub 站点上的 Settings -> Applications -> Developer applications 下找到它。

詹金斯应该有一个条目。更新 Homepage URLAuthorization callback URL 以反映 HTTPS 设置。它可能类似于以下内容:

GitHub上的Jenkins设置; https:// 已与两个 URL 一起使用

结论

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

Logo

开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品

更多推荐