EntryPoints
监听传入连接/请求
配置示例¶
entryPoints:
web:
address: :80
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
observability:
accessLogs: false
metrics: false
tracing: false
websecure:
address: :443
http:
tls: {}
middlewares:
- default-auth@kubernetescrd
- default-strip@kubernetescrd[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.web.http]
[entryPoints.web.http.redirections.entryPoint]
to = "websecure"
scheme = "https"
permanent = true
[entryPoints.web.observability]
accessLogs = false
metrics = false
tracing = false
[entryPoints.websecure]
address = ":443"
[entryPoints.websecure.http]
middlewares = ["default-auth@kubernetescrd", "default-strip@kubernetescrd"]
[entryPoints.websecure.http.tls]## Values file
ports:
web:
port: :80
websecure:
port: :443
tls:
enabled: true
middlewares:
- default-auth@kubernetescrd
- default-strip@kubernetescrd
additionalArguments:
- --entryPoints.web.http.redirections.entryPoint.to=websecure
- --entryPoints.web.http.redirections.entryPoint.scheme=https
- --entryPoints.web.http.redirections.entryPoint.permanent=true
- --entryPoints.web.observability.accessLogs=false
- --entryPoints.web.observability.metrics=false
- --entryPoints.web.observability.tracing=false提示
Helm Chart 默认创建入口点 web(端口 80)、websecure(端口 443)、traefik(端口 8080)和 metrics(端口 9100)。
默认通过 Service 暴露入口点 web 和 websecure。
可以在 Helm Chart 中覆盖默认行为。
配置选项¶
| 字段 | 说明 | 默认值 | 必填 |
|---|---|---|---|
address |
定义监听传入连接和数据包的端口,以及可选的主机名。 同时定义使用的协议(TCP 或 UDP)。 未指定协议时默认使用 TCP。格式为:`[host]:port[/tcp|/udp] |
- | 是 |
asDefault |
将 entryPoint 加入默认 entryPoints 列表。未定义自身 entryPoints 选项的 HTTP 和 TCP 路由器默认使用此列表中的 entryPoints。更多信息参见此处。 |
false | 否 |
allowACMEByPass |
允许通过自定义路由器处理 ACME TLS 和 HTTP 质询,以替代内部 ACME 路由器。 | false | 否 |
forwardedHeaders.connection |
在移除之前允许通过中间件链的 Connection 请求头列表。 | - | 否 |
forwardedHeaders.insecure |
设置不安全模式,始终信任转发头信息(X-Forwarded-*)。建议仅将此选项用于测试,不用于生产环境。 |
false | 否 |
forwardedHeaders.trustedIPs |
设置 Traefik 信任其转发头信息(X-Forwarded-*)的 IP 或 CIDR。 |
- | 否 |
forwardedHeaders.notAppendXForwardedFor |
设为 true 时,Traefik 不会将客户端的 RemoteAddr 追加到 X-Forwarded-For 请求头。现有请求头保持原样。如果不存在 X-Forwarded-For 请求头,也不会添加。 |
false | 否 |
http.redirections.entryPoint.to |
用于将入口点上的所有传入请求(永久)重定向到另一入口点的目标。 目标可以是入口点名称(例如 websecure)或端口(:443)。 |
- | 是 |
http.redirections.entryPoint.scheme |
所有传入请求进行(永久)重定向时使用的目标协议。 | https | 否 |
http.redirections.entryPoint.permanent |
启用将入口点上的所有传入请求永久重定向到另一入口点,并更改协议。 目标可以是入口点名称(例如 websecure)或端口(:443)。 |
true | 否 |
http.redirections.entryPoint.priority |
应用于附加到 entryPoint 的路由器的默认优先级。 |
MaxInt-1(32 位为 2147483646,64 位为 9223372036854775806) |
否 |
http.encodedCharacters |
定义请求路径中允许的编码字符。更多信息参见此处。 | false | 否 |
http.encodedCharacters.allowEncodedSlash |
定义是否允许路径中含有编码后斜杠字符的请求。 | true | 否 |
http.encodedCharacters.allowEncodedBackSlash |
定义是否允许路径中含有编码后反斜杠字符的请求。 | true | 否 |
http.encodedCharacters.allowEncodedNullCharacter |
定义是否允许路径中含有编码后空字符的请求。 | true | 否 |
http.encodedCharacters.allowEncodedSemicolon |
定义是否允许路径中含有编码后分号字符的请求。 | true | 否 |
http.encodedCharacters.allowEncodedPercent |
定义是否允许路径中含有编码后百分号字符的请求。 | true | 否 |
http.encodedCharacters.allowEncodedQuestionMark |
定义是否允许路径中含有编码后问号字符的请求。 | true | 否 |
http.encodedCharacters.allowEncodedHash |
定义是否允许路径中含有编码后井号字符的请求。 | true | 否 |
http.encodeQuerySemicolons |
启用查询字符串分号编码。 此选项可避免 Traefik 将未编码的分号解释为查询参数分隔符。 使用此选项时,查询字符串中未编码的分号会以编码形式传送给后端。 更多信息参见此处。 |
false | 否 |
http.aliasHeadersStrategy |
定义处理请求头名称为另一请求头名称别名的请求时所采用的策略(keep、delete 和 reject)。 更多信息参见此处。 |
keep | 否 |
http.sanitizePath |
定义是否启用请求路径规范化。 更多信息参见此处。 |
true | 否 |
http.maxHeaderBytes |
设置请求头的最大大小,单位为字节。 | 1048576 | 否 |
http.middlewares |
设置默认添加到指定入口点所关联的每个路由器的中间件列表之前的中间件列表。 更多信息参见此处。 |
- | 否 |
http.tls |
在附加到 entryPoint 的每个路由器上启用 TLS。未设置证书时,Traefik 会生成默认自签名证书。 建议不要在生产环境中使用自签名证书。 |
- | 否 |
http.tls.options |
在附加到 entryPoint 的每个路由器上应用 TLS 选项。仅当路由器未定义自身 tls 部分时,这些选项才会生效。定义路由器的 tls 部分(即使为空,或仅包含 certResolver 等任一字段)会替换该路由器的入口点 TLS 配置(不合并)。更多信息参见专门章节和 HTTP TLS 概述。 |
- | 否 |
http.tls.certResolver |
在附加到 entryPoint 的每个路由器上应用证书解析器。与 http.tls.options 相同,仅当路由器未定义自身 tls 部分时,此选项才会生效。定义路由器的 tls 部分(即使为空,或仅包含 certResolver 等任一字段)会替换该路由器的入口点 TLS 配置(不合并)。更多信息参见专门章节和 HTTP TLS 概述。 |
- | 否 |
http2.maxConcurrentStreams |
设置允许每个客户端在每个连接上发起的并发流数量。 值必须大于零。 |
250 | 否 |
http2.maxDecoderHeaderTableSize |
设置解码器头部压缩表的最大大小。此选项控制服务器愿意维护的请求头缓存的最大大小,使客户端无需在同一 http2 连接的各个请求中重复发送相同请求头。 此值仅为上限,连接的另一端可以使用更小的大小。 |
4096 | 否 |
http2.maxEncoderHeaderTableSize |
设置编码器头部压缩表的最大大小。此选项控制服务器向客户端发送响应头时愿意维护的头部缓存的最大大小,使服务器能够减少响应中发送的重复响应头。 此值仅为上限,连接的另一端可以使用更小的大小。 |
4096 | 否 |
http3 |
在 entryPoint 上启用 HTTP/3 协议。HTTP/3 需要 TCP entryPoint,因为 HTTP/3 始终以 TCP 连接开始,随后升级为 UDP。在大多数情况下,此 entryPoint 与 TLS 流量使用的入口点相同。更多信息参见此处。 |
- | 否 |
http3.advertisedPort |
设置作为 HTTP/3 authority 通告的 UDP 端口。 默认为入口点地址的端口。 可用于覆盖 alt-svc 响应头中的 authority,例如公开端口与 Traefik 监听端口不同时。 |
- | 否 |
observability.accessLogs |
定义附加到此入口点的路由器是否默认生成访问日志。但定义自身可观测性配置的路由器将不采用此默认设置。 | true | 否 |
observability.metrics |
定义附加到此入口点的路由器是否默认生成指标。但定义自身可观测性配置的路由器将不采用此默认设置。 | true | 否 |
observability.tracing |
定义附加到此入口点的路由器是否默认生成链路追踪。但定义自身可观测性配置的路由器将不采用此默认设置。 | true | 否 |
observability.traceVerbosity |
定义附加到此入口点的路由器的链路追踪详细程度。可选值:minimal(默认)、detailed。路由器可以在自身的可观测性配置中覆盖此值。更多信息参见此处。 |
minimal | 否 |
proxyProtocol.trustedIPs |
启用 PROXY 协议并配置信任的 IP。 Traefik 支持 PROXY 协议版本 1 和 2。 入口点启用 PROXY 协议头解析后,可以接受携带或不携带 PROXY 协议头的连接。 若传入 PROXY 协议头,会自动判断版本。 更多信息参见此处。 |
- | 否 |
proxyProtocol.insecure |
启用 PROXY 协议并信任所有传入连接。 每个远程客户端地址都会被替换( trustedIPs 不会生效)。Traefik 支持 PROXY 协议版本 1 和 2。 入口点启用 PROXY 协议头解析后,可以接受携带或不携带 PROXY 协议头的连接。 若传入 PROXY 协议头,会自动判断版本。 建议仅将此选项用于测试,不用于生产环境。 更多信息参见此处。 |
- | 否 |
reusePort |
通过 SO_REUSEPORT 套接字选项,允许同一进程或不同进程的 entryPoints 监听同一个 TCP/UDP 端口。这还使内核能像负载均衡器一样在入口点之间分发传入连接。 更多信息参见此处。 |
false | 否 |
transport.respondingTimeouts.readTimeout |
设置传入 Traefik 实例的请求超时时间,即读取整个请求(包括请求体)的最长时长。此设置对 UDP entryPoints 无效。为零时不设超时。 可使用 time.ParseDuration 支持的格式或原始数值(数字)。 未提供单位时,按秒解析。 |
60s(秒) | 否 |
transport.respondingTimeouts.writeTimeout |
写入响应的最长时长,超过后超时。 涵盖从读取请求头结束到写入响应结束的时间。 为零时不设超时。 可使用 time.ParseDuration 支持的格式或原始数值(数字)。 未提供单位时,按秒解析。 |
0s(秒) | 否 |
transport.respondingTimeouts.idleTimeout |
空闲(保持活动)连接在自行关闭之前可保持空闲的最长时长。 为零时不设超时。 可使用 time.ParseDuration 支持的格式或原始数值(数字)。 未提供单位时,按秒解析 |
180s(秒) | 否 |
transport.lifeCycle.graceTimeOut |
设置 Traefik 停止之前,为活动请求完成处理而预留的时长。 可使用 time.ParseDuration 支持的格式或原始数值(数字)。 未提供单位时,按秒解析。 在此期间不接受新请求。 |
10s(秒) | 否 |
transport.lifeCycle.requestAcceptGraceTimeout |
设置在开始优雅终止阶段(由 transportlifeCycle.graceTimeOut 选项定义)之前继续接受请求的时长。此选项旨在给下游负载均衡器足够的时间将 Traefik 从轮转中移除。 可使用 time.ParseDuration 支持的格式或原始数值(数字)。 未提供单位时,按秒解析 |
0s(秒) | 否 |
transport.keepAliveMaxRequests |
设置 Traefik 向客户端发送 Connection: Close 响应头之前可处理的最大请求数(对于 HTTP2,Traefik 发送 GOAWAY)。零表示不限制。 |
0 | 否 |
transport.keepAliveMaxTime |
设置 Traefik 向客户端发送 Connection: Close 响应头之前可处理请求的最长时长(对于 HTTP2,Traefik 发送 GOAWAY)。零表示不限制。 |
0s(秒) | 否 |
udp.timeout |
定义释放相关资源之前等待空闲会话的时长。 Timeout 值必须大于零。 |
3s(秒) | 否 |
asDefault¶
如果没有任何入口点将 asDefault 选项设为 true,那么
默认入口点列表包含所有 HTTP/TCP 入口点。
如果至少一个入口点将 asDefault 选项设为 true,
那么默认入口点列表仅包含将
asDefault 选项设为 true 的入口点。
一些内置入口点始终被排除在此列表之外,即 traefik。
asDefault 选项对 UDP 入口点无效。
UDP 路由器未定义入口点选项时,会附加到所有
可用的 UDP 入口点。
allowACMEByPass¶
默认情况下,Traefik 创建具有最高优先级(MaxInt)的内部路由器来处理
ACME HTTP 和 TLS 质询。这确保了证书质询始终能够成功,
但也会阻止任何用户定义的路由器拦截同一入口点上的质询请求。
在入口点上将 allowACMEByPass 设为 true 时:
- 创建内部 ACME HTTP 质询路由器时不显式指定高优先级, 从而允许用户定义的路由器处理质询请求。
- 在入口点上启用 TLS-ALPN 质询透传, 从而允许用户定义的 TLS 路由器处理 TLS 质询。
当需要自定义处理 ACME 质询时,这很有用, 例如使用专门的服务来解决 HTTP-01 或 TLS-ALPN-01 质询。
说明
未配置 TLS 质询解析器时,所有入口点上的 TLS 透传
都会隐式启用 allowACMEByPass。
说明
启用 allowACMEByPass 且入口点配置了 HTTP 重定向
(通过 http.redirections.entryPoint)时,重定向路由器会自动排除
ACME 质询路径(/.well-known/acme-challenge/)。
这让用户定义的 ACME 质询路由器能够处理质询请求,
而不会被重定向覆盖。
entryPoints:
web:
address: ":80"
allowACMEByPass: true[entryPoints.web]
address = ":80"
allowACMEByPass = true--entryPoints.web.address=:80
--entryPoints.web.allowACMEByPass=truehttp.middlewares¶
- 可以为每个入口点附加一个中间件列表, 供该入口点使用。
- 中间件仅在规则匹配时生效,并且在将请求转发 到服务之前执行。
- 中间件按照声明顺序应用。
- 默认情况下,中间件应用于通过该入口点暴露的每个路由器 (在 IngressRoute 或 Ingress 上声明的中间件, 在入口点上声明的中间件之后应用)
-
必须使用中间件的完全限定名称引用它,包括 提供者命名空间 后缀(
<middleware-name>@<provider-name>)。具体值取决于 声明该中间件的提供者:提供者 格式 示例 File <middleware-name>@filestrip@fileDocker <middleware-name>@dockerstrip@dockerKubernetes CRD <middleware-namespace>-<middleware-name>@kubernetescrddefault-auth@kubernetescrd启用
safeNaming时,Kubernetes CRD 的值变为<middleware-namespace>_<middleware-name>@kubernetescrd,使用与该提供者生成的其他名称相同的_分隔符。
entryPoints:
web:
address: :80
http:
middlewares:
- default-auth@kubernetescrd
- strip@fileports:
web:
port: :80
http:
middlewares:
- default-auth@kubernetescrd
- strip@fileencodeQuerySemicolons¶
行为示例:
| EncodeQuerySemicolons | 请求查询字符串 | 处理后的请求查询字符串 |
|---|---|---|
| false | foo=bar;baz=bar | foo=bar&baz=bar |
| true | foo=bar;baz=bar | foo=bar%3Bbaz=bar |
| false | foo=bar&baz=bar;foo | foo=bar&baz=bar&foo |
| true | foo=bar&baz=bar;foo | foo=bar&baz=bar%3Bfoo |
aliasHeadersStrategy¶
可选,默认值=keep
aliasHeadersStrategy 选项定义路由之前如何处理名称为另一请求头名称别名的请求头:
keep:具有别名名称的请求头按原样转发(默认)。delete:任何名称中包含既非字母、数字,也非连字符的字符的请求头,都会被静默移除。reject:任何请求只要携带名称中包含既非字母、数字,也非连字符的字符的请求头,都会被拒绝并返回400 Bad Request响应。
Go 只基于连字符规范化请求头名称,因此会将 X-Auth-User、X_Auth_User 和 X.Auth.User 作为三个
不同的请求头处理,而根据请求头名称生成变量名的后端(CGI、WSGI、PHP、NGINX 等)
会将它们全部读取为同一个 HTTP_X_AUTH_USER 变量。
下划线和点并非唯一涉及的字符:除字母、数字和连字符之外,HTTP 允许在请求头名称中使用的
每种字符都能构成这样的别名,即 !、#、$、%、&、'、*、+、.、^、_、
`、| 和 ~。更多详情参见具有别名名称的请求头安全文档,
其中有进一步说明。
管理请求头的中间件(例如 ForwardAuth 的 authResponseHeaders 选项)仅管理其设置的请求头的规范
形式,并依靠此选项防止利用别名名称进行欺骗。
对于每个未配置此选项的入口点,Traefik 都会在启动时记录警告。
安全性
规范化请求头名称的后端,可能遭到使用其信任请求头的别名名称进行的欺骗。
暴露此类后端时,建议将 aliasHeadersStrategy 选项设为 delete 或 reject。
delete 和 reject 策略适用于每个请求头:名称包含
此类字符的合法请求头(例如 X_Request_Id)也会被丢弃或拒绝。
entryPoints:
websecure:
address: ':443'
http:
aliasHeadersStrategy: delete[entryPoints.websecure]
address = ":443"
[entryPoints.websecure.http]
aliasHeadersStrategy = "delete"--entryPoints.websecure.address=:443
--entryPoints.websecure.http.aliasHeadersStrategy=delete示例¶
| AliasHeadersStrategy | 请求头 | 结果 |
|---|---|---|
| keep | X-Auth-User: legit X.Auth.User: spoof X!Auth!User: spoof |
X-Auth-User: legit X.Auth.User: spoof X!Auth!User: spoof 均到达后端 |
| delete | X-Auth-User: legit X.Auth.User: spoof X!Auth!User: spoof |
只有 X-Auth-User: legit 会到达后端 |
| reject | X-Auth-User: legit X.Auth.User: spoof X!Auth!User: spoof |
请求被拒绝,返回 400 Bad Request |
sanitizePath¶
sanitizePath 选项定义是否启用请求路径规范化。
禁用时,传入请求的路径会按原样传给后端。
处理未对请求路径中的数据进行 URL 编码的旧客户端时,这可能很有用。
例如,由于 base64 本身使用 “/” 字符,
如果未对其进行 URL 编码,
将 sanitizePath 选项设为 false 时就可能导致不安全的路由。
安全性
将 sanitizePath 选项设为 false 并不安全。 应确保每个请求都进行了正确的 URL 编码。
示例¶
| SanitizePath | 请求路径 | 处理后的请求路径 |
|---|---|---|
| false | /./foo/bar | /./foo/bar |
| true | /./foo/bar | /foo/bar |
| false | /foo/../bar | /foo/../bar |
| true | /foo/../bar | /bar |
| false | /foo/bar// | /foo/bar// |
| true | /foo/bar// | /foo/bar/ |
| false | /./foo/../bar// | /./foo/../bar// |
| true | /./foo/../bar// | /bar/ |
编码字符¶
出于安全考虑,可以配置 Traefik 来控制如何处理请求路径中的编码字符。 默认情况下,Traefik 不会拒绝路径中含有某些编码字符的请求,而这些字符可能用于路径遍历或其他安全攻击。
提示
此检查不针对请求查询参数执行, 仅针对 RFC3986 第 3 节定义的请求路径执行。
安全注意事项
如果后端并不完全遵循 RFC 3986,尤其是会解码请求路径中已编码的保留字符,
建议将这些选项设为 false,以避免不同组件对路径理解不一致,并帮助防止路径遍历攻击或其他绕过安全控制的恶意尝试。
以下是默认允许的编码字符列表:
| 编码字符 | 字符 |
|---|---|
%2f 或 %2F |
/(斜杠) |
%5c 或 %5C |
\(反斜杠) |
%00 |
NULL(空字符) |
%3b 或 %3B |
;(分号) |
%25 |
%(百分号) |
%3f 或 %3F |
?(问号) |
%23 |
#(井号) |
转发头¶
可以配置 Traefik 信任转发头信息(X-Forwarded-*)。
forwardedHeaders.trustedIPs
信任来自特定 IP 的转发头。
## Static configuration
entryPoints:
web:
address: ":80"
forwardedHeaders:
trustedIPs:
- "127.0.0.1/32"
- "192.168.1.7"## Static configuration
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.web.forwardedHeaders]
trustedIPs = ["127.0.0.1/32", "192.168.1.7"]## Static configuration
--entryPoints.web.address=:80
--entryPoints.web.forwardedHeaders.trustedIPs=127.0.0.1/32,192.168.1.7forwardedHeaders.insecure
不安全模式(始终信任转发头)。
## Static configuration
entryPoints:
web:
address: ":80"
forwardedHeaders:
insecure: true## Static configuration
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.web.forwardedHeaders]
insecure = true## Static configuration
--entryPoints.web.address=:80
--entryPoints.web.forwardedHeaders.insecureforwardedHeaders.connection
按照 RFC7230,Traefik 遵循客户端请求中的 Connection 选项。
为此,它会移除请求 Connection 头中列出的所有头字段,并在 Connection 头字段为空时移除该字段本身。
Traefik 开始处理请求时立即执行移除,
因此请求通过中间件链时,已移除的请求头不可用。
connection 选项列出允许在移除前通过中间件链的 Connection 请求头。
## Static configuration
entryPoints:
web:
address: ":80"
forwardedHeaders:
connection:
- foobar## Static configuration
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.web.forwardedHeaders]
connection = ["foobar"]## Static configuration
--entryPoints.web.address=:80
--entryPoints.web.forwardedHeaders.connection=foobarHTTP3¶
由于 HTTP/3 实际使用 UDP,当 Traefik 在端口 N 上配置了
启用 HTTP/3 的 TCP entryPoint 时,启动的底层 HTTP/3 服务器
还会自动监听 UDP 端口 N。因此,
端口 N 不能再被另一个 UDP entryPoint 使用。
由于 HTTP/3 要求使用 TLS,
只有启用了 TLS 的路由器才能使用 HTTP/3。
ProxyProtocol 与负载均衡器¶
仅对 trustedIPs 中列出的 IP 地址替换远程客户端地址。在此指定负载均衡器的 IP 或 CIDR 范围。
将 Traefik 部署在另一个负载均衡器之后时,务必在两端 配置 PROXY 协议。 否则可能在系统中引入安全风险(允许伪造请求)。
reusePort¶
示例¶
同一入口点上的多个进程:
entryPoints:
web:
address: ":80"
reusePort: true ## Values file
additionalArguments:
- --entryPoints.web.reusePort=true另一主机上同一入口点的多个进程:
entryPoints:
web:
address: ":80"
reusePort: true
privateWeb:
address: "192.168.1.2:80"
reusePort: trueadditionalArguments:
- --entryPoints.web.reusePort=true
- --entryPoints.privateWeb.address=192.168.1.2:80
- --entryPoints.privateWeb.reusePort=true支持的平台¶
reusePort 选项目前仅适用于 Linux、FreeBSD、OpenBSD 和 Darwin。
在其他平台上会被忽略。
Linux 内核存在一个已知缺陷,使用 reusePort 选项时可能造成意外的 TCP 连接
失败。更多详情参见此处。
金丝雀部署¶
将 reusePort 选项与 transport.lifeCycle.gracetimeout 选项结合使用,
即可对
Traefik 自身执行金丝雀部署,例如升级 Traefik 版本
或重新加载静态配置,而无需中断任何服务。
traceVerbosity¶
observability.traceVerbosity 定义附加到此入口点的路由器的链路追踪详细程度。
路由器可以在自身的可观测性配置中覆盖此值。
可选值为:
minimal:为路由器处理的每个请求生成一个服务器 span 和一个客户端 span。detailed:为路由器处理的每个请求中执行的每个中间件创建额外的 span。
Systemd 套接字激活¶
Traefik 支持 systemd 套接字激活。
套接字激活文件描述符的名称与入口点名称匹配时,对应的文件描述符将用作该入口点的 TCP/UDP 监听器。
systemd-socket-activate -l 80 -l 443 --fdname web:websecure ./traefik --entrypoints.web --entrypoints.websecure
入口点地址
套接字激活文件描述符的名称与入口点名称匹配时,会忽略该入口点的地址配置。若要支持 UDP 路由,地址必须带有 /udp 后缀(--entrypoints.my-udp-entrypoint.address=/udp)。
Docker 支持
Docker 不支持套接字激活,但它适用于 Podman 容器。
套接字文件中的多个监听器
每个 systemd 套接字文件只能包含一个 Listen 指令,HTTP/3 情况除外,此时文件必须同时包含 ListenStream 和 ListenDatagram 指令。若要在同一端口上设置 TCP 和 UDP 监听器,请使用多个具有不同入口点名称的套接字文件。