Configurația mea:
.Net gRPC Server <-> Nginx <-> CloudFlare <-> client gRPC (C#/Python)
Serverul meu .Net gRPC a fost configurat să accepte http2 nesecurizat, ascultați la port 50052
:
webBuilder.UseStartup<StartupGrpc>().UseUrls($"http://*:50052");
webBuilder.ConfigureKestrel(serverOptions => { serverOptions.ConfigureEndpointDefaults(listenOptions => { listenOptions.Protocols = HttpProtocols.Http2; }); });
Nginx este setat la grpc_pass
după cum urmează:
Server {
nume_server grpc.mydomain.com;
asculta 443 ssl http2;
ssl_certificate /etc/nginx/cf_origin_ssl/mydomain.pem;
ssl_certificate_key /etc/nginx/cf_origin_ssl/mydomain.key;
proxy_cache dezactivat;
Locație / {
grpc_pass grpc://localhost:50052;
}
}
Server {
nume_server domeniul meu.com;
asculta 443 ssl http2;
ssl_certificate /etc/nginx/cf_origin_ssl/mydomain.pem;
ssl_certificate_key /etc/nginx/cf_origin_ssl/mydomain.key;
proxy_cache dezactivat;
Locație / {
proxy_pass localhost:50051;
}
}
CloudFlare: Rețea/gRPC
-> Pe
, SSL/TLS
-> Complet (strict)
(cu certificate de origine generate de CloudFlare).
Am testat, iar serverul meu web la mydomain.com
a funcționat bine. Cu toate acestea, apelurile gRPC de la .Net/C# gRPC Client returnează:
Excepție netratată. Grpc.Core.RpcException: Status(StatusCode="Unavailable", Detail="Eroare la pornirea apelului gRPC. IOException: Solicitarea a fost anulată. Http2StreamException: Serverul HTTP/2 resetează fluxul. Cod de eroare HTTP/2 „INTERNAL_ERROR” (0x2) ).", DebugException="System.IO.IOException: Solicitarea a fost anulată.
---> System.Net.Http.Http2StreamException: Serverul HTTP/2 resetează fluxul. Cod de eroare HTTP/2 „INTERNAL_ERROR” (0x2).
--- Sfârșitul urmăririi stivei de excepții interioare ---
la System.Net.Http.Http2Connection.ThrowRequestAborted(Exception innerException)
la System.Net.Http.Http2Connection.Http2Stream.CheckResponseBodyState()
la System.Net.Http.Http2Connection.Http2Stream.TryReadFromBuffer (tampon Span`1, boolean partOfSyncRead)
la System.Net.Http.Http2Connection.Http2Stream.ReadDataAsync(Memory`1 buffer, HttpResponseMessage responseMessage, CancellationToken cancellationToken)
la Grpc.Net.Client.StreamExtensions.ReadMessageAsync[TResponse](Stream responseStream, apel GrpcCall, deserializator Func`2, String grpcEncoding, Boolean singleMessage, CancellationToken cancellationToken)
la Grpc.Net.Client.Internal.GrpcCall`2.RunCall(HttpRequestMessage request, Nullable`1 timeout)")
De asemenea, am încercat să fac apeluri gRPC din Python și am primit o eroare similară:
Traceback (cel mai recent apel ultimul):
...
Fișierul „/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py”, linia 946, în __call__
return _end_unary_response_blocking(state, call, False, None)
Fișierul „/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py”, rândul 849, în _end_unary_response_blocking
ridică _InactiveRpcError(stare)
grpc._channel._InactiveRpcError: <_InactiveRpcError a RPC care s-a încheiat cu:
status = StatusCode.UNAVAILABLE
detalii = „conectarea eșuată la toate adresele”
debug_error_string = "{"created":"@1634609018.116476058","description":"Eșuat la alegerea subcanalului","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":3158, "referenced_errors":[{"created":"@1634609018.116472621","description":"nu s-a putut conecta la toate adresele","file":"src/core/lib/transport/error_utils.cc","file_line": 147,"grpc_status":14}]}"
>
În timpul gestionării excepției de mai sus, a apărut o altă excepție:
Traceback (cel mai recent apel ultimul):
...
Fișierul „/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py”, linia 946, în __call__
return _end_unary_response_blocking(state, call, False, None)
Fișierul „/home/user/miniconda/lib/python3.9/site-packages/grpc/_channel.py”, rândul 849, în _end_unary_response_blocking
ridică _InactiveRpcError(stare)
grpc._channel._InactiveRpcError: <_InactiveRpcError a RPC care s-a încheiat cu:
status = StatusCode.INTERNAL
detalii = „RST_STREAM primit cu codul de eroare 2”
debug_error_string = "{"created":"@1634609018.553728473","description":"Eroare primită de la peer ipv4:172.67.179.119:443","file":"src/core/lib/surface/call.cc"," file_line":1069,"grpc_message":"S-a primit RST_STREAM cu codul de eroare 2","grpc_status":13}"
>
În ambele cazuri, solicitările gRPC au ajuns prin CloudFlare, Nginx și au ajuns la serverul meu gRPC (procedurile de la distanță au fost executate). Jurnalele Nginx au fost, de asemenea, raportate cu 200
cod de succes:
116.110.42.123 - - [19/Oct/2021:01:25:22 +0000] "POST /greet.Greeter/CsharpSayHello HTTP/2.0" 200 64 "-" "grpc-dotnet/2.40.162.11" " "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 grp.0-c/1 grp. .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=-
Am căutat pe google multe despre CloudFlare gGRPC și Nginx, dar nu mi-am putut da seama ce este în neregulă.