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

介绍

默认情况下,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.crtcert.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配置页以下的东西。

Jenkins错误:反向代理设置被打破

所以,如果您看到此错误,请仔细检查proxy_passproxy_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/

Jenkins网址

接下来,使用外部提供商更新您的OAuth设置。 这个例子是GitHub。 在GitHub上,这可以设置下找到- >应用程序- >开发应用程序 ,在GitHub的网站。

应该有一个Jenkins的条目。 更新主页URL授权回调URL,以反映HTTPS设置。 它可能类似于以下内容:

Jenkins设置在GitHub上; https://已与这两个网址一起使用

结论

唯一剩下要做的是验证一切正常工作。 正如上面提到的,你现在应该能够浏览到您的新配置的URL - jenkins.domain.com -在HTTP或HTTPS。 您应该被重定向到安全网站,并应看到一些网站信息,包括您最近更新的SSL设置。 如前所述,如果您没有通过DNS使用主机名,则您的重定向可能无法正常工作。 在这种情况下,您将需要修改Nginx的配置文件中proxy_pass部分。

您可能还需要使用浏览器来检查您的证书。 您应该能够单击锁定以在浏览器中查看证书属性。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏