使用Nginx在Linux上托管ASP.NET核心grpc服务

kfgdxczn  于 2022-11-02  发布在  Nginx
关注(0)|答案(1)|浏览(152)

我尝试asp.net用nginx在linux(ubuntu 20.04)上托管我的www.example.com核心(.NET 6.0)grpc服务。我设法用以下步骤使托管工作
1.首先安装nginx并使用此链接设置服务器块**(服务器块:)vm2.arzval.com*
1.在下一步中使用“Let 's Encrypt using this link”保护Nginx,并在我的域(www.example.com)上安装SSL vm2.arzval.com
1.接下来在我的虚拟机上安装aspnetcore-runtime-6.0
1.最后将我发布的文件粘贴到VM上,并使用this link来配置nginx以支持grpc和HHTP/2协议
显然,一切都是正确的,但当我使用一个示例克林特(.net 6控制台应用程序)项目连接我的grpc服务器时,发生了以下错误

Status(StatusCode="Unavailable", Detail="Bad gRPC response. HTTP status code: 502")

下面是我在第三行抛出一个Exception示例。

using var channel = GrpcChannel.ForAddress("https://vm2.arzval.com");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                   new HelloRequest { Name = "GreeterClient" });

这是我的csproj服务器文件

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.40.0" />
  </ItemGroup>

</Project>

appsetting.json文件内容

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Kestrel": {
    "Endpoints": {
      "Grpc": {
        "Url": "https://localhost:5001",
        "Protocols": "Http2"
      }
    }
  }
}

program.cs

using GrpcService.Services;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using System.Net.Security;

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(options =>
{
    // gRPC
    options.ListenAnyIP(5001, o => o.Protocols = HttpProtocols.Http2);
});
// Additional configuration is required to successfully run gRPC on macOS.
// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682

// Add services to the container.
builder.Services.AddGrpc();

var app = builder.Build();

if (app.Environment.IsProduction())
{
    app.UseHttpsRedirection();
}
// Configure the HTTP request pipeline.
app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");

app.Run();

这是我的nginx服务器块配置文件

server {

        root /var/www/vm2.arzval.com/html;

        server_name vm2.arzval.com;

        location /greet.Greeter {
            grpc_pass grpc://127.0.0.1:5001;
        }

    listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/vm2.arzval.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/vm2.arzval.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = vm2.arzval.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

        listen 80;
        listen [::]:80;

        server_name vm2.arzval.com;
    return 404; # managed by Certbot

}

我不知道我的错误在哪里关于如何解决这个错误有什么建议吗?提前感谢。

wztqucjr

wztqucjr1#

更新nginx服务器块配置

server {

           root /var/www/vm2.arzval.com/html;

            server_name vm2.arzval.com;

            location / {
               proxy_pass         http://dotnetapi;
               proxy_http_version 1.1;
               proxy_set_header   Upgrade $http_upgrade;
               proxy_set_header   Connection keep-alive;
               proxy_set_header   Host $host;
               proxy_cache_bypass $http_upgrade;
               proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
               proxy_set_header   X-Forwarded-Proto $scheme;
            }
            location /greet.Greeter {
                grpc_pass              grpc://dotnetgrpc;
            }

        listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot
        listen 443 ssl http2; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/vm2.arzval.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/vm2.arzval.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }
    server {
        if ($host = vm2.arzval.com) {
            return 301 https://$host$request_uri;
        } # managed by Certbot

            listen 80;
            listen [::]:80;

            server_name vm2.arzval.com;
        return 404; # managed by Certbot

    }
    upstream dotnetapi {
        zone dotnet 64k;
        server 127.0.0.1:5000;
    }
    upstream dotnetgrpc {
        zone dotnet 64k;
        server 127.0.0.1:7332;
    }

appsetting.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Kestrel": {
    "Endpoints": {
      "http": {
        "Url": "http://localhost:5000",
        "Protocols": "Http1AndHttp2"
      },
      "Grpc": {
        "Url": "http://localhost:7332",
        "Protocols": "Http2"
      }
    }
  }
}

Program.cs

using GrpcService.Services;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using System.Net.Security;

var builder = WebApplication.CreateBuilder(args);
// Additional configuration is required to successfully run gRPC on macOS.
// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682

// Add services to the container.
builder.Services.AddGrpc();
builder.Services.AddControllers();

var app = builder.Build();

if (app.Environment.IsProduction())
{
    app.UseHttpsRedirection();
}
// Configure the HTTP request pipeline.
app.MapGrpcService<GreeterService>();
app.MapControllers();
app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");

app.Run();

一切都必须解决

相关问题