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;