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

默认情况下,Jenkins自带内置的Winstone Web服务器,监听端口8080,方便入门。一旦您认真使用Jenkins,则应使用SSL进行安全保护,以保护密码和其他敏感数据的传输。

介绍

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

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

先决条件

一个Ubuntu 16.04服务器配置了非root用户和防火墙,遵循使用Jenkins和Nginx的Ubuntu 16.04初始服务器设置指南 ,并使用以下指南进行配置:

完成这些要求后,即可开始。

第一步 - 配置Nginx

在前提教程中, 如何使用Ubuntu 16.04加密 Nginx,我们将Nginx配置为在/etc/nginx/sites-available/default文件中使用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设置代理服务器的协议和地址,在我们的例子中是在8080端口上localhost上访问的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;

完成这些更改后,请保存并退出该文件。 我们不会重新启动Nginx,直到我们配置了Jenkins,但我们将测试我们的配置:

sudo nginx -t

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

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果没有,请修复报告的任何错误,直到测试通过。

注意:
如果您错误地配置proxy_pass (例如通过添加尾部斜线),您将在“Jenkins配置”页面中获得类似于以下内容的内容。

Jenkins错误:反向代理设置已损坏

如果看到此错误,请仔细检查Nginx配置中的proxy_passproxy_redirect设置。

第二步 - 配置Jenkins

对于Jenkins与Nginx一起工作,我们需要更新Jenkins配置,以便Jenkins服务器只在localhost主机接口上监听,而不是所有接口( 0.0.0.0 )。 如果Jenkins在所有接口上监听,那么在原始的未加密端口( 8080 )上可以访问它。

我们将修改/etc/default/jenkins 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)状态:

● 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
● 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.nameyour.ssl.domain.name 按Enter键后,URL应以https开头,位置栏应该指示连接是安全的。

通过https验证Jenkins

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

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

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

导航到Jenkins管理员密码页面

点击右上角的“admin”,从下拉菜单中选择“配置”。 输入并确认新密码,然后点击“保存”。 您现在可以安全地使用Jenkins Web界面。

结论

在本教程中,完成先决条件后,我们将Nginx配置为Jenkins内置Web服务器的反向代理,以确保通过Web界面传输的凭据和其他信息。 如果您刚接触Jenkins,您可能需要从Jenkins项目的“入门指南:创建您的第一条管道教程”或浏览社区提供的插件开始