介绍
默认情况下,Jenkins自带了内置的Web服务器,它监听端口8080.如果你运行一个私人的Jenkins实例,或者你只是需要快速得到一些东西,而不关心安全,这是很方便的。 一旦你有真正的生产数据到你的主机,虽然,一个好主意,使用一个更安全的网络服务器,如Nginx。
这篇文章将详细介绍如何包装你的网站使用Nginx的网络服务器为您Jenkins例如反向代理SSL。 本教程假设熟悉一些Linux命令,工作Jenkins安装,Ubuntu的14.04安装。
如果你还没有安装Jenkins,你可以在本教程的后面安装。
第一步 - 配置Nginx
Nginx已经成为一个喜爱的Web服务器,它的速度和灵活性在近几年,所以这是我们将使用的Web服务器。
本节中的命令假设你有一个用户设置了sudo访问 。
安装Nginx
更新您的软件包列表并安装Nginx:
sudo apt-get update
sudo apt-get install nginx
这并不重要,但你可能想检查Nginx的版本,以防万一你需要做任何疑难解答。 Nginx的较新版本还提供了一些更多的功能。
nginx -v
获取证书
接下来,您需要购买或创建SSL证书。 这些命令是自签名的证书,但你应该得到一个正式签署的证书 ,如果你想避免浏览器的警告。
移动到正确的目录并生成证书:
cd /etc/nginx
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt
系统将提示您输入有关证书的一些信息。 你可以填写这个,但你想要的; 只是意识到信息将在证书属性中可见。 我们将比特数设置为2048,因为这是CA签名所需的最小值。 如果要获取证书签名,则需要创建CSR。
编辑配置
接下来,您将需要编辑默认的Nginx配置文件。
sudo nano /etc/nginx/sites-enabled/default
这里是最终配置可能是什么样子; 这些部分被分解并在下面简要解释。 您可以更新或替换现有的配置文件,但您可能需要先进行快速复制。
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443;
server_name jenkins.domain.com;
ssl_certificate /etc/nginx/cert.crt;
ssl_certificate_key /etc/nginx/cert.key;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/jenkins.access.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass http://localhost:8080;
proxy_read_timeout 90;
proxy_redirect http://localhost:8080 https://jenkins.domain.com;
}
}
在我们的配置中,cert.crt和cert.key设置反映了我们创建了SSL证书的位置。 您将需要更新服务器的名称 ,并与自己的域名`proxyredirect`线。 还有一些额外的Nginx魔法,以及告诉请求由Nginx读取和重写在响应端,以确保反向代理正在工作。
第一部分告诉Nginx服务器监听来自端口80(默认HTTP)的任何请求,并将它们重定向到HTTPS。
...
server {
listen 80;
return 301 https://$host$request_uri;
}
...
接下来,我们有SSL设置。 这是一个很好的默认设置,但肯定可以扩展。 欲了解更多的解释,请阅读本教程 。
...
listen 443;
server_name jenkins.domain.com;
ssl_certificate /etc/nginx/cert.crt;
ssl_certificate_key /etc/nginx/cert.key;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
...
最后一部分是代理发生的地方。 它基本上接收任何传入请求,并将它们代理到绑定/侦听本地网络接口上的端口8080的Jenkins实例。 这是一个稍微不同的情况,但本教程中有大约Nginx的代理服务器设置一些有用的信息。
...
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass http://localhost:8080;
proxy_read_timeout 90;
proxy_redirect http://localhost:8080 https://jenkins.domain.com;
}
...
一些快速的事情要指出这里。 如果你没有解析为Jenkins服务器域名,那么proxy_redirect上述声明将无法正常无需修改工作,所以记住这一点。 另外,如果你错误地配置了proxy_pass(通过添加例如最后的斜线),你会得到类似的Jenkins配置页以下的东西。
所以,如果您看到此错误,请仔细检查proxy_pass和proxy_redirect设置在Nginx的配置!
第二步 - 配置Jenkins
如前所述,本教程假设Jenkins已安装。 本教程将告诉你如何在需要时安装Jenkins。 您可能需要切换到该文章的root用户。
对于Jenkins使用Nginx,我们需要更新Jenkins配置只侦听localhost接口而不是全部(0.0.0.0),以确保流量得到正确处理。 这是一个重要的步骤,因为如果Jenkins仍在侦听所有接口,则它仍然可能通过其原始端口(8080)访问。 我们将修改/ etc /默认/Jenkins的配置文件来进行这些调整。
sudo nano /etc/default/jenkins
找到JENKINS\_ARGS
线和更新它看起来像如下因素:
JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=127.0.0.1 --httpPort=$HTTP_PORT -ajp13Port=$AJP_PORT"
请注意,--httpListenAddress = 127.0.0.1设置需要任何添加或修改。
然后继续并重新启动Jenkins和Nginx。
sudo service jenkins restart
sudo service nginx restart
您现在应该可以使用HTTP或HTTPS访问您的域,并且Jenkins网站将安全地提供。 如果您使用自签名证书,您将看到证书警告。
可选 - 更新OAuth网址
如果您使用GitHub或其他OAuth插件进行身份验证,则此时可能会被中断。 例如,当尝试访问网址时,您将收到“无法打开网页”,网址类似于以下网址:
http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string
要解决此问题,您需要更新一些设置,包括您的OAuth插件设置。 首先更新Jenkins URL(在Jenkins GUI中); 它可以在这里找到:
Jenkins - >管理Jenkins - >配置系统 - > Jenkins位置
更新JenkinsURL中使用HTTPS - https:// jenkins.domain.com/
接下来,使用外部提供商更新您的OAuth设置。 这个例子是GitHub。 在GitHub上,这可以设置下找到- >应用程序- >开发应用程序 ,在GitHub的网站。
应该有一个Jenkins的条目。 更新主页URL和授权回调URL,以反映HTTPS设置。 它可能类似于以下内容:
结论
唯一剩下要做的是验证一切正常工作。 正如上面提到的,你现在应该能够浏览到您的新配置的URL - jenkins.domain.com -在HTTP或HTTPS。 您应该被重定向到安全网站,并应看到一些网站信息,包括您最近更新的SSL设置。 如前所述,如果您没有通过DNS使用主机名,则您的重定向可能无法正常工作。 在这种情况下,您将需要修改Nginx的配置文件中proxy_pass部分。
您可能还需要使用浏览器来检查您的证书。 您应该能够单击锁定以在浏览器中查看证书属性。