4.5. Web 服务器配置更改
4.5.1. 将 Web 子系统替换为 Undertow 复制链接链接已复制到粘贴板!
Undertow 取代 JBoss Web 作为 JBoss EAP 7 中的 Web 服务器。这意味着旧版 Web
子系统配置必须迁移到新的 JBoss EAP 7 undertow
子系统配置。
-
服务器配置文件中的
urn:jboss:domain:web:2.2
子系统配置命名空间已被urn:jboss:domain:undertow:10.0
命名空间取代。 -
EAP_HOME/modules/system/layers/base/
中的org.jboss.as.web
扩展模块已被org.wildfly.extension.undertow
扩展模块取代。
您可以使用管理 CLI migrate
操作,将 Web
子系统迁移到服务器配置文件中的 undertow
。但是,请注意,此操作无法迁移所有 JBoss Web 子系统配置。如果您看到"migration-warning"条目,则必须运行其他管理 CLI 命令将这些配置迁移到 Undertow。如需有关管理 CLI migrate
操作的更多信息,请参阅管理 CLI 迁移操作。
以下是 JBoss EAP 6.4 中默认 Web
子系统配置的示例:
以下是 JBoss EAP 7.4 中默认 undertow
子系统配置的示例:
4.5.2. 迁移 JBoss Web 重写条件 复制链接链接已复制到粘贴板!
管理 CLI migrate
操作无法自动迁移重写条件。它们报告为"迁移警告",您必须手动迁移。您可以使用 Undertow Predicates Attributes and Handlers 在 JBoss EAP 7 中创建等效的配置。
以下是包含 rewrite
配置的 JBoss EAP 6 中的 web
子系统配置示例:
按照 管理 CLI 迁移操作 说明启动您的服务器和管理 CLI,然后使用以下命令迁移 web
子系统配置文件:
/subsystem=web:migrate
/subsystem=web:migrate
当您在上述配置上运行 web
操作时,将报告以下"migration-warnings"。
检查服务器配置文件,并且您看到 undertow
子系统的以下配置:
重写配置已被丢弃。
使用管理 CLI 创建过滤器,以取代 undertow
子系统中的重写配置。对于每个命令,您应该可以看到 "{"outcome" SAS "success"}"。
检查更新的服务器配置文件。JBoss Web 子系统现已完全在 undertow
子系统中进行迁移和配置。
有关如何使用管理 CLI 配置过滤器和处理程序的更多信息,请参阅 JBoss EAP 7 配置指南中的配置 Web 服务器。
4.5.3. 迁移 JBoss Web 系统属性 复制链接链接已复制到粘贴板!
在之前的 JBoss EAP 版本中,系统属性可用于修改默认的 JBoss Web 行为。有关如何在 Undertow 中配置相同行为的详情,请查看 JBoss Web 系统属性迁移参考
4.5.4. 更新 Access Log Header Pattern 复制链接链接已复制到粘贴板!
从 JBoss EAP 6.4 迁移到 JBoss EAP 7 时,您可能会发现访问日志不再编写预期的"Referer"和"User-agent"值。这是因为 JBoss EAP 6.4 中包含的 JBoss Web 使用 access-log
中的 %{headername}i
模式来记录传入的标头。
示例:访问 JBoss EAP 6.4 中的日志格式
<access-log pattern="%h %l %u %t "%T sec" "%r" %s %b "%{Referer}i" "%{User-agent}i""/>
<access-log pattern="%h %l %u %t "%T sec" "%r" %s %b "%{Referer}i" "%{User-agent}i""/>
随着在 JBoss EAP 7 中使用 Undertow 的更改,传入标头的模式已更改为 %{i,headername}
。
示例:JBoss EAP 7 中的访问格式标头
<access-log pattern="%h %l %u %t "%T sec" "%r" %s %b "%{i,Referer}" "%{i,User-Agent}""/>
<access-log pattern="%h %l %u %t "%T sec" "%r" %s %b "%{i,Referer}" "%{i,User-Agent}""/>
4.5.5. 迁移 Global Valves 复制链接链接已复制到粘贴板!
以前 JBoss EAP 版本支持的 valves。valves 是插入到应用的请求处理管道中的自定义类,在 servlet 过滤器之前插入,以更改请求或执行其他处理。
- 全局 valves 会被插入到所有部署的应用的请求处理管道中,并在服务器配置文件中配置。
- 身份验证器 valves 验证请求的凭据。
-
通过扩展
org.apache.catalina.valves.ValveBase
类并配置在jboss-web.xml
描述符文件的<valve>
元素中创建自定义应用程序 valves。这些 valve 必须手动迁移。
本节论述了如何迁移全局 valves。本指南的迁移自定义应用程序 Valves 一节介绍了自定义和验证器的迁移。
Undertow(在 JBoss EAP 7 中取代 JBoss Web)不支持全局 valves;但是,您应该能够通过使用 Undertow 处理程序来实现类似的功能。Undertow 包含多个提供常见功能的内置处理程序:它还提供创建自定义处理程序的功能,可用于取代自定义 valve 功能。
如果您的应用使用 valves,则必须将它们替换为适当的 Undertow 处理程序代码,以便在迁移到 JBoss EAP 7 时获得相同的功能。
如需有关如何配置处理程序的更多信息,请参阅 JBoss EAP 7 配置指南中的配置处理程序。
如需有关如何配置过滤器的更多信息,请参阅 JBoss EAP 7 配置指南中的配置过滤器。
迁移 JBoss Web Valves
下表列出了 JBoss EAP 之前版本中 JBoss Web 提供的 valves,以及对应的 Undertow 内置处理程序:JBoss Web valves 位于 org.apache.catalina.valves
包中。
Valve | 处理程序 |
---|---|
AccessLogValve | io.undertow.server.handlers.accesslog.AccessLogHandler |
CrawlerSessionManagerValve | io.undertow.servlet.handlers.CrawlerSessionManagerHandler |
ExtendedAccessLogValve | io.undertow.server.handlers.accesslog.AccessLogHandler |
JDBCAccessLogValve |
相关说明请查看下面的 |
RemoteAddrValve | io.undertow.server.handlers.IPAddressAccessControlHandler |
RemoteHostValve | io.undertow.server.handlers.AccessControlListHandler |
RemoteIpValve | io.undertow.server.handlers.ProxyPeerAddressHandler |
RequestDumperValve | io.undertow.server.handlers.RequestDumpingHandler |
RewriteValve | 有关手动迁移这些 valve 的说明,请参阅迁移 JBoss Web 重写条件。 |
StuckThreadDetectionValve | io.undertow.server.handlers.StuckThreadDetectionHandler |
您可以使用管理 CLI migrate
操作自动迁移满足以下条件的全局 valves:
- 它们仅限于上表中列出的 valve,不需要手动处理。
-
它们必须在服务器配置文件的
Web
子系统中定义。
如需有关管理 CLI migrate
操作的更多信息,请参阅管理 CLI 迁移操作。
JDBCAccessLogValve 手工迁移过程
org.apache.catalina.valves.JDBCAccessLogValve
valve 是规则的例外,无法自动迁移到 io.undertow.server.handlers.JDBCLogHandler
。按照以下步骤迁移以下示例 valve。
- 为数据库创建一个驱动程序模块,它将存储日志条目。
配置数据库的数据源,并将驱动程序添加到
datasources
子系统中可用驱动程序的列表中。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
undertow
子系统中,使用以下表达式配置expression-filter
:jdbc-access-log(datasource=DATASOURCE_JNDI_NAME)
。<filters> <expression-filter name="jdbc-access" expression="jdbc-access-log(datasource='java:jboss/datasources/accessLogDS')" /> ... </filters>
<filters> <expression-filter name="jdbc-access" expression="jdbc-access-log(datasource='java:jboss/datasources/accessLogDS')" /> ... </filters>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.5.6. Set-Cookie 行为的变化 复制链接链接已复制到粘贴板!
Set-Cookie
HTTP 响应标头语法之前的说明,如 RFC2109 和 RFC2965,当 Cookie 值引用时,允许使用 cookie 值中的空格和其他分隔符字符。JBoss EAP 6.4 中的 JBoss Web 符合前面的规格,并在包含任何分隔符字符时自动引用 Cookie 值。
Set-Cookie
HTTP 响应标头语法的 RFC6265 规范指出 Set-Cookie
响应标头中的 Cookie 值必须符合特定的 grammar 约束。例如,它们必须是 US-ASCII 字符,但它们不能包含 CTRL(controls)、空格、双引号、逗号、分号或反斜杠字符。
在 JBoss EAP 7.0 中,在累积补丁 Red Hat JBoss Enterprise Application Platform 7.0 Update 08 之前,Undertow 不会限制这些无效字符,也不会引用包含排除字符的 Cookie。如果应用此累积补丁或较新的累积补丁,您可以通过将 io.undertow.cookie.DEFAULT_ENABLE_RFC6265_COOKIE_VALIDATION
系统属性设置为 true
来启用 RFC6265 兼容 Cookie 验证。
从 JBoss EAP 7.1 开始,默认情况下 Undertow 不启用 RFC6265 兼容 Cookie 验证。它确实会引用包含排除字符的 Cookie。从 JBoss EAP 7.1 开始,您无法使用 io.undertow.cookie.DEFAULT_ENABLE_RFC6265_COOKIE_VALIDATION
系统属性,以启用 RFC6265 兼容 Cookie 验证。相反,您可以通过将 rfc6265-cookie-validation
侦听器属性设置为 true
来为 HTTP、HTTPS 或 AJP 侦听器启用 RFC6265 兼容 Cookie 验证。此属性的默认值为 false
。以下示例为 HTTP 侦听器启用 RFC6265 兼容 Cookie 验证。
/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=rfc6265-cookie-validation,value=true)
/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=rfc6265-cookie-validation,value=true)
4.5.7. 更改 HTTP 方法调用行为 复制链接链接已复制到粘贴板!
JBoss EAP 6.4(包括 JBoss Web 作为 Web 服务器)默认允许 HTTP TRACE
方法调用。
Undertow(替换 JBoss Web 作为 JBoss EAP 7 中的 Web 服务器)默认不允许 HTTP TRACE
方法调用。此设置使用 undertow
子系统中 http-listener
元素的 disallowed-methods
属性进行配置。可以通过查看以下 read-resource
命令的输出来确认这一点。注意 disallowed-methods
属性的值为 ["TRACE"]
。
若要在 JBoss EAP 7 及更高版本中启用 HTTP TRACE
方法调用,您必须运行以下命令,从 disallowed-methods
属性列表中删除"TRACE"条目:
/subsystem=undertow/server=default-server/http-listener=default:list-remove(name=disallowed-methods,value="TRACE")
/subsystem=undertow/server=default-server/http-listener=default:list-remove(name=disallowed-methods,value="TRACE")
当再次运行 read-resource
命令时,您会注意到 TRACE
方法调用不再在禁止的方法列表中。
如需有关 HTTP 方法默认行为的更多信息,请参阅 JBoss EAP 配置指南中的 HTTP 方法默认行为。
4.5.8. 默认 Web 模块行为的更改 复制链接链接已复制到粘贴板!
在 JBoss EAP 7.0 中,mod_cluster 中默认禁用了 Web 应用的根上下文。
自 JBoss EAP 7.1 起,情况已不再如此。如果您希望禁用根上下文,这可能会造成意外的后果。例如,可以将请求错误路由到不合要求的节点,或者不应公开的私有应用可以通过公共代理意外访问。Undertow 位置现在会自动注册到 mod_cluster 负载平衡器,除非被明确排除。
使用以下管理 CLI 命令,将 ROOT 从 modcluster
子系统配置中排除:
/subsystem=modcluster/mod-cluster-config=configuration:write-attribute(name=excluded-contexts,value=ROOT)
/subsystem=modcluster/mod-cluster-config=configuration:write-attribute(name=excluded-contexts,value=ROOT)
使用以下管理 CLI 命令,禁用默认的欢迎 Web 应用:
/subsystem=undertow/server=default-server/host=default-host/location=\/:remove /subsystem=undertow/configuration=handler/file=welcome-content:remove reload
/subsystem=undertow/server=default-server/host=default-host/location=\/:remove
/subsystem=undertow/configuration=handler/file=welcome-content:remove
reload
有关如何配置默认欢迎 Web 应用程序的更多信息,请参阅 JBoss EAP 开发指南中的配置默认欢迎 Web 应用。
4.5.9. Undertow 子系统默认配置的更改 复制链接链接已复制到粘贴板!
在 JBoss EAP 7.2 之前,默认的 undertow
子系统配置包含两个响应标头过滤器,它们附加至 default-host
各个 HTTP 响应中。
-
Server
,设置为JBoss-EAP/7
。 -
X-Powered-By
,设置为Undertow/1
。
这些响应标头过滤器已从默认的 JBoss EAP 7.2 配置中删除,以防止意外泄漏有关正在使用的服务器的信息。
以下是 JBoss EAP 7.1 中默认 undertow
子系统配置的示例。
以下是 JBoss EAP 7.4 中新默认 undertow
子系统配置的示例: