Score:0

gRPC ผ่าน CloudFlare ส่งผลให้เกิดรหัสข้อผิดพลาดภายใน HTTP/2 2

ธง ar

การตั้งค่าของฉัน:

เซิร์ฟเวอร์ .Net gRPC <-> Nginx <-> CloudFlare <-> ไคลเอนต์ gRPC (C#/Python)

เซิร์ฟเวอร์ .Net gRPC ของฉันกำหนดค่าให้รองรับ http2 ที่ไม่ปลอดภัย ฟังที่พอร์ต 50052:

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

Nginx ถูกตั้งค่าเป็น grpc_pass ดังต่อไปนี้:

เซิร์ฟเวอร์ {
    server_name grpc.mydomain.com;
    ฟัง 443 ssl http2;
    ssl_certificate /etc/nginx/cf_origin_ssl/mydomain.pem;
    ssl_certificate_key /etc/nginx/cf_origin_ssl/mydomain.key;

    ปิด proxy_cache;
 
    ที่ตั้ง / {
        grpc_pass grpc://localhost:50052;   
    }
}

เซิร์ฟเวอร์ {
    server_name mydomain.com;
    ฟัง 443 ssl http2;
    ssl_certificate /etc/nginx/cf_origin_ssl/mydomain.pem;
    ssl_certificate_key /etc/nginx/cf_origin_ssl/mydomain.key;

    ปิด proxy_cache;
 
    ที่ตั้ง / {
        proxy_pass localhost:50051;   
    }
}

คลาวด์แฟลร์: เครือข่าย/gRPC -> บน, SSL/TLS -> เต็ม (เข้มงวด) (พร้อมใบรับรองแหล่งกำเนิดที่สร้างโดย CloudFlare) ฉันทดสอบและเว็บเซิร์ฟเวอร์ของฉันที่ มายโดเมน.คอม ทำงานได้ดี อย่างไรก็ตาม การเรียก gRPC จาก .Net/C# gRPC Client ส่งคืน:

ข้อยกเว้นที่ไม่สามารถจัดการได้ Grpc.Core.RpcException: สถานะ (StatusCode="Unavailable", Detail="ข้อผิดพลาดในการเริ่มต้นการโทร gRPC IOException: คำขอถูกยกเลิก http2StreamException: เซิร์ฟเวอร์ HTTP/2 รีเซ็ตสตรีม รหัสข้อผิดพลาด HTTP/2 'INTERNAL_ERROR' (0x2 ).", DebugException="System.IO.IOException: คำขอถูกยกเลิก
 ---> System.Net.Http.Http2StreamException: เซิร์ฟเวอร์ HTTP/2 รีเซ็ตสตรีม รหัสข้อผิดพลาด HTTP/2 'INTERNAL_ERROR' (0x2)
    --- สิ้นสุดการติดตามสแต็กข้อยกเว้นภายใน ---
    ที่ System.Net.Http.Http2Connection.ThrowRequestAborted (ข้อยกเว้น innerException)
    ที่ System.Net.Http.Http2Connection.Http2Stream.CheckResponseBodyState()
    ที่ System.Net.Http.Http2Connection.Http2Stream.TryReadFromBuffer (Span`1 บัฟเฟอร์, Boolean partOfSyncRead)
    ที่ System.Net.Http.Http2Connection.Http2Stream.ReadDataAsync (บัฟเฟอร์ Memory`1, HttpResponseMessage responseMessage, CancellationToken cancelToken)
    ที่ Grpc.Net.Client.StreamExtensions.ReadMessageAsync[TResponse] (Stream responseStream, GrpcCall call, Func`2 deserializer, String grpcEncoding, Boolean singleMessage, CancellationToken cancelToken)
    ที่ Grpc.Net.Client.Internal.GrpcCall`2.RunCall (คำขอ HttpRequestMessage, Nullable`1 หมดเวลา)")

ฉันยังพยายามโทร gRPC จาก Python และได้รับข้อผิดพลาดที่คล้ายกัน:

Traceback (การโทรครั้งล่าสุดล่าสุด):
    ...
    ไฟล์ "/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py", บรรทัด 946 ใน __call__
    กลับ _end_unary_response_blocking (สถานะ โทร เท็จ ไม่มี)
    ไฟล์ "/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py", บรรทัด 849 ใน _end_unary_response_blocking
    เพิ่ม _InactiveRpcError (สถานะ)
    grpc._channel._InactiveRpcError: <_InactiveRpcError ของ RPC ที่ลงท้ายด้วย:
    สถานะ = StatusCode.UNAVAILABLE
    รายละเอียด = "ไม่สามารถเชื่อมต่อกับที่อยู่ทั้งหมด"
    debug_error_string = "{"created":"@1634609018.116476058","description":"เลือกช่องย่อยไม่สำเร็จ","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":3158, "referenced_errors":[{"created":"@1634609018.116472621","description":"เชื่อมต่อกับที่อยู่ทั้งหมดล้มเหลว","file":"src/core/lib/transport/error_utils.cc","file_line": 147,"grpc_status":14}]}"
    >

ในระหว่างการจัดการข้อยกเว้นข้างต้น มีข้อยกเว้นอื่นเกิดขึ้น:

Traceback (การโทรครั้งล่าสุดล่าสุด):
    ...
    ไฟล์ "/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py", บรรทัด 946 ใน __call__
    กลับ _end_unary_response_blocking (สถานะ โทร เท็จ ไม่มี)
    ไฟล์ "/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py", บรรทัด 849 ใน _end_unary_response_blocking
    เพิ่ม _InactiveRpcError (สถานะ)
    grpc._channel._InactiveRpcError: <_InactiveRpcError ของ RPC ที่ลงท้ายด้วย:
    สถานะ = StatusCode.INTERNAL
    รายละเอียด = "ได้รับ RST_STREAM พร้อมรหัสข้อผิดพลาด 2"
    debug_error_string = "{"created":"@1634609018.553728473","description":"ข้อผิดพลาดที่ได้รับจากเพียร์ ipv4:172.67.179.119:443","file":"src/core/lib/surface/call.cc"," file_line":1069,"grpc_message":"ได้รับ RST_STREAM พร้อมรหัสข้อผิดพลาด 2","grpc_status":13}"
    >

ในทั้งสองกรณี คำขอ gRPC ได้รับผ่าน CloudFlare, Nginx และเข้าถึงเซิร์ฟเวอร์ gRPC ของฉัน (ขั้นตอนระยะไกลได้รับการดำเนินการ) บันทึก Nginx ยังรายงานด้วย 200 รหัสความสำเร็จ:

116.110.42.123 - - [19/ต.ค./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/ต.ค./2021:01:27:57 +0000] "POST /greet.Greeter/CsharpSayHello HTTP/2.0" 200 68 "-" "grpc-python/1.41.0 grpc-c/19.0 .0 (ลินุกซ์; 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=-

ฉันค้นหามากเกี่ยวกับ CloudFlare gGRPC และ Nginx แต่ไม่สามารถเข้าใจได้ว่ามีอะไรผิดปกติ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา