为啥詹金斯抱怨我的反向代理设置被破坏了?

Posted

技术标签:

【中文标题】为啥詹金斯抱怨我的反向代理设置被破坏了?【英文标题】:Why does Jenkins complain that my reverse proxy setup is broken?为什么詹金斯抱怨我的反向代理设置被破坏了? 【发布时间】:2015-01-25 12:44:23 【问题描述】:

我不知道为什么在 Jenkins 更新到版本 1.591 (Ubuntu Server 12.04) 后,原来正确设置的反向代理现在坏了。我当前的设置与 Jenkins wiki 中所说的完全相同:

ProxyPass /jenkins http://localhost:8081/jenkins nocanon
ProxyPassReverse /jenkins http://localhost:8081/jenkins
ProxyPreserveHost On
ProxyRequests Off
AllowEncodedSlashes NoDecode
<Proxy http://localhost:8081/jenkins*>
Order deny,allow
Allow from all
</Proxy>

--prefix=/jenkins 也已添加到 /etc/default/jenkins 文件中

这是 Jenkins 的错误吗?

【问题讨论】:

【参考方案1】:

我在将 Jenkins 作为 Windows 服务包时遇到了这个问题。

据他们wiki:

确保系统配置中配置的 Jenkins URL 与您用于访问 Jenkins 的 URL 匹配。

进入系统配置:

    转到您的 Jenkins 页面 点击管理 Jenkins 点击配置系统 滚动到 Jenkins Location 并找到 Jenkins URL。

确保端口值与您计算机上 Jenkins 文件夹中 jenkins.xml 文件的 &lt;arguments&gt; 部分中设置的端口值匹配。

【讨论】:

谢谢乔希,我是通过本地主机而不是普通名称访问我的。他们真的应该为这条消息添加一个例外到 localhost... 正是这个:扩展答案:服务器主机名已更改,当我 FIRST 设置詹金斯框时,我没有更改“詹金斯位置”(a) ,我用http://jenkins-test1.example.com,所以这就是我放在Manage Jenkins -> Configure System -> Jenkins Location,(b)后来机器变成了生产机器,主机名改为:http://jenkins-prod1.example.com - 现在Jenkins抱怨,因此(C)解决方案:更新“Jenkins Location” 我的“jenkins.xml”文件中的参数字符串如下所示。 -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war" 这是我在 Jenkins URL 字段下给出的 URL:localhost:8080/jenkins 我无法理解如何让两个字符串都暗示同一个 Jenkins 地址。 我的机器上没有 没有 jenkins.xml。我有 Ubuntu。 感谢您的帮助。您肯定减轻了阅读整个 wiki 的工作量。就我而言,我已将默认端口更改为 8100。【参考方案2】:

对我来说,解决方法是添加:

RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"

这让它不再抱怨了。

【讨论】:

这也为我解决了问题。谢谢。 是的,明白了。对于 nginx proxy_set_header X-Forwarded-Proto https;proxy_set_header X-Forwarded-Port 443; 这个答案中提供的配置为我解决了它(***.com/questions/34940805/…) 你在哪里添加的,罗宾?【参考方案3】:

Jenkins 具有主动监控功能,以确保正确配置正向和反向代理。在 1.552 版中,这些测试得到了改进,现在可以检测到以前未标记为损坏的不正确代理设置。从版本 1.572 开始,即使是不依赖反向代理的 Jenkins 实例也会显示此警告。

修复损坏的反向代理配置在很大程度上取决于您的 Web 服务器和 Web 应用程序容器,这就是为什么有这么多其他答案针对您的问题发布的原因。有关此主题的 Jenkins Wiki 文章“Jenkins says my reverse proxy setup is broken”描述了在 cmets 中解决此问题的几种方法。

来自上述文章:

要使反向代理正常工作,它需要重写 请求和响应。

但正确的反向代理还涉及以下两个选项之一:

    重写响应;或 在转发的请求上设置 X-Forwarded-Host(可能还有 X-Forwarded-Port)标头。

就我而言,这实际上是第一个选项的问题,我的响应重写没有正确编码斜杠。如果您将 Apache HTTPD 与 Tomcat 一起使用,则需要向两个服务器添加对编码斜杠的支持,而不仅仅是 Apache HTTPD。

这些是在我的具体案例中解决此问题的说明:Amazon Linux EC2 实例上的 Jenkins 2.1.41,带有 Apache 2.4、Tomcat 8.5 和 Tomcat 连接器。

/etc/httpd/conf.d/ssl.conf 中为您的 Jenkins HostVirtualHost 添加以下行:

AllowEncodedSlashes NoDecode

将以下行添加到/usr/share/tomcat8/conf/catalina.properties

org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

重启两个服务:

service httpd restart
service tomcat8 restart

刷新您的管理 Jenkins 页面。警告信息将消失。


在 Apache HTTPD 中实现第二个选项的示例:

RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"

对于 NGINX:

proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;

【讨论】:

感谢您提供如此全面的分析和解决方案。围绕这个问题有很多“解决方案”,但它们都缺少 tomcat 部分——事实证明这是必不可少的。【参考方案4】:

事实证明,即使烦人的消息持续出现,一切正常。我认为这是版本的一个小错误。

【讨论】:

这不是错误。正如 Jenkins Wiki 中所述,“反向代理测试在 1.552 版中得到了改进,因此具有以前工作代理设置的用户可能会开始收到代理警告。”有关详细信息,请参阅this answer。【参考方案5】:

对于 nginx,这也帮助了我:

proxy_redirect      http://localhost:8080 https://your.ssl.domain.name

不要在上述网址中包含任何尾随斜杠,也不要proxy_pass 网址中。

【讨论】:

【参考方案6】:

这里的a link 明确指出在 1.552 之后发生了一些变化,因此添加了这些新行;

 nocanon and AllowEncodedSlashes

解决了我的问题,警告消失了。

【讨论】:

【参考方案7】:

它正在尝试将设置中指定的 url 与实际的 url 进行验证:

    去管理jenkins 配置系统 詹金斯网址 将网址更改为您的公共 IP 地址 保存

【讨论】:

【参考方案8】:

如果您设置了一个Referrer-Policy 标头,它会删除“referer”标头,请查看一下。 /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/ 的自测 XHR 脚本使用了那个。

【讨论】:

以上是关于为啥詹金斯抱怨我的反向代理设置被破坏了?的主要内容,如果未能解决你的问题,请参考以下文章

反向代理是不是会破坏 CDN 的地理优势?

如何在不破坏客户端和服务器之间的 https 隧道的情况下配置 apache 反向代理?

为啥我需要使用 daphne 进行反向代理?

为啥要用Nginx反向代理

apache2反向代理到docker容器403被禁止?

我用Nginx搭建了个反向代理服务器,前端服务器带宽1M后端服务器10M,为啥打来网站速度那么慢