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 协议创建服务器,以获得更好的性能和安全性。
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 协议版本。它们之间的主要区别在于以下几个方面:
- 性能:HTTP/2 相对于 HTTP/1.x,具有更好的性能和速度。这是因为 HTTP/2 支持多路复用(multiplexing)和二进制分帧(binary framing)等特性,能够更好地利用网络资源,减少请求的延迟和响应时间,提高页面加载速度。
- 安全性:HTTP/2 要求使用加密的 HTTPS 协议,而 HTTP/1.x 则可以使用明文 HTTP 协议。因此,HTTP/2 相对于 HTTP/1.x,具有更好的安全性和隐私保护。
- 头部压缩:HTTP/2 支持头部压缩(header compression)功能,可以减少网络传输的数据量,提高页面加载速度。
- 服务器推送: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来对数据进行加密和保护。