如何使用 SSL 将 Nginx 配置为 Jenkins 的反向代理

介绍

默认情况下,Jenkins 提供自己的内置 Web 服务器,该服务器在端口 8080 上收听,如果您运行私人 Jenkins 实例,或者如果您只需要快速获取一些东西,而不关心安全性。

本文将详细介绍如何使用 Nginx 网页服务器作为 Jenkins 实例的反向代理程序使用 SSL 包装您的网站。 **本教程假定您熟悉 Linux 命令,运行 Jenkins 安装和 Ubuntu 20.04 安装。

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

前提条件

本指南假设您正在使用 Ubuntu 20.04 。 在开始之前,您应该有一个非root 用户账户,在您的系统上设置)来学习如何做到这一点 。 您还需要安装和托管 Nginx 服务器 。 您可以用 [如何在 Ubuntu 20.04 教程上安装 Nginx] (https://andsky.com/tech/tutorials/how-to-install-nginx-on-ubuntu-20-04) 来学习如何做到这一点 .

此外,你让Jenkins案得到SSL的保障是非常重要的 如果在互联网上可以看到, 你可以通过我们加密来保护它。 您可以在 Ubuntu 22.04 教程上学习如何用 [如何保护 Nginx (https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-22-04) 。 如前所述,这个教程假设詹金斯已经安装了. [此教程] (https://andsky.com/tech/tutorials/how-to-install-jenkins-on-ubuntu-20-04) 必要时将演示如何安装詹金斯. 您可能需要切换到 root 用户来撰写文章 .

步骤 1 - 配置 Nginx

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

编辑配置

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

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

以下是最终配置的样子;下面的部分被分解并简要解释,您可以更新或更换现有的 config 文件,但您可能需要先备份。

 1server {23
 2    listen 80;
 3    return 301 https://$host$request_uri;
 4}
 5
 6server {
 7
 8    listen 443;
 9    server_name jenkins.domain.com;
10
11    access_log            /var/log/nginx/jenkins.access.log;
12
13    location / {
14
15      proxy_set_header Host $host;
16      proxy_set_header X-Real-IP $remote_addr;
17      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
18      proxy_set_header X-Forwarded-Proto $scheme;
19
20      proxy_pass http://localhost:8080;
21      proxy_read_timeout 90;
22
23      proxy_redirect http://localhost:8080 https://jenkins.domain.com;
24    }
25
26    ...
27}

您需要用自己的域名更新 server_name 和 proxy_redirect 行. 还有一些额外的 Nginx 魔法正在进行中,该魔法告诉 Nginx 阅读请求,并在响应侧重写,以确保反向代理程序工作。

如果您使用了「nano」,您可以按一下「Ctrl + X」,「Y」,然後按一下「Enter」。

第一个部分告诉 Nginx 服务器听取任何在端口 80 (默认 HTTP) 上传来的请求,并将其重定向到 HTTPS。

1...
2server {
3   listen 80;
4   return 301 https://$host$request_uri;
5}
6...

接下来,代理会发生,它基本上会接收任何传入请求,并将其代理到局部网络接口上的端口 8080 上的 Jenkins 实例。

 1...
 2location / {
 3
 4    proxy_set_header Host $host;
 5    proxy_set_header X-Real-IP $remote_addr;
 6    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 7    proxy_set_header X-Forwarded-Proto $scheme;
 8
 9    proxy_pass http://localhost:8080;
10    proxy_read_timeout 90;
11
12    proxy_redirect http://localhost:8080 https://jenkins.domain.com;
13}
14...

<$>[注] 注: 如果你想了解更多关于代理在 Nginx, 这个教程有一些关于 Nginx代理设置的好信息。

如果你没有一个域名可以解决你的Jenkins服务器,那么上面的proxy_redirect声明不会正常工作没有修改,所以要记住这一点。

Jenkins error: Reverse proxy set up is broken

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

第2步:设置Jenkins

为了让 Jenkins 能够与 Nginx 合作,我们需要更新 Jenkins 配置,只听 localhost 地址,而不是全部 (0.0.0.0),以确保流量得到正确处理,这是一个重要的安全步骤,因为如果 Jenkins 仍然在听所有地址,那么它仍然可以通过其原始端口(8080)访问。

1sudo nano /etc/default/jenkins

查找JENKINS\_ARGS行,并更新它以如下方式:

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

请注意,设置 --httpListenAddress=127.0.0.1 必须添加或修改。

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

1sudo service jenkins restart
2sudo service nginx restart

您现在应该能够使用 HTTPS 访问您的域名,Jenkins 网站将被安全地服务。

可选 — 更新 OAuth URL

如果您正在使用 GitHub 或其他 OAuth 插件进行身份验证,那么此时可能会被破坏,例如,当您尝试访问 URL 时,您将收到一个类似于 http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string的 URL 类似的未打开页面

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

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

Jenkins URL

接下来,与外部提供商更新您的 OAuth 设置. 此示例适用于 GitHub. 在 GitHub 上,可以在 GitHub 网站上的 设置 -> 应用程序 -> 开发人员应用程序 下找到。

应该有 Jenkins 的条目更新 主页 URL 和** 授权回调 URL** 以反映 HTTPS 设置。

Jenkins settings on GitHub; https:// has been used with both URLs

结论

唯一要做的是确认一切工作都正确。 如上所述,您现在应该能够浏览您新配置的 URL - Jenkins.domain.com - 浏览HTTP 或 HTTPS 。 您应该重定向到安全站点, 并查看一些站点信息, 包括您新更新的 SSL 设置 。 如前所指出,如果您不通过 DNS 使用主机名,那么您的重定向可能无法正常工作 。 在这种情况下, 您需要修改 Nginx 配置文件中的代理_ pass 区域 .

Published At
Categories with 技术
comments powered by Disqus