# Windows Server 上的 HTTP/3：IIS 可以，Nginx Win32 不行

> 在 IIS/ASP.NET Core 用 HTTPS + EnableHttp3 开启 HTTP/3，用 Alt-Svc 通告，测 UDP 443，并理解 Windows Nginx 的限制。

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29

## 一句话结论

HTTP/3 是 **QUIC/UDP** 上的 HTTP，不是 TCP。Windows 上：

- **IIS / ASP.NET Core** 在 Windows Server 2022 / Windows 11+ 支持；需要 HTTPS 绑定和 `EnableHttp3`；
- **Windows Nginx 不能构建 `ngx_http_v3_module`**；不要声称 Windows Nginx HTTP/3；
- 边缘要 HTTP/3，用 IIS、Linux Nginx/Caddy 或 CDN，并且实测。

HTTP/3 不是所有应用都自动更快。它在丢包/高延迟链路和大量并行资源上有优势，去掉 TCP 队头阻塞；它不会修慢数据库。

## IIS 条件

- Windows Server 2022 或更高 / Windows 11+。
- **HTTPS** 绑定（证书、SNI）。
- `EnableHttp3` 注册表值。
- 防火墙/NAT 放行 UDP 443。
- 支持 HTTP/3 的客户端（当前 Chrome/Edge/Firefox），且能到 UDP 443。

开启：

```powershell
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\HTTP\Parameters' `
  -Name EnableHttp3 -PropertyType DWord -Value 1 -Force
```

重启（或维护窗口重启 HTTP 栈）。不要在繁忙服务器上随便重启 HTTP.sys；它影响所有 HTTP 监听器，不只 IIS。

## Alt-Svc

浏览器从 HTTP/1.1 或 HTTP/2 通过 `Alt-Svc` 发现 HTTP/3：

```http
Alt-Svc: h3=":443"; ma=86400
```

IIS 不一定自动加。ASP.NET Core 在管道早期加：

```csharp
app.Use((context, next) =>
{
    context.Response.Headers.AltSvc = "h3=\":443\"";
    return next(context);
});
```

IIS 也能用 `EnableAltSvc` 发 HTTP/2 Alt-Svc 帧；那条路径要求基于主机名的 `netsh` 证书绑定，不是只绑 IP。

第一次请求通常走 HTTP/1.1 或 HTTP/2，然后客户端升级。这是正常的，不是“HTTP/3 失败”。

## In-process 与 out-of-process

- **In-process** ASP.NET Core：请求报告 `HTTP/3`。
- **Out-of-process**（IIS → Kestrel）：IIS 对客户端说 HTTP/3，但反代到 Kestrel 的那一跳是 HTTP/1.1，所以 `HttpRequest.Protocol` 报 HTTP/1.1。

out-of-process 部署不要只用 `HttpRequest.Protocol` 证明客户端用了 HTTP/3。

## 验证

```powershell
netsh http show sslcert hostnameport=lab.example:443
Get-NetFirewallRule -DisplayName '*HTTP*' | Select-Object DisplayName,Enabled
curl.exe --http3 -I https://lab.example/
```

`curl --http3` 只有构建带 HTTP/3 支持才可用。浏览器 DevTools → Network → Protocol 列在 Alt-Svc 升级后应显示 `h3`。还是 `h2`，说明客户端没切；查 UDP 443 和 Alt-Svc。

## Windows Nginx

官方 `ngx_http_v3_module` 文档明确：该模块**不能在 Win32 平台构建**。Windows Nginx 没有受支持的 HTTP/3 终止开关。

选项：

- HTTP/3 终止在 IIS 或 Linux 反代/CDN；
- Windows Nginx 继续 HTTP/2，接受这个边界；
- 不要在不能服务 `h3` 的服务器上通告 `h3`。

> **警告: 不要强推 HTTP/3**
>
> HTTP/3 回退是特性。封 UDP 443、企业代理、部分负载均衡会打挂 QUIC；客户端必须能回 HTTP/2。两条路径都测，HTTP/2 保持开启。

## 什么时候值得

- 移动/丢包网络、大量并行资源。
- 已有 TLS/HTTP/2，且能开 UDP 443。
- 能测量（RUM 或受控客户端），不是只在实验室 curl。

不值得：

- 纯 API、小请求、快网络；
- 边缘不传 UDP；
- 要靠破坏 HTTP/2 回退来“证明”HTTP/3。

## 实验室边界

E1。实验室没有开启 IIS HTTP/3 或测 QUIC；只记录了条件。Windows 11 上的 Nginx 1.28.0 只验证了 8081 的 HTTP/1.1，不是 HTTP/3。Nginx Win32 限制来自官方模块文档。

## 来源

- [Microsoft Learn — IIS 上的 ASP.NET Core HTTP/3](https://learn.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/http3?view=aspnetcore-10.0)
- [nginx — ngx_http_v3_module](https://nginx.org/en/docs/http/ngx_http_v3_module.html)
- [RFC 9114 — HTTP/3](https://datatracker.ietf.org/doc/rfc9114/)

---

来源页面: https://winbook.fyi/zh/server/web/http3/
