Azure Web Service中Nest.js配置HTTPS与gRPC双端口的方法
Azure Web Service + Nest.js 双端口配置解决方案(HTTPS 3001 + 安全gRPC 4001)
Azure Web App 配置步骤
1. 应用设置配置
在 Azure 门户进入你的 Web App → 配置 → 应用程序设置,添加以下键值对:
WEBSITES_PORT:3001(将外部HTTP/HTTPS流量路由到内部3001端口)HTTP20_ONLY_PORT:4001(将HTTP/2流量路由到内部4001端口,用于gRPC)WEBSITES_ENABLE_HTTP2:true(启用HTTP/2支持)GRPC_PORT:4001(可选,用于代码中统一端口变量)
2. 常规设置调整
- 将 HTTP版本 设置为
2.0 - 开启 仅HTTPS 选项,强制3001端口使用HTTPS
3. 服务计划要求
确保你的应用服务计划为 Premium V2/V3 或 Isolated 级别(Basic/Free 计划不支持自定义HTTP/2端口)
Nest.js 应用代码实现
1. 主入口文件(main.ts)
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; import { join } from 'path'; async function bootstrap() { // 启动HTTP服务(REST API,监听3001端口) const httpApp = await NestFactory.create(AppModule); httpApp.enableCors(); // 根据需求调整CORS配置 await httpApp.listen(process.env.PORT || 3001); console.log(`HTTP服务运行在 http://0.0.0.0:${process.env.PORT || 3001}`); // 启动gRPC微服务(监听4001端口) const grpcApp = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, { transport: Transport.GRPC, options: { url: `0.0.0.0:${process.env.GRPC_PORT || 4001}`, package: 'your_service', protoPath: join(__dirname, 'proto/your_service.proto'), credentials: null, // Azure在代理层终止SSL,内部使用明文通信 }, }); await grpcApp.listen(); console.log(`gRPC服务运行在 http://0.0.0.0:${process.env.GRPC_PORT || 4001}`); } bootstrap();
2. gRPC 协议文件(src/proto/your_service.proto)
syntax = "proto3"; package your_service; service DataService { rpc ProcessData (DataRequest) returns (DataResponse) {} } message DataRequest { string content = 1; } message DataResponse { string result = 1; }
3. gRPC 控制器实现
import { Controller } from '@nestjs/common'; import { GrpcMethod } from '@nestjs/microservices'; import { DataRequest, DataResponse } from './dto/grpc.dto'; @Controller() export class GrpcController { @GrpcMethod('DataService', 'ProcessData') processData(request: DataRequest): DataResponse { return { result: `处理完成:${request.content}` }; } }
4. 应用模块配置(app.module.ts)
import { Module } from '@nestjs/common'; import { GrpcController } from './grpc.controller'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { join } from 'path'; @Module({ imports: [ // 可选:如果应用需要作为gRPC客户端连接其他实例 ClientsModule.register([ { name: 'DATA_SERVICE', transport: Transport.GRPC, options: { url: `${process.env.GRPC_CLIENT_URL || 'localhost:4001'}`, package: 'your_service', protoPath: join(__dirname, 'proto/your_service.proto'), }, }, ]), ], controllers: [GrpcController], }) export class AppModule {}
多实例gRPC连接解决方案
要连接应用服务计划内的三台服务器:
- 实例发现:每个实例拥有唯一主机名格式为
<应用名>-<实例ID>.azurewebsites.net,可通过实例内的WEBSITE_INSTANCE_ID环境变量获取实例ID - 客户端配置:为每个实例配置gRPC客户端,目标URL使用
https://<应用名>-<实例ID>.azurewebsites.net:443(Azure会自动将HTTP/2流量路由到内部4001端口) - 服务发现:在HTTP API中添加一个端点,返回所有实例的主机名列表,供客户端动态发现并连接
故障排查提示
- 检查应用日志,确认HTTP和gRPC服务均监听在正确端口
- 使用
grpcurl工具测试外部gRPC端点:grpcurl -d '{"content":"测试"}' -proto your_service.proto https://<应用名>.azurewebsites.net:443 your_service.DataService/ProcessData - 确保服务计划级别符合要求(Premium/Isolated)
- 不要在Nest.js的gRPC服务中启用SSL,Azure代理层已处理SSL终止
内容的提问来源于stack exchange,提问作者Kiệt Trần Ngô Tuấn
相关产品推荐
相关产品推荐

