为啥詹金斯抱怨我的反向代理设置被破坏了?
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 文件的 <arguments>
部分中设置的端口值匹配。
【讨论】:
谢谢乔希,我是通过本地主机而不是普通名称访问我的。他们真的应该为这条消息添加一个例外到 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"
这让它不再抱怨了。
【讨论】:
这也为我解决了问题。谢谢。 是的,明白了。对于 nginxproxy_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 Host
或 VirtualHost
添加以下行:
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 脚本使用了那个。
【讨论】:
以上是关于为啥詹金斯抱怨我的反向代理设置被破坏了?的主要内容,如果未能解决你的问题,请参考以下文章