在 Express 应用中启用 HTTP/2 支持通常可以采用哪些技术方案?请说明各自的适用场景、配置要点以及需要注意的限制。
考察说明
考察对 Node.js HTTP/2 实现与 Express 框架整合的掌握程度,以及实际部署中的方案选型能力。
回答思路
- 【回答框架 1】HTTP/2 是二进制分帧协议,支持多路复用、头部压缩、服务端推送,但 Express 底层基于 HTTP/1.1,不直接支持 HTTP/2。实现方式主要有三种:使用 spdy 中间件、使用 http2 模块与 Express 结合、或通过反向代理如 Nginx 终止 HTTP/2。
- 【回答框架 2】方案一:使用 spdy 中间件。spdy 支持 HTTP/2 与 SPDY,配置简单,但已不维护,内置 OpenSSL 生成证书,通过 createServer 传入 Express app,需注意旧版依赖和安全隐患。
- 【回答框架 3】方案二:使用 Node.js 内置 http2 模块。创建 HTTP2SecureServer,传入 Express app 作为回调,但 Express 的请求处理基于 req/res 对象,HTTP/2 推送需额外封装,且中间件兼容性需测试。
- 【回答框架 4】方案三:通过反向代理(如 Nginx)终止 HTTP/2,将请求转为 HTTP/1.1 转发给 Express。这是生产环境最稳健的方法,可实现 TLS 终结、负载均衡,Express 无需改动,但需配置代理协议头(如 X-Forwarded-*)以保留客户端信息。
- 【回答框架 5】实际部署需考虑:HTTP/2 必须启用 TLS;浏览器与服务器需协商 ALPN;Express 的路由、中间件一般兼容,但 req.socket 等底层 API 可能有差异;推送功能需手动实现且利用率有限。
- 【关键点 1】Express 本身不原生支持 HTTP/2
- 【关键点 2】可用 spdy 中间件或 http2 模块直接集成
- 【关键点 3】生产推荐 Nginx 反向代理终止 HTTP/2
- 【关键点 4】需启用 TLS 并正确配置 ALPN
- 【关键点 5】注意 Express 对 HTTP/2 流式响应的兼容性
- 【易错点 1】不要混淆 HTTP/2 与 SPDY 协议
- 【易错点 2】直接使用 http2 模块时需处理 Express 中间件对 req/res 的异常访问
- 【易错点 3】忽略反向代理时的协议头设置导致客户端 IP 或协议信息错误