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

来自菜鸟教程
跳转至:导航、​搜索

介绍

默认情况下,Jenkins 自带内置的 Winstone Web 服务器,监听 8080 端口,方便上手。 但是,一旦您认真使用 Jenkins,就应该使用 SSL 对其进行保护,以保护通过 Web 界面传输的密码和其他敏感数据。

在本教程中,我们将演示如何将 Nginx 配置为反向代理,以将客户端请求定向到 Jenkins。 为了开始,您需要完成以下每个先决条件。

先决条件

按照 Ubuntu 16.04 初始服务器设置指南 使用非 root sudo 用户和防火墙配置一个 Ubuntu 16.04 服务器,使用 Jenkins 和 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_passproxy_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 项目的“入门:创建您的第一个管道 教程或 社区贡献的插件库