Apache Knox 2.1.0 配置参数详解
Apache Knox 2.1.0 配置参数详解:gateway-site.xml 全量参数分类(网关服务/拓扑提供者/LDAP 认证/日志)、topology XML 结构与 ShiroProvider/AclsAuthz/SSOCookieProvider 参数、knox-env.sh JVM 内存、生产拓扑模板与排障 FAQ
Apache Knox 2.1.0 配置参数详解
目标:系统梳理 Apache Knox Gateway 2.1.0 的配置体系——gateway-site.xml 网关服务参数、topology 拓扑 XML 与提供者(ShiroProvider 认证、AclsAuthz 授权、SSOCookieProvider 联合登录、WebAppSec)、演示 LDAP 与用户数据(users.ldif)、knox-env.sh JVM 内存参数、日志配置,并给出可直接落地的生产拓扑模板。已在 Ubuntu 22.04.5 + OpenJDK 1.8.0_504 + Knox 2.1.0(/opt/knox)实测环境整理,默认值均取自实测安装的配置文件。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Java:OpenJDK 1.8.0_504
- Apache Knox:2.1.0(hash
57793d31b8234863b242f766b8861c2023cbd72d) - 安装目录:/opt/knox;配置目录 /opt/knox/conf;数据目录 /opt/knox/data
- 实测网关端口 8443、演示 LDAP 端口 33389
- 默认拓扑:admin、manager、knoxsso、homepage、metadata、sandbox(共 6 个,
knoxcli.sh list-topologies实测列出)
二、前置条件
- 已按《Ubuntu 22.04 安装 Apache Knox 2.1.0 指南》完成安装并启动网关(参数修改验证需要运行中的 Knox)。
- 熟悉 XML 基本语法;理解 Knox 的「拓扑 = 提供者链 + 服务集群定义」模型。
三、参数查看与修改方式
| 层次 | 文件/位置 | 查看与修改方式 |
|---|---|---|
| 网关全局 | /opt/knox/conf/gateway-site.xml | 编辑 <property><name>…</name><value>…</value></property>,改后重启网关(部分参数支持热生效) |
| JVM/环境 | /opt/knox/bin/knox-env.sh | export KNOX_GATEWAY_MEM_OPTS 等变量,改后重启网关 |
| 拓扑 | /opt/knox/conf/topologies/*.xml | 保存后 Knox 自动监测目录并重新部署(实测日志出现 monitoring/redeploy),无需重启 |
| 共享提供者 | /opt/knox/conf/shared-providers/*.json | 供 descriptors 引用的提供者模板(default-providers.json 实测内含 ShiroProvider 模板) |
| 简化描述符 | /opt/knox/conf/descriptors/*.json | 简化版拓扑描述(服务发现场景),与 topologies/ 二选一 |
| 演示用户 | /opt/knox/conf/users.ldif | 演示 LDAP 启动时加载,改后重启 LDAP(ldap.sh stop/start) |
| 日志 | /opt/knox/conf/gateway-log4j2.xml | Log4j2 配置,改后重启网关 |
修改后验证:
/opt/knox/bin/knoxcli.sh validate-topology --cluster sandbox # 拓扑语法校验
/opt/knox/bin/knoxcli.sh redeploy --cluster sandbox # 手工触发重新部署(成功无输出,返回码 0)
实测校验回显:
/opt/knox/conf/topologies/sandbox.xml
==========================================
Topology file validated successfully
四、参数总览
Knox 配置分四个层次,优先级从高到低:拓扑 XML 内联提供者 > 共享提供者 JSON(被描述符引用)> gateway-site.xml 网关全局 > 代码内置默认(gateway-default.xml,随 jar 分发)。实测 gateway-site.xml 中的参数分组:
| 分组 | 代表参数 | 数量(实测默认文件) |
|---|---|---|
| 网络与服务 | gateway.port、gateway.path、gateway.gateway.conf.dir | 3 |
| Kerberos | gateway.hadoop.kerberos.secured、java.security.krb5.conf 等 | 4 |
| WebSocket/WebShell | gateway.websocket.feature.enabled、gateway.webshell.* | 6 |
| Cookie/首页 | gateway.scope.cookies.feature.enabled、knox.homepage.logout.enabled | 2 |
| 集群配置监测 | gateway.cluster.config.monitor.ambari.* | 2 |
| Token 管理 | gateway.knox.token.* | 3 |
| 管理员与组 | gateway.knox.admin.groups、gateway.group.config.*(LDAP 组映射) | 10 |
| 调度白名单 | gateway.dispatch.whitelist(.services) | 2 |
| 其他 | gateway.service.alias.impl、gateway.application.path.alias.token-generation、gateway.xforwarded.* | 3 |
五、核心参数分类详解
5.1 网关服务参数(gateway-site.xml)
| 参数 | 实测默认值 | 说明与调优建议 |
|---|---|---|
| gateway.port | 8443 | 网关 HTTPS 监听端口;改为 443 需 root 或配置端口转发 |
| gateway.path | gateway | 上下文路径,访问形如 https://host:8443/gateway/sandbox/webhdfs/v1/…(sandbox 换成对应拓扑名);可改为空串实现根路径挂载 |
| gateway.gateway.conf.dir | deployments | 拓扑部署物目录(相对 data 目录),部署后的 war 存于 data/deployments |
| gateway.hadoop.kerberos.secured | false | 后端集群启用 Kerberos 时改 true,并配置 krb5.conf(见下) |
| java.security.krb5.conf | /etc/knox/conf/krb5.conf | Kerberos 配置文件绝对路径 |
| java.security.auth.login.config | /etc/knox/conf/krb5JAASLogin.conf | JAAS 登录配置绝对路径 |
| gateway.websocket.feature.enabled | false | WebSocket 透传(Zeppelin/Livy UI 需要);webshell 依赖此项开启 |
| gateway.scope.cookies.feature.enabled | false | 按拓扑隔离 Cookie 作用域,多拓扑防串用建议开启 |
| gateway.cluster.config.monitor.ambari.enabled | false | Ambari/Cloudera Manager 集群配置自动监测开关 |
| gateway.cluster.config.monitor.ambari.interval | 60 | 监测轮询间隔(秒) |
| gateway.service.alias.impl | org.apache.knox.gateway.services.security.impl.RemoteAliasService | 别名服务实现;接 ZooKeeper 远程别名时保留,单机可用默认本地实现 |
| knox.homepage.logout.enabled | true | Knox 首页是否显示登出 |
| gateway.knox.token.management.users.can.see.all.tokens | admin | 可在 Token 管理页查看所有 token 的用户名列表 |
| gateway.knox.token.eviction.grace.period | 0 | token 过期后状态保留宽限期(秒),仅 server-managed 模式生效 |
| gateway.application.path.alias.token-generation | tokengen | token 生成应用路径别名 |
| gateway.knox.admin.groups | admin | Knox 管理员组;manager/admin 拓扑的 ACL 以此判定 |
| gateway.dispatch.whitelist.services | DATANODE,HBASEUI,HDFSUI,JOBHISTORYUI,NODEUI,YARNUI,knoxauth | 应用重定向白名单的服务角色范围 |
| gateway.dispatch.whitelist | ^https?://(localhost|127.0.0.1|0:0:0:0:0:0:0:1|::1):[0-9].*$ | 白名单正则;生产改为后端主机域名列表,否则 UI 跳转被拒 |
| gateway.xforwarded.header.context.append.servicename | LIVYSERVER | 对列表内服务在 X-Forwarded-Context 追加服务名 |
JVM 内存参数(/opt/knox/bin/knox-env.sh,实测默认全部注释,本文改为网关 256–512MB):
| 变量 | 作用对象 | 实测取值 |
|---|---|---|
| KNOX_GATEWAY_MEM_OPTS | 网关 JVM | -Xms256m -Xmx512m |
| KNOX_LDAP_MEM_OPTS | 演示 LDAP JVM | 空(默认) |
| KNOX_CLI_MEM_OPTS | knoxcli JVM | 空(默认) |
| KNOX_GATEWAY_PID_DIR | PID 文件目录 | 默认 {GATEWAY_HOME}/pids |
| KNOX_GATEWAY_LOG_DIR | 网关日志目录 | 默认 {GATEWAY_HOME}/logs |
生效验证(实测回显,jps -v):
4662 gateway.jar -Xms256m -Xmx512m -Djava.library.path=/opt/knox/ext/native
5.2 拓扑 XML 与提供者参数
拓扑文件位于 /opt/knox/conf/topologies/<名称>.xml,结构为 <topology><gateway><provider>…</provider></gateway><service>…</service></topology>。提供者按 role 顺序执行:webappsec → federation/authentication → identity-assertion → authorization → hostmap。
认证:ShiroProvider(Basic 认证 + LDAP,admin/sandbox 拓扑实测配置)
| 参数 | 实测值 | 说明 |
|---|---|---|
| sessionTimeout | 30 | 会话空闲超时(分钟) |
| main.ldapRealm | org.apache.knox.gateway.shirorealm.KnoxLdapRealm | LDAP 认证 Realm 实现类 |
| main.ldapRealm.userDnTemplate | uid={0},ou=people,dc=hadoop,dc=apache,dc=org | 用户 DN 模板,{0} 为登录名 |
| main.ldapRealm.contextFactory.url | ldap://localhost:33389 | LDAP 服务地址(生产改企业 LDAP/AD) |
| main.ldapRealm.contextFactory.authenticationMechanism | simple | 绑定方式 |
| urls./** | authcBasic | 全路径启用 Basic 认证(可按路径配 authc 表单等) |
授权:AclsAuthz
| 参数 | 实测值 | 说明 |
|---|---|---|
| knox.acl | admin;; | 分号分隔的 user;group;ip ACL,* 为任意 |
| knox.acl.mode | OR(manager 拓扑实测) | 多条 ACL 间的组合模式 |
manager 拓扑(Knox 管理台)实测使用 knox.acl = KNOX_ADMIN_USERS;KNOX_ADMIN_GROUPS;*,即授信 Knox 管理员用户/组(对应 gateway.knox.admin.groups=admin)。
联合登录:SSOCookieProvider(manager 拓扑实测)
| 参数 | 实测值 | 说明 |
|---|---|---|
| knox.token.exp.server-managed | false | KnoxSSO cookie 校验是否用服务端管理 token 状态(2.1.0 新增参数) |
配套的 knoxsso 拓扑提供表单登录(knoxauth 应用),实测访问 /gateway/manager/admin/api/v1/version 未登录时 302 跳转:
302 redirect:https://localhost:8443/gateway/knoxsso/api/v1/websso?originalUrl=https://localhost:8443/gateway/manager/admin/api/v1/version
WebAppSec(manager 拓扑实测):csrf.enabled=true(csrf.customHeader=X-XSRF-Header,GET/OPTIONS/HEAD 免校验)、xframe.options.enabled=true、xss.protection.enabled=true、strict.transport.enabled=false。
身份断言:HadoopGroupProvider(manager 拓扑实测):CENTRAL_GROUP_CONFIG_PREFIX=gateway.group.config.,将组映射配置集中到 gateway-site(见 5.3)。
服务定义(<service> 段):role 指定服务类型,url 指定后端地址。sandbox 拓扑实测片段:
<service>
<role>WEBHDFS</role>
<url>http://localhost:50070/webhdfs</url>
</service>
经网关访问 https://host:8443/gateway/sandbox/webhdfs/v1/?op=LISTSTATUS 时,Knox 改写 URL、附加 user.name 身份参数后转发(审计日志实测:dispatch|uri|http://localhost:50070/webhdfs/v1/?op=LISTSTATUS&user.name=admin|success|Response status: 200)。
5.3 演示 LDAP 与组映射参数
gateway-site.xml 实测内含 HadoopGroupProvider 的中央组映射配置(前缀 gateway.group.config.):
| 参数 | 实测值 |
|---|---|
| gateway.group.config.hadoop.security.group.mapping | org.apache.hadoop.security.LdapGroupsMapping |
| gateway.group.config.hadoop.security.group.mapping.ldap.bind.user | uid=guest,ou=people,dc=hadoop,dc=apache,dc=org |
| gateway.group.config.hadoop.security.group.mapping.ldap.bind.password | guest-password |
| gateway.group.config.hadoop.security.group.mapping.ldap.url | ldap://localhost:33389 |
| gateway.group.config.hadoop.security.group.mapping.ldap.search.filter.user | (&(|(objectclass=person)(objectclass=applicationProcess))(cn={0})) |
| gateway.group.config.hadoop.security.group.mapping.ldap.search.filter.group | (objectclass=groupOfNames) |
| gateway.group.config.hadoop.security.group.mapping.ldap.search.attr.member | member |
| gateway.group.config.hadoop.security.group.mapping.ldap.search.attr.group.name | cn |
演示用户数据(/opt/knox/conf/users.ldif 实测结构):people 分支下 guest/sam/tom/admin 四个用户,groups 分支下 analyst(sam、tom)、scientist(sam)、admin(admin)三组。认证与组的组合决定 AclsAuthz 与 manager 拓扑的访问权。
⚠️ 注意:ldap.bind.password 在默认文件中为明文,生产环境应改用凭据别名(
knoxcli.sh create-alias存入 jceks,配置里引用${alias=…}形式)。
5.4 日志配置
- /opt/knox/conf/gateway-log4j2.xml:网关 Log4j2 配置,滚动日志输出到 /opt/knox/logs/gateway.log;审计独立于 gateway-audit.log。
- /opt/knox/logs 实测文件:gateway.log(运行日志)、gateway-audit.log(访问审计)、gateway.err/gateway.out(stdout/stderr)、ldap.log/ldap.err/ldap.out(演示 LDAP)、knoxcli.log(CLI 操作)。
- 审计日志字段(实测样例行):
时间 ||请求ID|audit|来源IP|服务角色|用户|||动作|uri|结果|详情,排障时先看 access/dispatch 两类记录定位认证与转发环节。
六、生产配置模板
适用场景:8–16GB 内存服务器、SSD 磁盘、为企业 LDAP 后端 + WebHDFS/YARN UI 提供网关入口,网关 JVM 限 256–512MB 堆。
/opt/knox/conf/gateway-site.xml 生产关键项(在默认文件基础上修改):
<configuration>
<property><name>gateway.port</name><value>8443</value></property>
<property><name>gateway.path</name><value>gateway</value></property>
<property><name>gateway.websocket.feature.enabled</name><value>true</value></property>
<property><name>gateway.scope.cookies.feature.enabled</name><value>true</value></property>
<property><name>gateway.knox.admin.groups</name><value>knox-admin</value></property>
<property><name>gateway.dispatch.whitelist</name><value>^https?:\/\/(nn\.hadoop\.example\.com|rm\.hadoop\.example\.com):[0-9]{1,5}$</value></property>
</configuration>
/opt/knox/conf/topologies/production.xml(企业 LDAP + Basic 认证 + ACL + WebHDFS/YARN UI 模板):
<topology>
<name>production</name>
<gateway>
<provider>
<role>authentication</role>
<name>ShiroProvider</name>
<enabled>true</enabled>
<param><name>sessionTimeout</name><value>30</value></param>
<param><name>main.ldapRealm</name><value>org.apache.knox.gateway.shirorealm.KnoxLdapRealm</value></param>
<param><name>main.ldapRealm.userDnTemplate</name><value>uid={0},ou=people,dc=example,dc=com</value></param>
<param><name>main.ldapRealm.contextFactory.url</name><value>ldap://ldap.example.com:389</value></param>
<param><name>main.ldapRealm.contextFactory.authenticationMechanism</name><value>simple</value></param>
<param><name>urls./**</name><value>authcBasic</value></param>
</provider>
<provider>
<role>authorization</role>
<name>AclsAuthz</name>
<enabled>true</enabled>
<param><name>knox.acl</name><value>hdfs-users;hadoop-users;10.0.0.0/24</value></param>
</provider>
<provider>
<role>identity-assertion</role>
<name>Default</name>
<enabled>true</enabled>
</provider>
<provider>
<role>hostmap</role>
<name>static</name>
<enabled>true</enabled>
<param><name>localhost</name><value>nn.hadoop.example.com</value></param>
</provider>
</gateway>
<service>
<role>WEBHDFS</role>
<url>http://nn.hadoop.example.com:50070/webhdfs</url>
</service>
<service>
<role>RESOURCEMANAGER</role>
<url>http://rm.hadoop.example.com:8088/ws</url>
</service>
</topology>
落地与验证:
/opt/knox/bin/knoxcli.sh validate-topology --path /opt/knox/conf/topologies/production.xml
/opt/knox/bin/knoxcli.sh list-topologies
curl -s -k -u admin:q1w2e3r4 "https://localhost:8443/gateway/production/webhdfs/v1/?op=LISTSTATUS"
# 账号取能通过该拓扑认证的用户;演示目录实测 admin/q1w2e3r4,企业 LDAP 换实际账号
内存与磁盘标注:网关 JVM -Xms256m -Xmx512m(小流量网关足够,>500 QPS 建议 1–2GB 并同步调大 KNOX_GATEWAY_MEM_OPTS);data/deployments 随拓扑数增长,SSD 保留 5GB 空余;日志按 gateway-log4j2.xml 滚动策略预留 10GB。
七、常见问题
Q1:修改 gateway-site.xml 后端口没变?
A:gateway.port 属启动期参数,需 gateway.sh stop/start 重启网关生效;topologies/*.xml 才是保存即自动重部署。
Q2:拓扑部署失败或服务 503?
A:先校验语法 knoxcli.sh validate-topology --cluster sandbox,再看 data/deployments/sandbox.topo.16fcdcdcfd8(实测部署目录名,末尾 hash 随拓扑内容变化) 是否生成;后端地址不可达时网关本身仍正常,转发才报错——用审计日志的 dispatch 行区分网关问题与后端问题。
Q3:LDAP 认证一直失败(401)?
A:逐项核对 ShiroProvider 的 contextFactory.url 可达性(curl telnet://ldap-host:389 或 nc -zv)、userDnTemplate 与目录结构是否匹配;用 knoxcli.sh user-auth-test --cluster admin --u admin --p q1w2e3r4 复现,密码错误实测输出 [LDAP: error code 49 - INVALID_CREDENTIALS: Bind failed: ERR_229 ...]。
Q4:UI 类服务跳转被拒或白页? A:gateway.dispatch.whitelist 默认只放行 localhost,生产必须加入后端主机域名;同时浏览器经网关访问 UI 需要时钟同步与 Cookie 作用域配置正确。
Q5:如何把明文密码改成别名引用?
A:knoxcli.sh create-alias ldap.bind.password --cluster sandbox --value hdfsP4ss(实测示例值) 后,将配置值改为 ${alias=ldap.bind.password} 形式;凭据存于 data/security/keystores 下对应拓扑 jceks。
八、参考链接
- 2.1.x 用户手册(Gateway Details/Configuration 章节):https://knox.apache.org/books/knox-2-1-0/user-guide.html
- 官方默认 gateway-site.xml 参考:Knox 2.1.0 安装包 conf/gateway-site.xml(本文默认值来源)
- Knox 官网:https://knox.apache.org/