Điểm:0

gRPC qua CloudFlare dẫn đến mã lỗi nội bộ HTTP/2 2

lá cờ ar

thiết lập của tôi:

Máy chủ .Net gRPC <-> Nginx <-> CloudFlare <-> máy khách gRPC (C#/Python)

Máy chủ gRPC .Net của tôi được định cấu hình để hỗ trợ http2 không an toàn, lắng nghe tại cổng 50052:

webBuilder.UseStartup<StartupGrpc>().UseUrls($"http://*:50052");
webBuilder.ConfigureKestrel(serverOptions => { serverOptions.ConfigureEndpointDefaults(listenOptions => {listenOptions.Protocols = HttpProtocols.Http2; }); });

Nginx được đặt thành grpc_pass như sau:

người phục vụ {
    server_name grpc.mydomain.com;
    nghe 443 ssl http2;
    ssl_certificate /etc/nginx/cf_origin_ssl/mydomain.pem;
    ssl_certificate_key /etc/nginx/cf_origin_ssl/mydomain.key;

    tắt proxy_cache;
 
    địa điểm / {
        grpc_pass grpc://localhost:50052;   
    }
}

người phục vụ {
    server_name mydomain.com;
    nghe 443 ssl http2;
    ssl_certificate /etc/nginx/cf_origin_ssl/mydomain.pem;
    ssl_certificate_key /etc/nginx/cf_origin_ssl/mydomain.key;

    tắt proxy_cache;
 
    địa điểm / {
        proxy_pass localhost:50051;   
    }
}

Đám mây: Mạng/gRPC -> Trên, SSL/TLS -> Đầy đủ (nghiêm ngặt) (với Chứng chỉ gốc do CloudFlare tạo). Tôi đã thử nghiệm và máy chủ web của tôi tại mydomain.com làm việc tốt. Tuy nhiên, các lệnh gọi gRPC từ .Net/C# gRPC Client trả về:

Tình huống ngoại lệ không thể xử lí được. Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="Lỗi khi bắt đầu cuộc gọi gRPC. IOException: Yêu cầu đã bị hủy bỏ. Http2StreamException: Máy chủ HTTP/2 đặt lại luồng. Mã lỗi HTTP/2 'INTERNAL_ERROR' (0x2 ).", DebugException="System.IO.IOException: Yêu cầu đã bị hủy bỏ.
 ---> System.Net.Http.Http2StreamException: Máy chủ HTTP/2 đặt lại luồng. Mã lỗi HTTP/2 'INTERNAL_ERROR' (0x2).
    --- Kết thúc dấu vết ngăn xếp ngoại lệ bên trong ---
    tại System.Net.Http.Http2Connection.ThrowRequestAborted(Ngoại lệ internalException)
    tại System.Net.Http.Http2Connection.Http2Stream.CheckResponseBodyState()
    tại System.Net.Http.Http2Connection.Http2Stream.TryReadFromBuffer(Span`1 buffer, Boolean partOfSyncRead)
    tại System.Net.Http.Http2Connection.Http2Stream.ReadDataAsync(Memory`1 buffer, HttpResponseMessage responseMessage, CancellationToken cancelToken)
    tại Grpc.Net.Client.StreamExtensions.ReadMessageAsync[TResponse](Luồng phản hồi, lệnh gọi GrpCall, trình giải mã Func`2, chuỗi grpcEncoding, Boolean singleMessage, CancellationToken cancelToken)
    tại Grpc.Net.Client.Internal.GrpcCall`2.RunCall(Yêu cầu httpRequestMessage, thời gian chờ Nullable`1)")

Tôi cũng đã thử thực hiện cuộc gọi gRPC từ Python và gặp lỗi tương tự:

Traceback (cuộc gọi gần đây nhất cuối cùng):
    ...
    Tệp "/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py", dòng 946, trong __call__
    return _end_unary_response_blocking(trạng thái, cuộc gọi, Sai, Không có)
    Tệp "/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py", dòng 849, trong _end_unary_response_blocking
    tăng _InactiveRpcError(trạng thái)
    grpc._channel._InactiveRpcError: <_InactiveRpcError của RPC đã kết thúc bằng:
    status = StatusCode.UNAVAILABLE
    chi tiết = "không thể kết nối với tất cả các địa chỉ"
    debug_error_string = "{"created":"@1634609018.116476058","description":"Không thể chọn kênh phụ","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":3158, "referenced_errors":[{"created":"@1634609018.116472621","description":"không thể kết nối với tất cả các địa chỉ","file":"src/core/lib/transport/error_utils.cc","file_line": 147,"grpc_status":14}]}"
    >

Trong quá trình xử lý ngoại lệ trên, một ngoại lệ khác đã xảy ra:

Traceback (cuộc gọi gần đây nhất cuối cùng):
    ...
    Tệp "/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py", dòng 946, trong __call__
    return _end_unary_response_blocking(trạng thái, cuộc gọi, Sai, Không có)
    Tệp "/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py", dòng 849, trong _end_unary_response_blocking
    tăng _InactiveRpcError(trạng thái)
    grpc._channel._InactiveRpcError: <_InactiveRpcError của RPC đã kết thúc bằng:
    trạng thái = StatusCode.INTERNAL
    chi tiết = "Đã nhận RST_STREAM với mã lỗi 2"
    debug_error_string = "{"created":"@1634609018.553728473","description":"Đã nhận lỗi từ máy ngang hàng ipv4:172.67.179.119:443","file":"src/core/lib/surface/call.cc"," file_line":1069,"grpc_message":"Đã nhận RST_STREAM với mã lỗi 2","grpc_status":13}"
    >

Trong cả hai trường hợp, các yêu cầu gRPC đã đi qua CloudFlare, Nginx và đến máy chủ gRPC của tôi (Quy trình từ xa đã được thực thi). Nhật ký Nginx cũng được báo cáo với 200 mã thành công:

116.110.42.123 - - [19/Oct/2021:01:25:22 +0000] "POST /greet.Greeter/CsharpSayHello HTTP/2.0" 200 64 "-" "grpc-dotnet/2.40.0.0" "116.110.42.123 " "grpc.mydomain.com" sn="grpc.mydomain.com" rt=0.002 ua="127.0.0.1:50052" us="200" ut="0.000" ul="71" cs=-
116.110.42.123 - - [19/Oct/2021:01:27:57 +0000] "POST /greet.Greeter/CsharpSayHello HTTP/2.0" 200 68 "-" "grpc-python/1.41.0 grpc-c/19.0 .0 (linux; chttp2)" "116.110.42.123" "grpc.mydomain.com" sn="grpc.mydomain.com" rt=0.001 ua="127.0.0.1:50052" us="200" ut="0.000 " ul="75" cs=-

Tôi đã tìm hiểu rất nhiều về CloudFlare gGRPC và Nginx, nhưng không thể tìm ra điều gì sai.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.