Jenkins 真好玩,到现在还沉浸在自动化测试部署的乐趣中,变着法的改 README 提交,其乐无穷,唯独有一点像粒老鼠屎一样,坏了整锅粥 —- 反向代理配置错误…

该死的反向代理有误

该死的反向代理有误

对于强迫症来说,这是绝对无法忍受的!于是乎开始查阅资料,Google 百度清一色的答案:系统管理 -> 系统配置 里的 Jenkins URL 要正确配置。然而我一开始就是配置正确的,于是开始怀疑人生了,难道…这里有玄机?改成本地地址 http://127.0.0.1:8080/ 无效,http://localhost:8080/ 无效,几经波折,最后还是选择啃文档…

最终,还是在一篇官方文档里发现了终极解决方案:

官方终极解决方案

官方终极解决方案

看到这段话,我表情是这样的:

柴犬问号脸

柴犬问号脸

只要在 apache 代理配置里加上 AllowEncodedSlashes NoDecode ,同时在 proxyPass "/" "http://127.0.0.1:8080/" 后再加上 nocanon 即可,恼人的反向代理设置有误从此不在出现。

解释一下两个配置项:

  • 官方文档说 apache mod_proxy 会规范化通过 proxyPass 限制的 URL,这个规范化可能是对 URL 格式进行一些处理,会与 Jenkins 不兼容,因此要加上 nocanon 选项,来取消规范化处理。
  • 对于 AllowEncodedSlashes,顾名思义,就是是否允许 URL 中出现编码过的斜杆符号,包括 /\ 两种。默认是关闭的,如果出现,就返回 404 错误,开启后,会先解码,然后传给后端,而 Jenkins 需要的 NoDecode 则是不解码,直接传给后端。

附上我的 apache 反向代理配置:

# 1234 是代理的端口
# 8080 是 Jenkins 的端口
<VirtualHost *:1234>
        <Proxy http://127.0.0.1:1234/*>
                Order deny,allow
                Allow from all
        </Proxy>

        ProxyPass / http://127.0.0.1:8080/ nocanon
        ProxyPassReverse / http://127.0.0.1:8080/
        AllowEncodedSlashes NoDecode
</VirtualHost>

最后,我发现 stack overflow 上其实有解决这个问题,可能是我的搜索关键词不对吧 :)