介绍
默认情况下,Jenkins 自带内置的 Winstone Web 服务器,监听 8080 端口,方便上手。 但是,一旦您认真使用 Jenkins,就应该使用 SSL 对其进行保护,以保护通过 Web 界面传输的密码和其他敏感数据。
在本教程中,我们将演示如何将 Nginx 配置为反向代理,以将客户端请求定向到 Jenkins。 为了开始,您需要完成以下每个先决条件。
先决条件
按照 Ubuntu 16.04 初始服务器设置指南 使用非 root sudo
用户和防火墙配置一个 Ubuntu 16.04 服务器,使用 Jenkins 和 Nginx 安装和配置以下指南:
- 如何在 Ubuntu 16.04 上安装 Jenkins
- 如何在 Ubuntu 16.04 上安装 Nginx
- 如何在 Ubuntu 16.04 上使用 Let's Encrypt 保护 Nginx。 请注意,本教程需要您拥有或控制的注册域名。
完成这些要求后,您就可以开始了。
第一步——配置 Nginx
在先决条件教程 How to Secure Nginx with Let's Encrypt on Ubuntu 16.04 中,我们在 /etc/nginx/sites-available/default
文件中将 Nginx 配置为使用 SSL,因此我们将打开该文件以添加我们的反向代理设置。
sudo nano /etc/nginx/sites-available/default
首先,我们将使用 SSL 配置设置在 server
块中添加特定的访问和错误日志:
/etc/nginx/sites-available/default
. . . server { # SSL Configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; access_log /var/log/nginx/jenkins.access.log; error_log /var/log/nginx/jenkins.error.log;
然后,我们将配置代理设置。 由于我们将所有请求发送给 Jenkins,我们将注释掉默认的 try_files
行,如所写,它将在请求到达 Jenkins 之前返回 404 错误。
/etc/nginx/sites-available/default
. . . location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; } . . .
然后,我们将添加实际的代理设置。 配置首先包括 Nginx 提供的 proxy_params
,它确保主机名、客户端请求的协议和客户端 IP 地址等信息将在我们的日志文件中可用。 接下来,proxy_pass
设置代理服务器的协议和地址,在我们的例子中是在 localhost 的 8080 端口上访问的 Jenkins 服务器。 然后,我们将 proxy_read_timeout
从 Nginx 的 60 秒默认值增加到项目推荐的 90 秒值。 最后我们添加 proxy_redirect
以确保 响应被正确重写 以包含正确的主机名。
请务必在下面的 proxy_redirect
行中替换您的 SSL 安全域名:
/etc/nginx/sites-available/default
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 set up is broken" error. proxy_redirect http://localhost:8080 https://your.ssl.domain.name;
完成这些更改后,保存并退出文件。 在配置 Jenkins 之前,我们不会重新启动 Nginx,但我们现在将测试我们的配置:
sudo nginx -t
如果一切正常,命令将返回:
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
如果没有,请修复报告的所有错误,直到测试通过。
注意: 如果您错误地配置了 proxy_pass
(例如,通过添加斜杠),您将在 Jenkins 配置页面中得到类似于以下内容的内容。
如果您看到此错误,请仔细检查 Nginx 配置中的 proxy_pass
和 proxy_redirect
设置。
第二步——配置 Jenkins
为了让 Jenkins 与 Nginx 一起工作,我们需要更新 Jenkins 配置,以便 Jenkins 服务器只侦听 localhost
接口而不是所有接口 (0.0.0.0
)。 如果 Jenkins 侦听所有接口,那么它可能可以在其原始的未加密端口 (8080
) 上访问。
我们将修改 /etc/default/jenkins
配置文件来进行这些调整。
sudo nano /etc/default/jenkins
找到 JENKINS_ARGS
行并将 --httpListenAddress=127.0.0.1
添加到现有参数:
/etc/default/jenkins
. . . JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"
保存并退出文件。
要使用新的配置设置,我们将重新启动 Jenkins 和 Nginx。
sudo systemctl restart jenkins
由于 systemctl
不显示输出,我们将检查状态:
sudo systemctl status jenkins
我们应该在 Active
行中看到 active (exited)
状态:
Output● jenkins.service - LSB: Start Jenkins at boot time Loaded: loaded (/etc/init.d/jenkins; bad; vendor preset: enabled) Active: active (exited) since Tue 2017-04-25 22:37:29 UTC; 5s ago Docs: man:systemd-sysv-generator(8) Process: 11360 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS) Process: 11391 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)
我们将为 Nginx 重复这些步骤:
sudo systemctl restart nginx
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 Tue 2017-04-25 22:36:08 UTC; 2min 51s ago Process: 11339 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code= Process: 11349 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 11345 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUC Main PID: 11353 (nginx)
现在我们已经重新启动了两台服务器,我们应该能够使用 HTTP 或 HTTPS 访问域。 HTTP 请求将自动重定向到 HTTPS,并且 Jenkins 站点将得到安全服务。
第三步——测试配置
启用加密后,我们将通过重置管理密码来测试配置。 我们将首先通过 http
访问该站点,以验证我们到达 Jenkins 并按照我们的预期重定向到 https
:
在您的网络浏览器中,输入“http://your.ssl.domain.name”,将您的域替换为 your.ssl.domain.name
。 按 Enter 后,URL 应以 https
开头,并且位置栏应指示连接是安全的。
我们将在“用户”字段中输入 admin
以及 Jenkins 在安装时创建和存储的自动生成的密码。
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
如果您已重置管理员用户的密码,请输入该密码。 无论哪种方式,一旦我们登录,我们将更改密码以确保其安全。
单击右上角的“管理员”,然后从下拉菜单中选择“配置”。 输入并确认新密码,然后单击“保存”。 您现在可以安全地使用 Jenkins Web 界面。
结论
在本教程中,完成先决条件后,我们将 Nginx 配置为 Jenkins 内置 Web 服务器的反向代理,以保护通过 Web 界面传输的凭据和其他信息。 现在 Jenkins 是安全的,您可以学习 如何设置持续集成管道 以自动测试代码更改。 如果您是 Jenkins 新手,需要考虑的其他资源是 Jenkins 项目的“入门:创建您的第一个管道 教程或 社区贡献的插件库 。