​如何使用Nginx反向代理配置SSL加密的Jenkins

介绍

默认情况下,Jenkins自带内置的Winstone网络服务器,可以通过8080端口进行监听,方便入门。但是,只要您认真使用Jenkins,就应该使用SSL保护它,以保护通过网页界面传输的密码和其他敏感数据。

在本教程中,我们将演示如何将Nginx配置为反向代理,以将客户端请求定向到Jenkins。开始之前,您需要完成以下准备工作。

准备

配置了使用sudo命令的非root用户的Ubuntu 16.04服务器,没有服务器的用户可以购买和使用腾讯云服务器或者直接在腾讯云实验室Ubuntu服务器上机实验,搭建Jenkins环境详见腾讯云社区相关教程,如果使用CentOS系统,参考腾讯云实验室Jenkins环境搭建教程

第一步 - 配置Nginx

打开/etc/nginx/sites-available/default文件添加我们的反向代理设置。

$ 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;        }
. . . 

然后,我们将添加实际的代理设置。配置首先包括提供的Nginxproxy_params,它确保我们的日志文件中可以使用主机名、客户端请求协议和客户端IP地址等信息。接下来,proxy_pass设置代理服务器的协议和地址,在我们的例子中是在端口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

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

nginx: 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)状态:

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

Jenkins登陆界面

在“用户”字段输入admin以及Jenkins在安装时创建和存储的自动生成的密码。

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

如果您已重置管理员用户的密码,请输入该密码。无论哪种方式,我们登录之后都要更改密码以确保其安全。

Jenkins主界面

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

结论

在本教程中,在完成准备工作后,我们把Nginx配置为Jenkins内置网络服务器的反向代理,以确保通过Web界面传输的凭据和其他信息。


参考文献:《How to Configure Jenkins with SSL using an Nginx Reverse Proxy》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微服务生态

玩转Flume+Kafka原来也就那点事儿

好久没有写分享了,继前一个系列进行了Kafka源码分享之后,接下来进行Flume源码分析系列,望大家继续关注,今天先进行开篇文章Flume+kafka的环境配置...

11820
来自专栏漫漫全栈路

Ubuntu下配置JavaWeb开发环境

还是JSP环境,最近上了两节JSP的课了,基本上对于JavWeb的基础介绍也说的差不多了,按照课程安排应该是要进入到页面基础内容的阶段了,所以差不多也要把JSP...

43780
来自专栏乐沙弥的世界

使用CRM方式管理heartbeat

1、在heartbeat v2之后的版本,可以将haresources方式管理的资源转化为基于CIB方式进行管理 2、使用CRM(CIB)管理,需要配置ha...

16140
来自专栏芋道源码1024

注册中心 Eureka 源码解析 —— Eureka-Server 启动(一)之 ServerConfig

本文主要基于 Eureka 1.8.X 版本 1. 概述 2. EurekaServerConfig 2.1 类关系图 2.2 配置属性 2.3 Default...

40150
来自专栏用户2442861的专栏

MyBatis学习总结(三)——优化MyBatis配置文件中的配置

  之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下:

12310
来自专栏云计算教程系列

如何在Ubuntu 16.04上安装和配置OrientDB

OrientDB是一个多模型NoSQL数据库,支持图形和文档数据库。它是一个Java应用程序,可以在任何操作系统上运行。它也完全支持ACID,支持多主复制,可轻...

19230
来自专栏C++

Windows编译Opencv

22940
来自专栏乐沙弥的世界

CentOS 7下配置本地yum源及yum客户端

Linux下对于软件包的管理使用rpm管理方式。直接使用rpm包管理工具来进行rpm包的安装,升级,卸载时,对于最让人头疼的莫过与包之间的依赖关系。yum作为一...

49140
来自专栏北京马哥教育

详细到没朋友,一文帮你理清Linux 用户与用户组关系~

15430
来自专栏编程坑太多

python多版本共存最好的解决方案-虚拟环境

19040

扫码关注云+社区

领取腾讯云代金券