Curl Jenkins与备用端口号的反向代理

Curl Jenkins与备用端口号的反向代理,curl,nginx,jenkins,reverse-proxy,build-server,Curl,Nginx,Jenkins,Reverse Proxy,Build Server,我有一个jenkins builder服务器,我正在尝试使用nginx设置反向代理。我遵循了jenkins站点的所有howto和文档,但唯一不同的是,我需要在不同的端口上访问服务器,然后是standerd https端口 必须在https://jenkins.example.com:9090它现在正在工作,但我仍然有一些问题。在管理詹金斯方面,我一直得到信息 您的反向代理设置似乎已损坏 此外,当我登录、应用或保存一些配置更改时,我会不断被重定向到https://jenkins.example.c

我有一个jenkins builder服务器,我正在尝试使用nginx设置反向代理。我遵循了jenkins站点的所有howto和文档,但唯一不同的是,我需要在不同的端口上访问服务器,然后是standerd https端口

必须在
https://jenkins.example.com:9090
它现在正在工作,但我仍然有一些问题。在管理詹金斯方面,我一直得到信息

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

此外,当我登录、应用或保存一些配置更改时,我会不断被重定向到
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的默认配置中,我添加了
--httplistenadress=127.0.0.1
,在Manage jenkins-->配置系统中,我添加了正确的url和端口号
https://jenkins.example.com:9090/
至詹金斯位置

这些是我使用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\u set\u头X-Forwarded-Port 9090时
对于nginx配置,这似乎修复了错误
在设置页面上,您的反向代理设置似乎已中断

更新2

也许这和后面的斜杠有关。当我呼叫
https://build.example.com:9090/pluginManager/
使用curl,我从jenkins那里得到了403次禁止的回复,但是当一个电话
https://build.example.com:9090/pluginManager
如果没有尾部斜杠,我会得到一个302 Found响应,位置标题设置为
https://build.example.com/pluginManager/

更新3

此服务器连接到共享internet上,连接到我无法控制的其他服务器。它只运行Jenkins CI和nginx,这应该是反向代理。路由器上的WAN端口列表显示为端口9090,该端口转发至端口443上的服务器,该端口应为Nginx,该端口应将所有内容代理给Jenkins CI,该CI正在侦听端口8080

更新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;
  }
}

这通常是由于被设置为不正确的值(大多数情况下,人们试图将其从默认值
default
更改,使其无法工作)

我不确定我是否理解您的配置-为什么您的
listen
指令只提到
443
,没有提到
9090
,但在
proxy\u redirect
中,您正在对
9090
进行
替换

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


如果上述方法没有帮助,那么您必须找出当jenkins回复来自nginx的请求时,
Location
jenkins提供了什么,并在
proxy\u redirect
指令中指定这样的前缀。我建议在执行上面的
curl
查询时使用
sudotcpdump-A-ilo端口8080
之类的方法,以准确了解Jenkins返回的是什么,确保在从nginx中发出请求时考虑所有额外的变量,比如额外的
X-
头等等


如果所有其他操作都失败了,并且您并不真正关心毛茸茸的配置,并且您知道您不打算从此jenkins服务器中重定向到任何外部主机,那么下面的内容也值得一试:

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

第1步:更改
listen443sslpdy
收听9090 ssl spdy

步骤2:更改
proxy\u passhttp://127.0.0.1:8080/;
代理\u通行证http://127.0.0.1:8080;

我也可以尝试去掉第4行和第5行中那些奇怪的标题,但这只是一个猜测

如果这不起作用,我会从头开始,一边阅读,这真的很好

您正在使用nginx收听端口443,但期望它在端口9090上提供服务,这让我感到非常不安。很有可能,当你卷曲9090时,你是在直接访问詹金斯。或者你复制粘贴了错误的块

无论如何,您可能需要更清楚地了解哪个服务器在哪个端口上提供服务,以及订单请求是如何通过的。在我看来,这应该是以下两种情况之一:

1) 转到nginx侦听端口9090,该端口将其代理给jenkins,jenkins位于http://127.0.0.1:8080(不同的应用程序,相同的服务器)


2) 转到nginx侦听端口443,该端口将其代理给jenkins,jenkins位于http://127.0.0.1:9090。

更新配置中的以下行:

listen 443 default ssl http2;

proxy_set_header        Host $host:9090;

如果我读对了,你难道不需要更改
listen443sslpdy线路到
监听9090ssl-spdy?(再加上将代理\u过程更改为重定向到8080)。@DevinHoward将nginx更改为侦听端口9090并不能解决问题。位置标头仍然重定向到,但没有端口号。而且proxy_pass已经设置为8080端口?我想知道是否有其他nginx站点干扰这个端口。您是否可以尝试禁用所有其他站点启用的nginx配置文件,然后重新启动nginx,看看是否有什么不同?此服务器仅运行jenkins+nginx,其他什么都没有服务器通过共享internet连接连接到internet,因此我只能从端口9090的外部访问它。路由器执行9090-->443转换。我还尝试将nginx设置为直接监听
listen 443 default ssl http2;

proxy_set_header        Host $host:9090;