Jenkins使用反向代理替代端口号

时间:2015-09-23 10:25:48

标签: curl nginx jenkins reverse-proxy build-server

我有一个jenkins构建器服务器,我正在尝试使用nginx设置反向代理。我跟踪了jenkins网站上的所有howto和文档,但唯一不同的是我需要服务器可以在不同的端口上访问,然后是标准的https端口。

服务器必须在https://jenkins.example.com:9090可以访问,现在正在运行,但我仍然遇到一些问题。在Manage Jenkins中,我不断收到消息

  

您的反向代理设置似乎已损坏

当我登录或应用或保存一些配置更改时,我不断被重定向到https://jenkins.example.com而没有端口号。

当我检查curl并查看某些页面的标题时,它会一直将位置标题设置为正确的URL但没有端口号。

我在nginx中有以下配置

server {
  listen 443 ssl spdy;
  server_name jenkins.example.com;
  add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
  add_header X-Frame-Options "DENY";

  ssl on;
  ssl_certificate /etc/nginx/ssl/server.chain.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;
  ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-$
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

  # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
  ssl_dhparam /etc/nginx/ssl/dhparam.pem;

  # enable ocsp stapling (mechanism by which a site can convey certificate revocation information to visitors in a privacy-preserving, scalable manner)
  # http://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/
  resolver 8.8.8.8;
  ssl_stapling on;
  ssl_trusted_certificate /etc/nginx/ssl/server.crt;

  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://127.0.0.1:8080/;
    proxy_read_timeout  90;

    proxy_redirect      http://127.0.0.1:8080 https://jenkins.example.com:9090;
  }
}

在jenkins的默认配置中,我添加了--httpListenAddress=127.0.0.1并在管理Jenkins中 - >配置系统我已将端口号为https://jenkins.example.com:9090/的正确URL添加到Jenkins位置。

当我使用curl检查它们时,这些是标题。

curl -I  https://jenkins.example.com:9090/scriptApproval
HTTP/1.1 302 Found
Server: nginx/1.9.4
Date: Thu, 24 Sep 2015 13:17:56 GMT
Content-Length: 0
Connection: keep-alive
X-Content-Type-Options: nosniff
Location: https://jenkin.example.com/scriptApproval/
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
X-Frame-Options: DENY

更新1

proxy_set_header X-Forwarded-Port 9090;添加到nginx配置时,这似乎可以修复设置页面上的错误It appears that your reverse proxy set up is broken

更新2

也许它与尾部斜杠有关。当我用curl调用https://build.example.com:9090/pluginManager/时,我从jenkins获得403 Forbidden repsonse但是当没有尾随斜杠的调用https://build.example.com:9090/pluginManager时,我得到302 Found响应,其中location标题设置为https://build.example.com/pluginManager/

更新3

此服务器连接在共享的Internet连接上,运行的服务器数量超出了我的控制范围。它只运行Jenkins CI和nginx,它应该是反向代理。路由器上的WAN端口列为端口9090,它在端口443上转发到服务器,端口443应该是Nginx,它应该将所有内容代理到正在侦听端口8080的Jenkins-CI。

更新4

这是我尝试过的当前配置。这似乎也不起作用。

upstream jenkins {
  server 127.0.0.1:8080 fail_timeout=0;
}

server {
  listen 9090 default ssl http2;
  server_name build.pixplicity.com;

  ssl on;
  ssl_certificate /etc/nginx/ssl/server.chain.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;

  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 https;
    proxy_set_header        X-Forward-Port 9090;

    # Fix the "It appears that your reverse proxy set up is broken" error.
    proxy_pass          http://127.0.0.1:8080;
    proxy_read_timeout  90;

    proxy_redirect http://127.0.0.1:8080 https://build.pixplicity.com:9090;
    #proxy_redirect default;
  }
}

3 个答案:

答案 0 :(得分:3)

更新 Update 4 配置中的以下行:

listen 443 default ssl http2;

proxy_set_header        Host $host:9090;

答案 1 :(得分:0)

这通常是由于proxy_redirect被设置为不正确的值(大多数情况下人们会尝试将其从默认值default更改,使得内容无效)。

我不确定我是否理解您的配置 - 为什么您的listen指令仅提及443,而没有提及9090,但在proxy_redirect你是为replacement执行9090

您应该将proxy_redirect设置为默认值default,正确设置listen(而不是通过防火墙进行重定向?),然后问题可能就会消失。

如果上述方法无效,那么您必须找出jenkins在回复nginx请求时提供的Location,并在proxy_redirect指令中指定此类前缀。我会在执行sudo tcpdump -A -ilo port 8080查询时推荐curl之类的内容,以确切了解Jenkins返回的内容,以确保在nginx内发出请求时考虑所有额外变量,比如额外的X-标题等。

如果所有其他方法都失败并且您并不真正关心毛茸茸的配置,并且您知道您不打算从此jenkins服务器中重定向到任何外部主机,那么可能需要尝试以下内容:好:

proxy_redirect ~^https?://[^/]+/(?<u>.*)$ https://jenkins.example.com:9090/$u;

(或者,当然,您也可以使用一些额外的正则表达式,具体取决于jenkins在其Location标头中返回nginx的内容。)

然而,为了确保人们在不阅读所有先前的免责声明的情况下不复制粘贴上述内容,让我们重申真正的建议仍然如下:

proxy_redirect default;

答案 2 :(得分:0)

第1步:将listen 443 ssl spdy;更改为listen 9090 ssl spdy;

第2步:将proxy_pass http://127.0.0.1:8080/;更改为proxy_pass http://127.0.0.1:8080;

我也可以尝试摆脱第4行和第4行中那些奇怪的标题。 5,但这只是猜测。

如果这不起作用,我会在阅读Digital Ocean tutorial的同时从头开始,这真的很棒。

我很高兴你用nginx在端口443上听,但期望它在端口9090上服务。很有可能,当你卷曲9090时,你直接访问jenkins。或者你在SO中复制粘贴了错误的块。

无论如何,您可能需要更清楚地知道哪个服务器在哪个端口上服务,并且订单请求通过。在我看来,它应该是这两个中的一个:

1)https://jenkins.example.com:9090转到nginx侦听端口9090,它将它代理到jenkins,它位于http(s)://127.0.0.1:8080(不同的app,同一服务器)。

2)https://jenkins.example.com转到nginx侦听端口443,它将它代理到jenkins,它位于http(s)://127.0.0.1:9090。