【Knox】Knox 转发访问 Trino Web UI 返回 406 错误的原因与处理

一、问题现象:Knox 转发访问 Trino Web UI 返回 406

在 Knox 已完成接入、并通过 Knox 访问 Trino Web UI 时,点击页面链接后直接返回 406 错误:

我们的代码已经开源>>>>>TTbigdata

对应的访问地址示例如下:

text 复制代码
https://dev1:28443/ui/login.html?doAs=admin

浏览器返回的完整错误信息为:

bash 复制代码
HTTP ERROR 406 Server configuration does not allow processing of the X-Forwarded-For header
URI:	https://dev1:28443/ui/login.html?doAs=admin
STATUS:	406
MESSAGE:	Server configuration does not allow processing of the X-Forwarded-For header
Caused by:
org.eclipse.jetty.http.BadMessageException: 406: Server configuration does not allow processing of the X-Forwarded-For header
	at io.airlift.http.server.RejectForwardedRequestCustomizer.customize(RejectForwardedRequestCustomizer.java:20)
	at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:655)
	at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:416)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
	at org.eclipse.jetty.io.ssl.SslConnection$SslEndPoint.onFillable(SslConnection.java:575)
	at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:390)
	at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:150)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
	at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:480)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:443)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
	at org.eclipse.jetty.util.thread.MonitoredQueuedThreadPool$1.run(MonitoredQueuedThreadPool.java:73)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:979)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1209)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1164)
	at java.base/java.lang.Thread.run(Thread.java:1575)

后端 Jetty 日志中可看到如下异常堆栈(节选):

text 复制代码
org.eclipse.jetty.http.BadMessageException: 406:
Server configuration does not allow processing of the X-Forwarded-For header
	at io.airlift.http.server.RejectForwardedRequestCustomizer.customize

::: danger 现象特征

  • Knox 本身工作正常
  • Trino 进程未崩溃
  • 请求在 Trino Jetty 层被直接拒绝
  • 错误与 X-Forwarded-For 请求头强相关
    :::

二、问题根因:Trino 默认拒绝 Forwarded 请求头

Knox 在转发 Web UI 请求时,会自动附加标准代理请求头,包括:

  • X-Forwarded-For
  • X-Forwarded-Proto
  • X-Forwarded-Host

这是反向代理场景的标准行为

Trino 的 Web UI 是基于 Jetty(Airlift HTTP Server)实现的,

其默认安全策略是:

如果未显式开启 forwarded header 处理,则拒绝包含 X-Forwarded- 的请求*

因此在默认配置下,Trino 会在 Jetty 层直接抛出:

text 复制代码
RejectForwardedRequestCustomizer

并返回 HTTP 406。

::: tip 结论

这不是 Knox 的问题,也不是认证问题,

而是 Trino 未开启 forwarded header 支持

:::

三、Ttbigdata 发行版的处理方式(推荐)

Ttbigdata 发行版 中,该参数已经被纳入 Trino 的可配置项,只需开启即可。

3.1 配置项说明

需要启用的配置为:

text 复制代码
http-server.process-forwarded

其含义是:

允许 Trino 处理来自反向代理(如 Knox)的 X-Forwarded-* 请求头

3.2 在 Ambari / 管理界面中开启

在 Trino 的配置栏目中,找到对应配置项并设置为 true

配置完成后:

  1. 保存配置
  2. 重启 Trino 服务

3.3 验证结果

重启完成后,再次通过 Knox 访问 Trino Web UI:

页面可以正常加载,406 错误消失。

四、非 Ttbigdata 发行版的处理方式

如果使用的不是 Ttbigdata 发行版,需要从 模板与配置文件层面补齐该参数。

4.1 修改 config.properties.j2 模板

在 Trino 的 config.properties.j2 模板中追加如下内容:

新增配置:

jinja2 复制代码
http-server.process-forwarded={{ config_properties['http-server.process-forwarded'] }}

4.2 在 config.properties.xml 中声明配置项

同时,需要在 config.properties.xml 中补齐该配置定义:

用于让 Ambari / 配置系统能够感知并下发该参数。

4.3 文件下发与生效

上述两个文件:

  • config.properties.j2
  • config.properties.xml

需要放置到对应的 Trino 配置模板目录中,

具体路径与发布方式在其它章节已有详细说明,此处不再展开。

完成配置后,重启 Trino 服务即可生效。

相关推荐
FII工业富联科技服务3 分钟前
制造业AI规模化落地架构:从Task Agent到Factory Agent Brain的三级智能体演进解析
大数据·人工智能·架构
敲代码的玉米C5 分钟前
我修的那个 bug,制造了另一个 bug
前端·人工智能·架构
Zhu7588 分钟前
在docker环境部署frp
运维·docker·容器
gis开发之家14 分钟前
《Vue3 从入门到大神50篇》Vue3 源码详解(二十):生命周期钩子源码解析 —— onMounted / onUpdated 如何实现?
前端·javascript·前端框架·vue3·vue3源码
Narrastory17 分钟前
我用 Claude Code 写代码不到 2 小时,却花了 3 天做完这个软件—Vibe Coding 的正确姿势,是设计不是生成
前端·人工智能·github
Enaium18 分钟前
我实现了KMP的SDL绑定并编写了高性能软光追
前端·kotlin
chaoyuanl19 分钟前
悬空玻璃剧场源头厂家选型全解析|270°裸眼3D悬空玻璃剧场投资避坑指南
大数据·人工智能·3d·xr·娱乐·mr
古夕23 分钟前
本地正常线上白屏:一次路由切换后刷新恢复问题的排查与修复
前端·ai编程
CHENGQUAN_kenan26 分钟前
亚马逊境外店铺利润境内回流:税务规则、佛山实操与自查要点
大数据·经验分享·教育电商
栀鸢ouo29 分钟前
解决Element Plus表格展开行横向溢出、滚动截断问题(项目实战方案)
前端·vue.js