การตั้งค่าของฉัน:
เซิร์ฟเวอร์ .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 แต่ไม่สามารถเข้าใจได้ว่ามีอะไรผิดปกติ