Wie kann ich Nginx Reverse Proxy ermöglichen, mit GRPC in .NET Core zu arbeiten?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie kann ich Nginx Reverse Proxy ermöglichen, mit GRPC in .NET Core zu arbeiten?

Post by Anonymous »

Ich stieß auf ein Problem, bei dem ich nicht in der Lage bin, Nginx ordnungsgemäß mit GRPC zu arbeiten. Ich verwende .NET Core 3.1, um eine API zu server, die sowohl REST als auch Grpc unterstützt. /> Der Client wird lokal ausgeführt, da ich nur über Nginx mit dem Docker -Container verbunden bin (Port 8080 und 443 mit dem Host abgebildet) < /p>
Ich habe das API -Bild in einem Docker -Container gebaut und verwendet Docker, um alles zu spinnen.

Code: Select all

app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService();
endpoints.MapControllers();
});
< /code>
Ich habe nginx als umgekehrter Proxy vor meiner API und unten ist meine Nginx -Konfiguration. Aber die RPC -Anrufe funktionieren nicht. Ich kann keine Verbindung zum GRPC -Dienst über einen Kunden herstellen und es gibt eine 502 -Anfrage zurück.  Ich bekomme einen 2020/06/29 18:33:30 [Fehler] 27#27: *3 Upstream Sent zu groß http2 Frame: 4740180 Während der Reaktionsheader von Upstream, Client: 172.20.0.1 
. Nachdem ich separate kestrale Endpunkte hinzugefügt hat (siehe meine Edit1 unten), erhalte ich *1 vorläufige geschlossene Verbindung, während der Antwortheader von Upstream Wenn ich mich die Nginx -Protokolle ansehe. Docker auf .NET So ist sich nicht sicher, wie sie vorgehen sollen. Was muss weiter konfiguriert/aktiviert werden als das, was ich zum Laufen bringen muss? Beachten Sie, dass der restliche Teil der API ohne Probleme gut funktioniert. Sie sind sich nicht sicher, ob SSL bis zu den stromaufwärts gelegenen Servern bis hin zu API -Ebene auf API -Ebene aufgenommen werden muss. http_v2_module ist in nginx aktiviert und ich kann überprüfen, ob es für den Nicht -Grpc -Teil der API über das Antwortprotokoll funktioniert.

Code: Select all

http {
upstream api {
server apiserver:5001;
}
upstream function {
server funcserver:5002;
}

# redirect all http requests to https
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://$host$request_uri;
}
server {
server_name api.localhost;
listen 443 http2 ssl ipv6only=on;
ssl_certificate /etc/certs/api.crt;
ssl_certificate_key /etc/certs/api.key;
location /CartCheckoutService/ValidateCartCheckout {
grpc_pass grpc://api;
proxy_buffer_size          512k;
proxy_buffers              4 256k;
proxy_busy_buffers_size    512k;
grpc_set_header Upgrade $http_upgrade;
grpc_set_header Connection "Upgrade";
grpc_set_header Connection keep-alive;
grpc_set_header Host $host:$server_port;
grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
grpc_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://api;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Connection keep-alive;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
server {
server_name func.localhost;
listen 443 ssl;
ssl_certificate /etc/certs/func.crt;
ssl_certificate_key /etc/certs/func.key;
location / {
proxy_pass http://function;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
gzip on;
gzip_vary on;
gzip_proxied no-cache no-store private expired auth;
gzip_types text/plain text/css application/json application/xml;
}
< /code>

 edit1: < /strong>
Ich habe auch versucht, separate Endpunkte für REST /GRPC zu spinnen. Aus dieser Dokumentation, wenn unsichere Anfragen eingeht, werden automatisch angenommen, dass sie HTTP1 -Anfragen sind. Ich habe Kestrel manuell konfiguriert, um 2 separate Endpunkte, zwei Ports zu haben - eine für http1+http2 und eine für http2 -Anforderungen.  < /P>
services.Configure(y =>
{
y.ListenAnyIP(5010, o =>
{
o.Protocols = HttpProtocols.Http2;
//o.UseHttps("./certs/backend.pfx", "password1");
});

y.ListenAnyIP(5001, o =>
{
o.Protocols = HttpProtocols.Http1AndHttp2;
});
});
< /code>
In nginx habe ich auch separate Einträge erstellt: < /p>
upstream api {
server apiserver:5001;
}
upstream grpcservice {
server apiserver:5010;
}
upstream function {
server funcserver:5002;
}
< /code>
Dies funktioniert auch nicht. Ich habe sogar versucht, SSL vorgeleitet, indem ich den HTT2 -Endpunkt nur SSL -Verbindungen akzeptierte, aber keine Würfel. Proxy < /li>
 Gebrauchte Bilder von Debian /Ubuntu -basierten Bildern anstelle von Alpine < /li>
< /ul>
Keine davon funktioniert.location /CartCheckoutService/ValidateCartCheckout {
grpc_pass grpc://api;
}
Aus irgendeinem Grund ist die einzige Konfiguration für Nginx, die funktioniert, nur grpc_pass . Es ähnelt nicht dem Proxy -Pass und die andere Konfiguration ist nicht erforderlich. Ich bin endlich in der Lage, dies zum Laufen zu bringen, ohne die stromaufwärts gelegene SSL durchführen zu müssen und den Proxy so zu verwenden, wie ich es wollte - SSL am Proxy beenden.
Ich suche immer noch nach einer formal>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post