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

来自菜鸟教程
跳转至:导航、​搜索

###介绍

默认情况下,Jenkins 带有自己的内置 Web 服务器,它侦听端口 8080。 如果你运行一个私有的 Jenkins 实例,或者你只需要快速启动一些东西而不关心安全性,这很方便。 但是,一旦您将真实的生产数据发送到您的主机,最好使用像 Nginx 这样更安全的 Web 服务器。

这篇文章将详细介绍如何使用 Nginx Web 服务器作为 Jenkins 实例的反向代理来使用 SSL 包装您的站点。 本教程假设您熟悉 Linux 命令、有效的 Jenkins 安装和 Ubuntu 14.04 安装。

如果您还没有安装 Jenkins,您可以在本教程后面安装它。

第一步——配置 Nginx

近年来,Nginx 因其速度和灵活性而成为备受青睐的 Web 服务器,因此这就是我们将使用的 Web 服务器。

本节中的命令假定您有一个使用 sudo access 设置的用户。

安装 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 证书的位置。 您需要使用自己的域名更新 server_nameproxy_redirect 行。 还有一些额外的 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 实例。 这是一个稍微不同的情况,但是 this tutorial 有一些关于 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 配置页面中获得类似于以下内容的内容。

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

    1. 第二步 - 配置 Jenkins

如前所述,本教程假设 Jenkins 已经安装。 本教程将向您展示如何在必要时安装Jenkins。 您可能需要切换到该文章的 root 用户。

为了让 Jenkins 与 Nginx 一起工作,我们需要更新 Jenkins 配置以仅侦听 localhost 接口而不是全部 (0.0.0.0),以确保正确处理流量。 这是一个重要的步骤,因为如果 Jenkins 仍在侦听所有接口,那么它仍然可以通过其原始端口 (8080) 访问。 我们将修改 /etc/default/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 URL

如果您使用 GitHub 或其他 OAuth 插件进行身份验证,此时它可能会被破坏。 例如,当您尝试访问该 URL 时,您将收到一个“无法打开页面”,其 URL 类似于以下内容:

http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string

要解决此问题,您需要更新一些设置,包括您的 OAuth 插件设置。 首先更新 Jenkins URL(在 Jenkins GUI 中); 在这里能找到它:

Jenkins -> 管理 Jenkins -> 配置系统 -> Jenkins 位置

更新 Jenkins URL 以使用 HTTPS - https://jenkins.domain.com/

接下来,使用外部提供商更新您的 OAuth 设置。 此示例适用于 GitHub。 在 GitHub 上,可以在 GitHub 站点的 Settings -> Applications -> Developer applications 下找到它。

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

结论

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

您可能还想使用浏览器检查您的证书。 您应该能够单击锁以从浏览器中查看证书属性。