Puncte:0

gRPC prin CloudFlare are ca rezultat codul de eroare intern HTTP/2 2

drapel ar

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ă.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.