编辑此页面

HTTP 参考

本文档阐明了 Quarkus 中可用的不同 HTTP 功能。

Eclipse Vert.x 提供了基本的 HTTP 层。对于 Servlet 支持,Quarkus 采用定制的 Undertow 版本,该版本在 Vert.x 之上运行,而 Jakarta REST 支持则通过 RESTEasy 提供。

当 Undertow 存在时,RESTEasy 作为 Servlet 过滤器运行。如果 Undertow 不存在,RESTEasy 将直接在 Vert.x 上运行,而不涉及 Servlet。

1. 提供静态资源

如果您希望使用 Quarkus 构建 Web 应用程序,请参阅 Quarkus for the Web 指南。

1.1. 从应用程序 jar

要从应用程序 jar 提供静态资源,您必须将它们放置在应用程序的 META-INF/resources 目录中。选择此位置是因为它是 Servlet 规范定义的 jar 文件中资源的标准位置。即使 Quarkus 可以在没有 Servlet 的情况下使用,遵循此约定也能使将资源放置在此位置的现有代码正常运行。

1.2. 从 Web 依赖项(如 webjars 或 mvnpm)

请参阅 Web 依赖项定位器 指南,了解有关如何使用 WebJarsmvnpmimportmaps 的详细信息。

1.3. 从本地目录

可以通过在 Vert.x 路由器中安装额外的路由来从本地目录提供静态资源。

例如,要从相对于当前路径的 static/ 目录在 https://:8080/static/ 上提供资源,您可以安装以下路由

package org.acme;

import io.quarkus.runtime.StartupEvent;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.StaticHandler;
import jakarta.enterprise.event.Observes;


public class StaticResources {

    void installRoute(@Observes StartupEvent startupEvent, Router router) {
        router.route()
                .path("/static/*")
                .handler(StaticHandler.create("static/"));
    }
}

1.4. HTTP 压缩

默认情况下,静态资源的响应正文不会被压缩。您可以通过 quarkus.http.enable-compression=true 来启用 HTTP 压缩支持。如果启用了压缩支持,则如果从资源的文件名派生的 Content-Type 标头是压缩媒体类型(通过 quarkus.http.compress-media-types 配置),则响应正文将被压缩。

默认情况下,以下媒体类型列表会被压缩:text/htmltext/plaintext/xmltext/csstext/javascriptapplication/javascriptapplication/jsonapplication/graphql+jsonapplication/xhtml+xml
如果客户端未在请求标头中指示其对 HTTP 压缩的支持,例如 Accept-Encoding: deflate, gzip, br,则响应正文不会被压缩。
默认情况下,Brotli 压缩不可用。您可以通过设置 quarkus.http.compressors=deflate,gzip,br 来启用它。在构建本机镜像的情况下,它会为您的可执行文件增加约 1MB 的大小。

1.5. 其他配置

此外,静态资源的索引页面可以从默认的 index.html 更改,隐藏文件(例如点文件)可以指示为不提供服务,范围请求可以禁用,并且可以配置缓存支持(例如缓存标头和文件属性缓存)。

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

设置提供静态资源时的索引页面。

环境变量:QUARKUS_HTTP_STATIC_RESOURCES_INDEX_PAGE

显示更多

字符串

index.html

设置是否应提供隐藏文件。

环境变量:QUARKUS_HTTP_STATIC_RESOURCES_INCLUDE_HIDDEN

显示更多

布尔值

true

设置是否应启用范围请求(可恢复下载;媒体流)。

环境变量:QUARKUS_HTTP_STATIC_RESOURCES_ENABLE_RANGE_SUPPORT

显示更多

布尔值

true

设置是否启用缓存处理。

环境变量:QUARKUS_HTTP_STATIC_RESOURCES_CACHING_ENABLED

显示更多

布尔值

true

设置缓存条目超时时间。默认值为 30 秒。

环境变量:QUARKUS_HTTP_STATIC_RESOURCES_CACHE_ENTRY_TIMEOUT

显示更多

Duration 

30S

设置缓存标头中最大期限的值。默认值为 24 小时。

环境变量:QUARKUS_HTTP_STATIC_RESOURCES_MAX_AGE

显示更多

Duration 

24H

设置最大缓存大小。

环境变量:QUARKUS_HTTP_STATIC_RESOURCES_MAX_CACHE_SIZE

显示更多

整数

10000

文本相关文件的内容编码

环境变量:QUARKUS_HTTP_STATIC_RESOURCES_CONTENT_ENCODING

显示更多

字符集

UTF-8

关于 Duration 格式

要编写持续时间值,请使用标准 java.time.Duration 格式。 有关更多信息,请参见 Duration#parse() Java API 文档

您还可以使用简化的格式,以数字开头

  • 如果该值仅为一个数字,则表示以秒为单位的时间。

  • 如果该值是一个数字后跟 ms,则表示以毫秒为单位的时间。

在其他情况下,简化格式将被转换为 java.time.Duration 格式以进行解析

  • 如果该值是一个数字后跟 hms,则在其前面加上 PT

  • 如果该值是一个数字后跟 d,则在其前面加上 P

2. 配置上下文路径

默认情况下,Quarkus 将从根上下文下提供内容。 如果您想更改此设置,可以使用 quarkus.http.root-path 配置键来设置上下文路径。

如果您正在使用 Servlet,则可以通过 quarkus.servlet.context-path 控制 Servlet 上下文路径。 此项是相对于上面的 http 根目录的,并且仅影响 Servlet 和在 Servlet 之上运行的内容。 大多数应用程序将希望使用 HTTP 根目录,因为它会影响 Quarkus 提供的所有内容。

如果两者都指定,则所有非 Servlet Web 端点都将相对于 quarkus.http.root-path,而 Servlet 将相对于 {quarkus.http.root-path}/{quarkus.servlet.context-path} 提供服务。

如果 REST Assured 用于测试并且设置了 quarkus.http.root-path,则 Quarkus 将自动配置基本 URL 以在 Quarkus 测试中使用,因此测试 URL 不应包含根路径。

通常,Web 内容的路径配置是相对于 quarkus.http.root-path(默认为 /)解释的。

  • 要在该上下文根目录中指定路径,请使用不以正斜杠开头的相对路径。

  • 如果您要显式指定 URI,使其始终与 quarkus.http.root-path 的值无关,请使用以正斜杠开头的绝对路径。

例如,如果扩展程序配置了 service 路径,则该端点将从 ${quarkus.http.root-path}/service 提供服务。 如果您将该路径的配置更改为 /service,则该端点将从 /service 提供服务。

Quarkus 中的路径解析 博客文章进一步解释了用户和扩展程序定义的路径的路径解析如何工作。

管理界面

quarkus.http.root-path 仅用于主 HTTP 服务器。 如果您启用了管理界面(使用 quarkus.management.enabled=true 属性),则可以使用以下命令配置管理界面的根路径:quarkus.management.root-path

有关更多信息,请参阅管理界面参考

3. 支持使用 TLS/SSL 的安全连接

要使 Quarkus 支持安全连接,您必须提供证书和关联的密钥文件,或提供密钥库。

在这两种情况下,都必须提供密码。 有关如何提供的详细说明,请参见指定段落。

要启用对本机可执行文件的 TLS/SSL 支持,请参阅我们的 使用 SSL 与本机可执行文件指南

3.1. 使用 TLS 集中配置

Quarkus 提供了 TLS 集中配置,可用于配置服务器的 TLS 上下文。 这是配置 HTTPS 的建议方法。

要配置 HTTP 服务器以使用 HTTPS,可以使用以下配置

quarkus.tls.key-store.pem.0.cert=server.crt
quarkus.tls.key-store.pem.0.key=server.key
quarkus.http.insecure-requests=disabled # Reject HTTP requests

要使用 p12 (PKCS12) 密钥库,请应用以下配置

quarkus.tls.key-store.p12.path=server-keystore.p12
quarkus.tls.key-store.p12.password=secret
quarkus.http.insecure-requests=disabled # Reject HTTP requests

除了默认配置之外,您还可以使用命名配置

quarkus.tls.https.key-store.p12.path=server-keystore.p12
quarkus.tls.https.key-store.p12.password=secret
quarkus.http.insecure-requests=disabled
quarkus.http.tls-configuration-name=https

3.2. 直接配置 HTTP 服务器

如果您不想使用 TLS 注册表,则可以直接配置 HTTP 服务器。

如果证书尚未加载到密钥库中,则可以使用下面列出的属性直接提供证书。 Quarkus 将首先尝试将给定的文件作为资源加载,并使用文件系统作为后备。 证书/密钥对将在启动时加载到新创建的密钥库中。

您的 application.properties 将如下所示

quarkus.http.ssl.certificate.files=/path/to/certificate
quarkus.http.ssl.certificate.key-files=/path/to/key

另一种解决方案是直接提供密钥库,该密钥库已经包含带有证书的默认条目。 您至少需要提供文件和密码。

与证书/密钥文件组合一样,Quarkus 将首先尝试将给定的路径解析为资源,然后再尝试从文件系统中读取它。

将以下属性添加到您的 application.properties

quarkus.http.ssl.certificate.key-store-file=/path/to/keystore

作为可选提示,密钥库的类型可以作为列出的选项之一提供。 如果未提供类型,Quarkus 将尝试从文件扩展名中推断出该类型。

quarkus.http.ssl.certificate.key-store-file-type=[one of JKS, JCEKS, P12, PKCS12, PFX]

在上述两种情况下,都需要提供密码才能创建/加载带有密码的密钥库。 可以在您的 application.properties 中(以纯文本形式)使用以下属性设置密码

quarkus.http.ssl.certificate.key-store-password=your-password

但是,与其在配置文件中以纯文本形式提供密码(这被认为是错误的实践),不如将其(使用 MicroProfile Config)作为环境变量 QUARKUS_HTTP_SSL_CERTIFICATE_KEY_STORE_PASSWORD 提供。 这也将与 Kubernetes 密钥 协同工作。

注意:为了与 Quarkus 的早期版本(0.16 之前)保持兼容性,默认密码设置为“password”。 因此,它不是强制性参数!

3.3. 配置 HTTPS 端口

默认情况下,Quarkus 侦听端口 8443 以进行 SSL 安全连接,并在运行测试时侦听端口 8444。

这些端口可以在您的 application.properties 中使用属性 quarkus.http.ssl-portquarkus.http.test-ssl-port 进行配置。

3.4. 禁用 HTTP 端口

可以禁用 HTTP 端口并仅支持安全请求。 这是通过 application.properties 中的 quarkus.http.insecure-requests 属性完成的。 有三个可能的值

enabled

默认值,HTTP 正常工作

redirect

HTTP 请求将被重定向到 HTTPS 端口

disabled

HTTP 端口将不会打开。

如果您使用 redirectdisabled 并且尚未添加 SSL 证书或密钥库,则您的服务器将不会启动!

3.5. 重新加载证书

密钥库、信任库和证书文件可以定期重新加载。 配置 quarkus.http.ssl.certificate.reload-period 属性以指定应重新加载证书的间隔

quarkus.http.ssl.certificate.files=/mount/certs/tls.crt
quarkus.http.ssl.certificate.key-files=/mount/certs/tls.key
quarkus.http.ssl.certificate.reload-period=1h

这些文件从最初加载的同一位置重新加载。 如果没有内容更改,则重新加载是空操作。 如果重新加载失败,服务器将继续使用先前的证书。

3.6. 防止客户端重新协商

有关更多信息,请参阅 防止客户端重新协商

4. 额外的 HTTP 标头

要启用在每个响应上发送 HTTP 标头,请添加以下属性

quarkus.http.header."X-Content-Type-Options".value=nosniff

这将在应用程序中对任何资源执行的请求的响应中包含 X-Content-Type-Options: nosniff HTTP 标头。

您还可以指定一个 path 模式和需要应用标头的 HTTP methods

quarkus.http.header.Pragma.value=no-cache
quarkus.http.header.Pragma.path=/headers/pragma
quarkus.http.header.Pragma.methods=GET,HEAD

仅当使用 GETHEAD 方法调用 /headers/pragma 资源时,才会应用 Pragma 标头

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

应应用此标头的路径

环境变量:QUARKUS_HTTP_HEADER__HEADER__PATH

显示更多

字符串

/*

此标头配置的值

环境变量:QUARKUS_HTTP_HEADER__HEADER__VALUE

显示更多

字符串

必需

此标头配置的 HTTP 方法。

如果未指定 HTTP 方法,则将始终添加标头。

环境变量:QUARKUS_HTTP_HEADER__HEADER__METHODS

显示更多

字符串列表

4.1. 每个路径的额外 HTTP 标头

如果需要根据路径设置不同的标头值,可以使用以下配置

quarkus.http.filter.index.header."Cache-Control"=none
quarkus.http.filter.index.matches=/index.html

当调用 /index.html 时,这将 Cache-Control 标头设置为 none

键中 quarkus.http.filter 之后的 index 用于分组,并且(例如)可以随意命名。

您可以在路径中使用正则表达式,也可以指定将设置 HTTP 标头的 HTTP 方法

quarkus.http.filter.static.header."Cache-Control"=max-age=31536000
quarkus.http.filter.static.methods=GET,HEAD
quarkus.http.filter.static.matches=/static/.*

如果配置中存在重叠路径,则可以指定一个顺序(值越高,优先级越高)。 例如,具有以下配置

quarkus.http.filter.just-order.order=10
quarkus.http.filter.just-order.header."Cache-Control"=max-age=5000
quarkus.http.filter.just-order.matches=/paths/order

quarkus.http.filter.any-order.order=11
quarkus.http.filter.any-order.header."Cache-Control"=max-age=1
quarkus.http.filter.any-order.matches=/paths/order.*

在请求 /paths/order 时将包含 Cache-Control: max-age=1 标头。

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

与此配置匹配的路径的正则表达式

环境变量:QUARKUS_HTTP_FILTER__FILTER__MATCHES

显示更多

字符串

必需

始终在响应中发送的其他 HTTP 标头

环境变量:QUARKUS_HTTP_FILTER__FILTER__HEADER__HEADER_NAME_

显示更多

Map<String,String>

此路径配置的 HTTP 方法

环境变量:QUARKUS_HTTP_FILTER__FILTER__METHODS

显示更多

字符串列表

应用此路径配置的顺序。 优先级越高,优先级越高

环境变量:QUARKUS_HTTP_FILTER__FILTER__ORDER

显示更多

整数

5. 在 vert.x 中支持 100-Continue

要支持 100-continue,需要显式启用 quarkus.http.handle-100-continue-automatically 选项。 有关更多信息,请查看 100-continue 和相关的 Vert.x 文档

quarkus.http.handle-100-continue-automatically=true

6. HTTP/2 支持

默认情况下启用 HTTP/2,如果使用 SSL,则浏览器将使用它。 即使未使用 SSL,也支持通过明文升级的 HTTP/2,并且非浏览器客户端可以使用它。

如果要禁用 HTTP/2,可以设置

quarkus.http.http2=false

请注意,某些配置属性特定于 HTTP/2。 例如,要配置最大标头列表大小(~ 标头),您需要配置 quarkus.http.limits.max-header-list-size 属性。 您还可以使用 quarkus.http.http2-push-enabled 启用或禁用 HTTP/2 推送。

7. 侦听随机端口

如果您不想指定端口,可以设置 quarkus.http.port=0quarkus.http.test-port=0。 操作系统将选择一个随机的开放端口,并在控制台中打印一条日志消息。 当端口绑定后,quarkus.http.port 系统属性将设置为所选的实际端口,因此您可以使用它从应用程序内部获取实际端口号。 如果您正在进行测试,您可以正常注入 URL,这将使用实际端口进行配置,并且 REST Assured 也将进行相应的配置。

由于这将设置一个系统属性,因此您可以通过 MicroProfile Config 访问 quarkus.http.port,但是,如果使用注入,则注入的值可能并不总是正确的。 此端口分配是 Quarkus 启动中发生的最后一件事之一,因此,如果在端口打开之前过早创建了要注入的对象,则注入的值将不正确。

8. CORS 过滤器

要使您的 Quarkus 应用程序可从在不同域上运行的另一个应用程序访问,您需要配置跨域资源共享 (CORS)。 有关 Quarkus 提供的 CORS 过滤器的更多信息,请参阅 "跨域资源共享" 指南的 Quarkus CORS 过滤器 部分。

9. HTTP 限制配置

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

所有标头的最大长度,最多 Integer.MAX_VALUE 个字节。

环境变量:QUARKUS_HTTP_LIMITS_MAX_HEADER_SIZE

显示更多

MemorySize 

20K

请求正文的最大大小,最多 Long.MAX_VALUE 个字节。

环境变量:QUARKUS_HTTP_LIMITS_MAX_BODY_SIZE

显示更多

MemorySize 

10240K

最大 HTTP 块大小,最多 Integer.MAX_VALUE 个字节。

环境变量:QUARKUS_HTTP_LIMITS_MAX_CHUNK_SIZE

显示更多

MemorySize 

8192

初始行的最大长度(例如 "GET / HTTP/1.0")。

环境变量:QUARKUS_HTTP_LIMITS_MAX_INITIAL_LINE_LENGTH

显示更多

整数

4096

表单属性的最大长度,最多 Integer.MAX_VALUE 个字节。

环境变量:QUARKUS_HTTP_LIMITS_MAX_FORM_ATTRIBUTE_SIZE

显示更多

MemorySize 

2048

设置表单的最大字段数。 设置为 -1 以允许无限数量的属性。

环境变量:QUARKUS_HTTP_LIMITS_MAX_FORM_FIELDS

显示更多

整数

256

设置服务器在解码表单时可以缓冲的最大字节数。 设置为 -1 以允许无限长度,最多 Integer.MAX_VALUE 个字节。

环境变量:QUARKUS_HTTP_LIMITS_MAX_FORM_BUFFERED_BYTES

显示更多

MemorySize 

1K

允许传入请求的最大 HTTP 请求参数数。

如果客户端在请求中发送的参数超过此数量,则连接将关闭。

环境变量:QUARKUS_HTTP_LIMITS_MAX_PARAMETERS

显示更多

整数

1000

一次允许的最大连接数。 如果设置了此值,建议设置一个短的空闲超时时间。

环境变量:QUARKUS_HTTP_LIMITS_MAX_CONNECTIONS

显示更多

整数

设置 SETTINGS_HEADER_TABLE_SIZE HTTP/2 设置。

允许发送方通知远程端点用于解码标头块的标头压缩表的最大大小(以八位字节为单位)。 编码器可以通过使用标头块内的标头压缩格式特定的信令来选择等于或小于此值的任何大小。 初始值为 4,096 个八位字节。

环境变量:QUARKUS_HTTP_LIMITS_HEADER_TABLE_SIZE

显示更多

long

设置 SETTINGS_MAX_CONCURRENT_STREAMS HTTP/2 设置。

指示发送方将允许的最大并发流数。 此限制是定向的:它适用于发送方允许接收方创建的流数。 最初,此值没有限制。 建议此值不小于 100,以避免不必要地限制并行性。

环境变量:QUARKUS_HTTP_LIMITS_MAX_CONCURRENT_STREAMS

显示更多

long

设置 SETTINGS_MAX_FRAME_SIZE HTTP/2 设置。 指示发送方愿意接收的最大帧有效负载的大小(以八位字节为单位)。 初始值为 2^14 (16,384) 个八位字节。

环境变量:QUARKUS_HTTP_LIMITS_MAX_FRAME_SIZE

显示更多

整数

设置 SETTINGS_MAX_HEADER_LIST_SIZE HTTP/2 设置。 此建议设置通知对等方发送方准备接受的最大标头列表大小(以八位字节为单位)。 该值基于标头字段的未压缩大小,包括名称和值的长度(以八位字节为单位)以及每个标头字段 32 个八位字节的开销。 默认值为 8192

环境变量:QUARKUS_HTTP_LIMITS_MAX_HEADER_LIST_SIZE

显示更多

long

设置每个时间窗口允许的最大 RST 帧数,这用于防止 HTTP/2 RST 帧洪水 DDOS 攻击。 默认值为 200,将零或负值设置为零或负值会禁用洪水保护。

环境变量:QUARKUS_HTTP_LIMITS_RST_FLOOD_MAX_RST_FRAME_PER_WINDOW

显示更多

整数

设置在检查最大 RST 帧数时的时间窗口的持续时间,这用于防止 HTTP/2 RST 帧洪水 DDOS 攻击。 默认值为 30 s,将零或负值设置为零或负值会禁用洪水保护。

环境变量:QUARKUS_HTTP_LIMITS_RST_FLOOD_WINDOW_DURATION

显示更多

Duration 

关于 Duration 格式

要编写持续时间值,请使用标准 java.time.Duration 格式。 有关更多信息,请参见 Duration#parse() Java API 文档

您还可以使用简化的格式,以数字开头

  • 如果该值仅为一个数字,则表示以秒为单位的时间。

  • 如果该值是一个数字后跟 ms,则表示以毫秒为单位的时间。

在其他情况下,简化格式将被转换为 java.time.Duration 格式以进行解析

  • 如果该值是一个数字后跟 hms,则在其前面加上 PT

  • 如果该值是一个数字后跟 d,则在其前面加上 P

关于 MemorySize 格式

大小配置选项识别以下格式的字符串(显示为正则表达式):[0-9]+[KkMmGgTtPpEeZzYy]?

如果未给出后缀,则假定为字节。

10. 配置流量整形

流量整形允许您限制所有通道(即连接)上的带宽,而不管打开的通道数如何。 当您要控制总体网络流量以防止拥塞或确定某些类型的流量的优先级时,这可能很有用。

要启用流量整形,请在您的应用程序配置中添加以下属性

quarkus.http.traffic-shaping.enabled=true # Required to enable traffic shaping

流量整形允许您配置各种参数,例如写入和读取限制(以字节/秒为单位)、检查间隔(两次带宽计算之间的延迟)和最大等待时间

quarkus.http.traffic-shaping.enabled=true # Required to enable traffic shaping
quarkus.http.traffic-shaping.check-interval=30s
quarkus.http.traffic-shaping.outbound-global-bandwidth=1M
quarkus.http.traffic-shaping.inbound-global-bandwidth=1M
quarkus.http.traffic-shaping.max-delay=10s

检查间隔表示计算流量的周期,并且较高的间隔可能导致不太精确的流量整形。 尽管接受 0(无统计),但建议为检查间隔设置一个正值,即使它很高,因为流量整形的精度取决于计算流量的周期。 在这种情况下,建议值是接近 5 或 10 分钟的值。

outbound-global-bandwidthinbound-global-bandwidth 参数分别表示写入和读取操作每秒的最大字节数。 您还应考虑使读取或写入操作中的对象大小相对适应您需要的带宽。 例如,对于 10KB/s 具有 10 MB 对象将导致突发效应,而对于 1 MB/s 具有 100 KB 对象应该由流量整形平稳处理。

此外,您可以设置最大等待时间 (max-delay),该时间指定时间整形的上限。 默认情况下,它设置为 15 秒。 它必须小于 HTTP 超时时间。 当达到其中一个阈值时,在该时间段内不会发生任何写入。

11. 配置 HTTP 访问日志

您可以通过在 application.properties 中配置 HTTP 请求日志记录来添加 HTTP 请求日志记录。 日志记录有两个选项,要么记录到标准 JBoss 日志输出,要么记录到专用文件。

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

如果启用了访问日志记录。默认情况下,这将通过标准日志记录工具进行记录

环境变量:QUARKUS_HTTP_ACCESS_LOG_ENABLED

显示更多

布尔值

false

一个正则表达式,可用于从日志记录中排除某些路径。

环境变量:QUARKUS_HTTP_ACCESS_LOG_EXCLUDE_PATTERN

显示更多

字符串

访问日志模式。

如果这是字符串 commoncombinedlong,那么这将使用指定的命名格式之一

  • common: %h %l %u %t "%r" %s %b - combined: %h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" - long: %r\n%{ALL_REQUEST_HEADERS}

否则,请查阅 Quarkus 文档,获取可使用的完整变量列表。

环境变量:QUARKUS_HTTP_ACCESS_LOG_PATTERN

显示更多

字符串

common

是否应将日志记录到单独的文件中。

环境变量:QUARKUS_HTTP_ACCESS_LOG_LOG_TO_FILE

显示更多

布尔值

false

访问日志文件基本名称,默认为 'quarkus',这将给出日志文件名 'quarkus.log'。

环境变量:QUARKUS_HTTP_ACCESS_LOG_BASE_FILE_NAME

显示更多

字符串

quarkus

将访问记录到文件时使用的日志目录

如果未设置,则使用当前工作目录。

环境变量:QUARKUS_HTTP_ACCESS_LOG_LOG_DIRECTORY

显示更多

字符串

日志文件后缀

环境变量:QUARKUS_HTTP_ACCESS_LOG_LOG_SUFFIX

显示更多

字符串

.log

如果通过标准日志机制进行日志记录(即,如果 base-file-name 为空),则使用的日志类别。

环境变量:QUARKUS_HTTP_ACCESS_LOG_CATEGORY

显示更多

字符串

io.quarkus.http.access-log

是否应每天轮换日志

环境变量:QUARKUS_HTTP_ACCESS_LOG_ROTATE

显示更多

布尔值

true

是否应将重新路由的请求合并到一个日志条目中

环境变量:QUARKUS_HTTP_ACCESS_LOG_CONSOLIDATE_REROUTED_REQUESTS

显示更多

布尔值

false

属性 短格式 长格式

远程 IP 地址

%a

%{REMOTE_IP}

本地 IP 地址

%A

%{LOCAL_IP}

发送的字节数,不包括 HTTP 标头,如果未发送字节,则为 '-'

%b

发送的字节数,不包括 HTTP 标头

%B

%{BYTES_SENT}

远程主机名

%h

%{REMOTE_HOST}

请求协议

%H

%{PROTOCOL}

请求方法

%m

%{METHOD}

本地端口

%p

%{LOCAL_PORT}

查询字符串(如果存在,则在前面加上 '?',否则为空字符串)

%q

%{QUERY_STRING}

请求的第一行

%r

%{REQUEST_LINE}

响应的 HTTP 状态代码

%s

%{RESPONSE_CODE}

日期和时间,以通用日志格式

%t

%{DATE_TIME}

由符合 DateTimeFormatter 的字符串定义的日期和时间

%{time,date_fime_formatter_string}

已通过身份验证的远程用户

%u

%{REMOTE_USER}

请求的 URL 路径

%U

%{REQUEST_URL}

请求相对路径

%R

%{REQUEST_PATH}

本地服务器名称

%v

%{LOCAL_SERVER_NAME}

处理请求所花费的时间(毫秒)

%D

%{RESPONSE_TIME}

处理请求所花费的时间(秒)

%T

处理请求所花费的时间(微秒)

%{RESPONSE_TIME_MICROS}

处理请求所花费的时间(纳秒)

%{RESPONSE_TIME_NANOS}

当前请求线程名称

%I

%{THREAD_NAME}

SSL 密码

%{SSL_CIPHER}

SSL 客户端证书

%{SSL_CLIENT_CERT}

SSL 会话 ID

%{SSL_SESSION_ID}

所有请求标头

%{ALL_REQUEST_HEADERS}

Cookie 值

%{c,cookie_name}

查询参数

%{q,query_param_name}

请求标头

%{i,request_header_name}

响应标头

%{o,response_header_name}

Vert.x 路由上下文内部数据

%{d,map_key}

Vert.x MDC 数据(例如,OpenTelemetry 的 'traceId')

%{X,mdc-key}

设置 quarkus.http.access-log.consolidate-rerouted-requests=true 以启用对修饰符 < 的支持。此修饰符可用于已在内部重定向的请求,以查阅原始请求。以下属性支持此修饰符

属性 短格式 长格式

请求的第一行

%<r

%{<REQUEST_LINE}

请求方法

%<m

%{<METHOD}

请求相对路径

%<R

%{<REQUEST_PATH}

请求的 URL 路径

%<U

%{<REQUEST_URL}

查询字符串(如果存在,则在前面加上 '?',否则为空字符串)

%<q

%{<QUERY_STRING}

查询参数

%{<q,query_param_name}

设置 quarkus.http.record-request-start-time=true 以在使用任何与记录请求处理时间相关的属性时启用记录请求开始时间。

假设已为应用程序设置安全性(有关更多详细信息,请参阅我们的 指南),则日志记录属性 已通过身份验证的远程用户 设置为 io.quarkus.security.identity.SecurityIdentity principal 的值。如果您的应用程序使用自定义 Jakarta REST SecurityContext,则改用上下文 principal。请参阅 日志记录指南,了解如何自己添加上下文日志信息。

使用 quarkus.http.access-log.exclude-pattern=/some/path/.* 从日志中排除有关路径 /some/path/…​ 的所有条目(包括后续路径)。

12. 任意自定义

Quarkus 允许用户通过使用 io.quarkus.vertx.http.HttpServerOptionsCustomizer 来任意自定义 Quarkus 启动的 HTTP 服务器的选项。例如,如果需要以编程方式设置 HTTP 端口,则可以使用以下代码

import jakarta.inject.Singleton;
import io.quarkus.vertx.http.HttpServerOptionsCustomizer;

@Singleton (1)
public class MyCustomizer implements HttpServerOptionsCustomizer {

    @Override
    public void customizeHttpServer(HttpServerOptions options) { (2)
        options.setPort(9998);
    }
}
1 通过将类设为托管 bean,Quarkus 在启动 Vert.x 服务器时将考虑定制器
2 在这种情况下,我们只关心自定义 HTTP 服务器,因此我们只覆盖 customizeHttpServer 方法,但用户应该知道 HttpServerOptionsCustomizer 也允许配置 HTTPS 和域套接字服务器

13. 如何在 HTTP 服务器启动时执行逻辑

为了在 HTTP 服务器启动时执行一些自定义操作,您需要声明一个异步 CDI 观察器方法。当相应的 HTTP 服务器开始侦听配置的主机和端口时,Quarkus 异步 触发类型为 io.quarkus.vertx.http.HttpServerStartio.quarkus.vertx.http.HttpsServerStartio.quarkus.vertx.http.DomainSocketServerStart 的 CDI 事件。

HttpServerStart 示例
@ApplicationScoped
public class MyListener {

   void httpStarted(@ObservesAsync HttpServerStart start) { (1)
      // ...notified when the HTTP server starts listening
   }
}
1 可以通过使用 @jakarta.enterprise.event.ObservesAsync 注释 HttpServerStart 参数来声明异步 HttpServerStart 观察器方法。
无法将 StartupEvent 用于此特定用例,因为此 CDI 事件是在 HTTP 服务器启动之前触发的。

14. 在反向代理后面运行

Quarkus 可以通过代理访问,这些代理还会生成标头(例如 X-Forwarded-Host),以保留来自代理服务器面向客户端侧的信息,这些信息在涉及时会被更改或丢失。在这些情况下,可以将 Quarkus 配置为自动更新协议、主机、端口和 URI 等信息,以反映这些标头中的值。

激活此功能会使服务器暴露于多个安全问题(即,信息欺骗)。仅在反向代理后面运行时才考虑激活它。

要设置此功能,请在 src/main/resources/application.properties 中包含以下行

quarkus.http.proxy.proxy-address-forwarding=true

要仅考虑事实上的标准标头(Forwarded 标头),请在 src/main/resources/application.properties 中包含以下行

quarkus.http.proxy.allow-forwarded=true

要仅考虑非标准标头,请改为在 src/main/resources/application.properties 中包含以下行

quarkus.http.proxy.proxy-address-forwarding=true
quarkus.http.proxy.allow-x-forwarded=true
quarkus.http.proxy.enable-forwarded-host=true
quarkus.http.proxy.enable-forwarded-prefix=true
quarkus.http.proxy.trusted-proxies=127.0.0.1 (1)
1 使用 IP 地址 127.0.0.1 配置受信任的代理。来自任何其他地址的请求标头将被忽略。

与标准和非标准标头相关的两个配置可以组合,尽管标准标头配置将优先。但是,组合它们具有安全隐患,因为客户端可以使用未被代理覆盖的转发标头伪造请求。因此,代理应从客户端剥离意外的 ForwardedX-Forwarded-* 标头。

支持的转发地址标头为

  • Forwarded

  • X-Forwarded-Proto

  • X-Forwarded-Host

  • X-Forwarded-Port

  • X-Forwarded-Ssl

  • X-Forwarded-Prefix

通过列出 cookie 名称和 SameSite 属性,可以轻松地将 SameSite cookie 属性添加到由 Quarkus 端点设置的任何 cookie,例如

quarkus.http.same-site-cookie.jwt.value=Lax
quarkus.http.same-site-cookie.session.value=Strict

给定此配置,jwt cookie 将具有 SameSite=Lax 属性,而 session cookie 将具有 SameSite=Strict 属性。

16. Servlet 配置

要使用 Servlet,您需要显式包含 quarkus-undertow

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-undertow</artifactId>
</dependency>
build.gradle
implementation("io.quarkus:quarkus-undertow")

16.1. undertow-handlers.conf

您可以使用 undertow-handlers.conf 文件来使用 Undertow 谓词语言。此文件应放置在应用程序 jar 的 META-INF 目录中。此文件包含使用 Undertow 谓词语言 定义的处理程序。

16.2. web.xml

如果您使用 web.xml 文件作为配置文件,则可以将其放置在 src/main/resources/META-INF 目录中。

16.3. 内置路由顺序值

路由顺序值是通过 Vert.x 路由 io.vertx.ext.web.Route.order(int) 函数指定的值。

Quarkus 注册了几个具有特定顺序值的路由。这些常量在 io.quarkus.vertx.http.runtime.RouteConstants 类中定义,并在下表中列出。自定义路由应定义 20000 或更高的顺序值,以便它不会干扰 Quarkus 和扩展提供的功能。

io.quarkus.vertx.http.runtime.RouteConstants 和已知扩展中定义的路由顺序常量

路由顺序值

常量名称

来源

Integer.MIN_VALUE

ROUTE_ORDER_ACCESS_LOG_HANDLER

访问日志处理程序,如果在配置中启用。

Integer.MIN_VALUE

ROUTE_ORDER_RECORD_START_TIME

添加开始时间的处理程序,如果在配置中启用。

Integer.MIN_VALUE

ROUTE_ORDER_HOT_REPLACEMENT

-替换正文处理程序。

Integer.MIN_VALUE

ROUTE_ORDER_BODY_HANDLER_MANAGEMENT

管理路由器的正文处理程序。

Integer.MIN_VALUE

ROUTE_ORDER_HEADERS

添加配置中指定的标头的处理程序。

Integer.MIN_VALUE

ROUTE_ORDER_CORS_MANAGEMENT

管理路由器的 CORS-Origin 处理程序。

Integer.MIN_VALUE + 1

ROUTE_ORDER_BODY_HANDLER

正文处理程序。

-2

ROUTE_ORDER_UPLOAD_LIMIT

强制执行上传正文大小限制的路由。

0

ROUTE_ORDER_COMPRESSION

压缩处理程序。

1000

ROUTE_ORDER_BEFORE_DEFAULT

优先级高于默认路由的路由(从此值添加偏移量)。

10000

ROUTE_ORDER_DEFAULT

默认路由顺序(即,静态资源、Servlet)。

20000

ROUTE_ORDER_AFTER_DEFAULT

没有高于默认路由优先级的路由(从此值添加偏移量)

相关内容