介绍
默认情况下,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声明不会正常工作没有修改,所以要记住这一点。
因此,如果您看到此错误,请在 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/
接下来,与外部提供商更新您的 OAuth 设置. 此示例适用于 GitHub. 在 GitHub 上,可以在 GitHub 网站上的 设置 -> 应用程序 -> 开发人员应用程序 下找到。
应该有 Jenkins 的条目更新 主页 URL 和** 授权回调 URL** 以反映 HTTPS 设置。
结论
唯一要做的是确认一切工作都正确。 如上所述,您现在应该能够浏览您新配置的 URL - Jenkins.domain.com - 浏览HTTP 或 HTTPS 。 您应该重定向到安全站点, 并查看一些站点信息, 包括您新更新的 SSL 设置 。 如前所指出,如果您不通过 DNS 使用主机名,那么您的重定向可能无法正常工作 。 在这种情况下, 您需要修改 Nginx 配置文件中的代理_ pass 区域 .