如何在LoopBack 4应用中配置使用HTTP/2协议
LoopBack 4 启用HTTP/2 实操步骤
前置说明
- 主流浏览器仅支持TLS加密的HTTP/2(h2),不支持明文HTTP/2(h2c),面向公网用户的服务必须配置合法SSL证书;明文h2c仅适合无浏览器访问的内部服务间调用场景。
- LoopBack 4 底层基于Node.js内置模块实现服务,不需要额外安装第三方HTTP/2依赖包,直接复用Node.js原生
http2模块即可。
具体操作流程
1. 准备SSL证书
- 本地开发测试可直接用openssl生成自签名证书,在项目根目录执行以下命令:
执行完成后会在当前目录生成私钥文件openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' -keyout localhost-privkey.pem -out localhost-cert.pemlocalhost-privkey.pem和证书文件localhost-cert.pem。 - 生产环境直接使用CA机构签发的SSL证书即可,证书路径不要硬编码在代码中,统一通过环境变量读取。
2. 修改REST服务配置
打开项目src/application.ts文件,按以下步骤修改配置:
- 顶部导入依赖模块:
import * as http2 from 'http2'; import * as fs from 'fs'; import { RestBindings } from '@loopback/rest'; - 在应用类构造函数的REST服务配置中,新增HTTP/2相关参数,原有端口、接口文档等配置可直接保留:
export class MyLb4Application extends BootMixin( ServiceMixin(RepositoryMixin(RestApplication)), ) { constructor(options: ApplicationConfig = {}) { super(options); // 配置REST服务 this.configure(RestBindings.SERVER).to({ // 原有配置例如 port: 3000, apiExplorer: {} 等保持不变 // 新增以下配置 protocol: 'https', httpServerOptions: { // 指定使用Node.js原生http2模块创建安全服务 createSecureServer: http2.createSecureServer, // 读取证书,优先读取环境变量配置的路径,本地开发 fallback 到自签名证书 key: fs.readFileSync(process.env.SSL_KEY_PATH ?? './localhost-privkey.pem'), cert: fs.readFileSync(process.env.SSL_CERT_PATH ?? './localhost-cert.pem'), // 开启HTTP/1.1兼容,不支持HTTP/2的老客户端会自动降级,不会直接连接失败 allowHTTP1: true, }, }); // 下方原有项目配置、路由挂载等逻辑保持不变 } }
- 如果是内部服务需要启用明文h2c,把
protocol改为http,删除证书相关配置,在httpServerOptions中增加createServer: http2.createServer即可,注意该模式无法被浏览器识别。
3. 验证HTTP/2是否生效
- 正常启动应用:
npm start - 命令行验证:执行以下curl命令,返回响应头第一行为
HTTP/2 200即为配置生效:
命令中curl -I --http2 -k https://localhost:3000/ping-k参数用于忽略本地自签名证书的校验,生产环境验证时去掉该参数即可。 - 浏览器验证:访问
https://localhost:3000/explorer,打开开发者工具-网络面板,勾选协议列,对应请求的协议显示为h2即为正常。
常见注意事项
- Node.js版本建议使用16.x/18.x LTS版本,12.x以下版本的原生http2模块存在已知内存泄漏、握手兼容问题,不建议使用。
- 如果服务前端挂载了Nginx、CDN等反向代理,需要在代理层同步开启HTTP/2配置,并透传协议相关请求头,否则仅客户端到代理段走HTTP/2,代理到应用段仍为HTTP/1.1,无法获得全链路性能收益。
- 证书、私钥文件不要提交到代码仓库,生产环境通过环境变量、配置中心统一管理,同时严格控制文件读取权限。
- 如果应用同端口部署了Socket.IO服务,需要将Socket.IO升级到3.x及以上版本,低版本不兼容HTTP/2握手逻辑,会出现连接失败问题。
内容的提问来源于stack exchange,提问作者user3170450
相关产品推荐
相关产品推荐

