Skip to content
索引

resolveHttpServer

代码中的逻辑是首先判断是否传入了 httpsOptions,如果没有传入则返回一个 HTTP/1.x 的 HTTP 服务器

否则会根据 proxy 参数的值选择使用 HTTPS 还是 HTTP/2 协议创建服务器。如果 proxy 参数为 true,则使用 HTTPS 协议创建服务器,否则使用 HTTP/2 协议创建服务器,并且允许客户端回退使用 HTTP/1.x 协议。

因此,这段代码可以根据传入的参数选择使用不同的协议和服务器类型

allowHTTP1参数

allowHTTP1 是一个 Node.js 中 http2 模块的服务器选项。它是一个布尔类型的属性,用于控制是否允许使用 HTTP/1.x 协议来处理客户端请求。如果设置为 false(默认值),则只允许使用 HTTP/2 协议;如果设置为 true,则允许使用 HTTP/1.x 和 HTTP/2 两种协议。

在使用 createSecureServer 方法创建 HTTP/2 服务器时,可以通过设置 allowHTTP1 属性来指定是否允许使用 HTTP/1.x 协议。需要注意的是,当 allowHTTP1 设置为 true 时,服务器将同时支持 HTTP/1.x 和 HTTP/2 协议,这可能会影响服务器的性能。因此,在选择是否启用 HTTP/1.x 协议时,需要权衡性能和兼容性等方面的因素。

因为一些代理服务器不支持 HTTP/2 协议,所以需要回退到使用 HTTPS 协议来支持这些代理服务器。如果 proxy 参数为 false,则会选择使用 HTTP/2 协议创建服务器,以获得更好的性能和安全性。

ts
export async function resolveHttpServer(
  { proxy }: CommonServerOptions,
  app: Connect.Server,
  httpsOptions?: HttpsServerOptions,
): Promise<HttpServer> {
  if (!httpsOptions) {
    const { createServer } = await import('node:http')
    return createServer(app)
  }

  // #484 fallback to http1 when proxy is needed.
  if (proxy) {
    const { createServer } = await import('node:https')
    return createServer(httpsOptions, app)
  } else {
    const { createSecureServer } = await import('node:http2')
    return createSecureServer(
      {
        // Manually increase the session memory to prevent 502 ENHANCE_YOUR_CALM
        // errors on large numbers of requests
        maxSessionMemory: 1000,
        ...httpsOptions,
        allowHTTP1: true,
      },
      // @ts-expect-error TODO: is this correct?
      app,
    ) as unknown as HttpServer
  }
}
export async function resolveHttpServer(
  { proxy }: CommonServerOptions,
  app: Connect.Server,
  httpsOptions?: HttpsServerOptions,
): Promise<HttpServer> {
  if (!httpsOptions) {
    const { createServer } = await import('node:http')
    return createServer(app)
  }

  // #484 fallback to http1 when proxy is needed.
  if (proxy) {
    const { createServer } = await import('node:https')
    return createServer(httpsOptions, app)
  } else {
    const { createSecureServer } = await import('node:http2')
    return createSecureServer(
      {
        // Manually increase the session memory to prevent 502 ENHANCE_YOUR_CALM
        // errors on large numbers of requests
        maxSessionMemory: 1000,
        ...httpsOptions,
        allowHTTP1: true,
      },
      // @ts-expect-error TODO: is this correct?
      app,
    ) as unknown as HttpServer
  }
}

node:http、node:https和node:http2有啥区别

node:http 模块提供了创建基于 HTTP/1.x 协议的服务器的 API。这个模块允许你创建 HTTP 服务器,并在客户端和服务器之间传输纯文本数据。由于 HTTP 协议本身是明文的,所以它没有任何内置的安全性,并且可以容易地被中间人攻击。

node:https 模块则提供了一个创建基于 HTTPS 协议的服务器的 API。HTTPS 协议是在 HTTP 协议之上增加了 SSL/TLS 加密和认证层的协议。通过使用 SSL/TLS,HTTPS 协议提供了数据加密和身份验证的保护,使得中间人攻击变得更加困难。

node:http2 模块提供了一个创建基于 HTTP/2 协议的服务器的 API。HTTP/2 协议是 HTTP 协议的下一代标准,它引入了许多新的特性,如二进制传输、流、头部压缩等,可以显著提高性能。但是,由于 HTTP/2 协议相对较新,因此并不是所有的客户端都支持该协议,所以在使用 HTTP/2 协议时需要谨慎。

HTTP/1.x 和 HTTP/2 两种协议有啥区别

HTTP/1.x 和 HTTP/2 是两种不同的 HTTP 协议版本。它们之间的主要区别在于以下几个方面:

  1. 性能:HTTP/2 相对于 HTTP/1.x,具有更好的性能和速度。这是因为 HTTP/2 支持多路复用(multiplexing)和二进制分帧(binary framing)等特性,能够更好地利用网络资源,减少请求的延迟和响应时间,提高页面加载速度。
  2. 安全性:HTTP/2 要求使用加密的 HTTPS 协议,而 HTTP/1.x 则可以使用明文 HTTP 协议。因此,HTTP/2 相对于 HTTP/1.x,具有更好的安全性和隐私保护。
  3. 头部压缩:HTTP/2 支持头部压缩(header compression)功能,可以减少网络传输的数据量,提高页面加载速度。
  4. 服务器推送:HTTP/2 支持服务器推送(server push)功能,可以在客户端发出请求前,主动将一些资源推送给客户端,减少客户端的请求次数,提高页面加载速度。

总的来说,HTTP/2 相对于 HTTP/1.x,具有更好的性能、安全性和效率,但是由于它的特性较新,可能在某些场景下兼容性不够好。因此,在选择使用哪种协议时,需要根据实际情况进行权衡和选择。

HTTPS跟HTTP/1.x和HTTP/2的关系

HTTPS(Hyper Text Transfer Protocol Secure)是一种基于 SSL/TLS 协议的安全的 HTTP 协议。它对 HTTP 传输的数据进行了加密,保护了数据的安全性和隐私。

HTTP/1.x 和 HTTP/2 协议都可以使用 HTTPS 进行加密传输。在使用 HTTPS 协议时,客户端和服务器之间的数据传输是通过 SSL/TLS 协议进行加密和解密的。HTTPS 协议通常使用 TCP 协议的 443 端口进行传输,而 HTTP/1.x 和 HTTP/2 协议通常使用 TCP 协议的 80 和 443 端口进行传输。

在使用 HTTP/2 协议时,由于它具有更好的性能和安全性,通常建议使用 HTTPS 进行加密传输。由于 HTTP/2 支持头部压缩和二进制分帧等特性,可以减少网络传输的数据量,但是这也增加了网络攻击者利用 HTTP/1.x 协议中的明文头部进行攻击的可能性。因此,在使用 HTTP/2 协议时,使用 HTTPS 进行加密传输可以提高安全性和隐私保护。

vite使用server.https

https://cn.vitejs.dev/config/server-options.html#server-https

  • 类型: boolean | https.ServerOptions

启用 TLS + HTTP/2。注意:当 server.proxy 选项 也被使用时,将会仅使用 TLS。

这个值也可以是一个传递给 https.createServer()选项对象

需要一个合法可用的证书。对基本使用的配置需求来说,你可以添加 @vitejs/plugin-basic-ssl 到项目插件中,它会自动创建和缓存一个自签名的证书。但我们推荐你创建和使用你自己的证书。

注意:当 server.proxy 选项 也被使用时,将会仅使用 TLS。

TLS是什么意思

TLS代表传输层安全性协议,它是用于保护互联网通信安全的标准加密协议。TLS是SSL(安全套接字层)协议的继任者,用于在互联网上的客户端和服务器之间进行安全通信。通常,HTTPS协议会使用TLS来对数据进行加密和保护。

Released under the MIT License.