我对 Nuxt 3 应用程序使用 Caddy 反向代理。在开发模式下加载站点时,由于 Vite 使用原生 ESM 提供了较短的预热时间和快速的 HMR(热模块重新加载),因此将加载数百个文件。通过本地主机访问站点时这不是问题。但是当通过反向代理时,经过几百个文件后,它崩溃了。浏览器将看到 502(Bad Gateway),Nuxt 将在终端中报告:
ERROR [unhandledRejection] connect ECONNRESET 127.0.0.1:64927 3:41:34 PM
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1611:16) (repeated 9 times)
在生产模式下使用 Nuxt 应用程序时不会发生这种情况 (
nuxt build + nuxt start
),可能是因为文件当时是捆绑的。奇怪的是,当使用 Nginx 作为反向代理时,也会出现同样的问题。
花了很长时间才弄清楚这一点。显然,Nuxt(或 Vite / Nitro.js / Node 或任何提供实际 HTTP 服务器的东西)仅提供 HTTP 1.1。默认情况下,Caddy 或 Nginx 的反向代理将使用 HTTP 2。我不太确定为什么这是一个问题,但这是我的理论:HTTP 1.1 限制了大约 8 个并发请求。由于 HTTP 2 的工作方式不同,因此它没有该限制。因此,反向代理几乎会立即在 Nuxt 服务器上转储大量请求。这些超时时间很短,最终会导致连接中断。
解决方案是在全局选项中指示 Caddy 使用 HTTP 1(这在开发环境中不是问题):
{
servers {
protocols h1
}
}