首页 文章

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

提问于
浏览
3

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

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

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

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

当我检查curl并查看某些页面的 Headers 时,它会一直将位置 Headers 设置为正确的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检查它们时,这些是 Headers .

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

Update 1

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

Update 2

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

Update 3

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

Update 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

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

    listen 443 default ssl http2;
    
    proxy_set_header        Host $host:9090;
    
  • 3

    这通常是由于proxy_redirect设置为不正确的值(大多数情况下人们会尝试将其从默认值 default 更改,使得东西不起作用) .

    我不确定我理解你的配置 - 为什么你的 listen 指令只提到 443 ,没有提及 9090 ,但在 proxy_redirect 你正在为 9090replacement

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


    如果上面没有找到 Location jenkins在回复来自nginx的请求时提供的内容,并在 proxy_redirect 指令中指定了这样的前缀 . 我会推荐类似 sudo tcpdump -A -ilo port 8080 的东西,同时执行上面的 curl 查询以确切知道Jenkins返回的是什么,以确保在从nginx内部发出请求时考虑所有额外的变量,比如额外的 X- Headers 等 .


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

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

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

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

    proxy_redirect default;
    
  • 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和第5行中那些奇怪的 Headers ,但这只是猜测 .

    如果这并没有从头开始再次阅读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(不同的应用程序,相同的服务器) .

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

相关问题