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

介绍

默认情况下,Jenkins 配备了内置的Winstone Web 服务器,可在端口 8080上收听,方便开始使用,一旦您认真使用Jenkins,则应该使用SSL来保护通过 Web 界面传输的密码和其他敏感数据。

在本教程中,我们将展示如何将 Nginx 配置为反向代理,以将客户端请求直接发送给 Jenkins。

前提条件

一台 Ubuntu 16.04 服务器 配置了非 root sudo 用户和防火墙,通过遵循 Ubuntu 16.04 初始服务器设置指南与 Jenkins 和 Nginx 安装和配置使用以下指南:

一旦你完成了这些要求,你已经准备好开始。

第一步:配置 Nginx

在前提教程中, 如何在Ubuntu 16.04上安全地加密 Nginx,我们将 Nginx配置为在 /etc/nginx/sites-available/default文件中使用SSL,所以我们将打开该文件以添加我们的反向代理设置。

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

首先,我们将使用 SSL 配置设置在服务器块中添加特定访问和错误日志:

1[label /etc/nginx/sites-available/default]
2. . . 
3server {
4        # SSL Configuration
5        #
6        # listen 443 ssl default_server;
7        # listen [::]:443 ssl default_server;
8        access_log            /var/log/nginx/jenkins.access.log;
9        error_log            /var/log/nginx/jenkins.error.log;

然后,我们将配置代理设置. 由于我们将所有请求发送给Jenkins,我们将评论默认的try_files行,如上所述,在请求到达Jenkins之前返回404错误。

1[label /etc/nginx/sites-available/default]
2 . . .
3           location / {
4                # First attempt to serve request as file, then
5                # as directory, then fall back to displaying a 404.
6                # try_files $uri $uri/ =404;        }
7. . .

然后,我们将添加实际的代理设置. 该配置首先包括Nginx提供的"proxy_params",它能确保像主机名那样的信息,客户端请求的协议,以及客户端IP地址被保留在我们日志文件中. 接下来,`proxy_pass'设定了代理服务器的协议和地址,就我们而言,代理服务器是Jenkins服务器在8080港的本地主机上访问的。 然后,我们将Nginx的60秒默认值中的)包括适当的主机名.

请确保在下面的proxy_redirect行中替换您的 SSL 安全域名:

 1[label /etc/nginx/sites-available/default]
 2Location /  
 3. . .
 4           location / {
 5                # First attempt to serve request as file, then
 6                # as directory, then fall back to displaying a 404.
 7                # try_files $uri $uri/ =404;
 8                include /etc/nginx/proxy_params;
 9                proxy_pass http://localhost:8080;
10                proxy_read_timeout 90s;
11                # Fix potential "It appears that your reverse proxy set up is broken" error.
12                proxy_redirect http://localhost:8080 https://your.ssl.domain.name;

一旦你做了这些更改,保存并退出文件. 我们不会重新启动 Nginx 直到我们配置了 Jenkins 之后,但我们现在将测试我们的配置:

1sudo nginx -t

如果一切顺利,命令将返回:

1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful

否则,修复报告的任何错误,直到测试通过。

注意: 如果您错误地配置),您将在您的 Jenkins 配置页面中看到类似的内容。

Jenkins error: Reverse proxy set up is broken

如果您看到此错误,请在 Nginx 配置中双重检查proxy_passproxy_redirect设置。

步骤二:配置Jenkins

为了让 Jenkins 与 Nginx 合作,我们需要更新 Jenkins 配置,以便 Jenkins 服务器只在)。

我们将修改/etc/default/jenkins配置文件以进行这些调整。

1sudo nano /etc/default/jenkins

查找JENKINS_ARGS行,并将--httpListenAddress=127.0.0.1添加到现有参数中:

1[label /etc/default/jenkins]
2. . .
3JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"

保存和退出文件。

要使用新的配置设置,我们将重新启动 Jenkins 和 Nginx。

1sudo systemctl restart jenkins

由于systemctl没有显示输出,我们会检查状态:

1sudo systemctl status jenkins

我们应该在活跃行中看到活跃状态:

1[secondary_label Output]
2 jenkins.service - LSB: Start Jenkins at boot time
3   Loaded: loaded (/etc/init.d/jenkins; bad; vendor preset: enabled)
4   Active: active (exited) since Tue 2017-04-25 22:37:29 UTC; 5s ago
5     Docs: man:systemd-sysv-generator(8)
6  Process: 11360 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
7  Process: 11391 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)

我们将对 Nginx 重复这些步骤:

1sudo systemctl restart nginx
1sudo systemctl status nginx
1[secondary_label Output]
2 nginx.service - A high performance web server and a reverse proxy server
3   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
4   Active: active (running) since Tue 2017-04-25 22:36:08 UTC; 2min 51s ago
5  Process: 11339 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=
6  Process: 11349 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
7  Process: 11345 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUC
8 Main PID: 11353 (nginx)

现在我们重新启动了两个服务器,我们应该能够使用HTTP或HTTPS访问该域,HTTP请求将自动重定向到HTTPS,Jenkins网站将安全地服务。

步骤三:测试配置

我们将通过重新设置管理密码来测试配置,现在我们已经启用了加密,我们将开始通过访问网站通过http来验证我们已经到达Jenkins并被重定向到https,正如我们预期的那样:

在您的网页浏览器中,输入http://your.ssl.domain.name,以your.ssl.domain.name代替您的域名。 点击Enter后,URL应以https开始,位置栏应表示连接安全。

Verify Jenkins is being served over https

我们将在用户字段中输入admin和Jenkins在我们安装时创建和存储的自动生成的密码。

1sudo cat /var/lib/jenkins/secrets/initialAdminPassword

如果您已经重置了管理员用户的密码,请输入该密码,无论如何,一旦我们登录,我们将更改密码,以确保它是安全的。

Navigate to the Jenkins admin password page

点击右上角的admin,从下载菜单中选择配置。输入并确认新密码,然后点击保存

结论

在这个教程中,在完成先决条件后,我们配置了Nginx作为Jenkins内置网络服务器的倒置代用,以保障我们通过Web接口传输的证书和其他信息的安全. 现在Jenkins安全了,你可以学会如何设置连续集成管道自动测试代码更改. 考虑你是否对Jenkins来说是新手的其他资源是Jenkins项目"Geting Started: Create your first Pipeline教程或社区贡献插件库.

Published At
Categories with 技术
comments powered by Disqus