You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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连接解决方案

要连接应用服务计划内的三台服务器:

  1. 实例发现:每个实例拥有唯一主机名格式为 <应用名>-<实例ID>.azurewebsites.net,可通过实例内的WEBSITE_INSTANCE_ID环境变量获取实例ID
  2. 客户端配置:为每个实例配置gRPC客户端,目标URL使用https://<应用名>-<实例ID>.azurewebsites.net:443(Azure会自动将HTTP/2流量路由到内部4001端口)
  3. 服务发现:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:35:14