OS X 中的 Nginx 配置

Nginx configuration in OS X

我想为 gRPC 客户端和服务器进行服务器端负载平衡,并尝试为 OS X 提供简单的 Nginx 配置。我在端口 50051 上有 2 个服务器 运行ning和 50052,这是我启动服务器:

Server server = ServerBuilder.forPort(50051)
                .addService(new ImageStreamingServerImpl())
                .addService(ProtoReflectionService.newInstance())
//                .useTransportSecurity(
//                        new File("ssl/server.crt"),
//                        new File("ssl/server.pem")
//                )
                .build();
        
        server.start();

这是我的 Nginx 配置:

worker_processes  1;

error_log  /usr/local/var/log/nginx/error.log;

events {
    worker_connections  10;
}

http {
    access_log  /usr/local/var/log/nginx/access.log;

    upstream backend {
        server 0.0.0.0:50051;
        server 0.0.0.0:50052;
    }

    server {
        listen 8080;

        location / {
            grpc_pass grpc://backend;
        }
    }
}

所以我的想法是客户端可以通过Nginx监听8080端口并像以前一样执行代码。客户端创建如下:

  ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080)
                .usePlaintext()
                .build();

//        ManagedChannel channel = NettyChannelBuilder.forAddress("localhost", 8080)
//                .sslContext(GrpcSslContexts.forClient().trustManager(new File("ssl/ca.crt")).build())
//                .build();
        
        FileServiceGrpc.FileServiceStub imageStreamingClient = FileServiceGrpc.newStub(channel);

以前,客户端和服务器可以在没有 Nginx 的情况下 运行 在同一个端口(比如 50051 或 50052)中体面。为什么这现在不起作用?

原型文件如下:

语法 = "proto3";

选项java_multiple_files = 真; 包裹 com.grpc.protobuf;

message DownloadFileRequest {
  string url = 1;
}

message DataChunk {
  bytes data = 1;
  int32 size = 2;
}

service FileService {
  rpc downloadFile (DownloadFileRequest) returns (stream DataChunk);
}

为了简化起见,我省略了 TLS 加密。

您似乎没有将 Nginx 配置为启用 HTTP2,这是 gRPC 使用的协议。

试试:

server {
   listen 8080 http2; 
   ....
}