Как позволить Nginx Reverse Proxy работать с GRPC в .NET Core?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как позволить Nginx Reverse Proxy работать с GRPC в .NET Core?

Сообщение Anonymous »

Я сталкиваюсь с проблемой, когда я не могу заставить nginx работать должным образом с GRPC. Я использую .NET CORE 3.1 для сервера API, который поддерживает как REST, так и GRPC. /> Клиент работает локально, так как я просто подключаюсь через nginx к контейнеру Docker (порт 8080 и 443, отображенный с хостом) < /p>
Я создал изображение API в контейнере Docker, и я использую Docker, чтобы вращать все.

Код: Выделить всё

app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService();
endpoints.MapControllers();
});
< /code>
У меня есть nginx в качестве обратного прокси перед моим API, а ниже - конфигурация Nginx. Но звонки RPC не работают. Я не могу подключиться к службе GRPC через клиент, и он возвращает запрос 502.  Я получаю 2020/06/29 18:33:30 [ОШИБКА] 27#27: *3 Вверх по течению отправил слишком большой http2 кадр: 4740180. При чтении заголовок ответа из восходящего потока, клиент: 172.20.0.1 
. . После добавления отдельных конечных точек Kestral (см. My Edit1 ниже), я получаю *1 Upstream преждевременно закрытое соединение во время чтения заголовка ответа из Upstream , когда я смотрю на журналы nginx.
Фактический запрос никогда не получен сервером, так как ничто не зарегистрировано, когда я не заглядываю на то, как не заглядывает в службу поддержки. GRPC через Docker на .NET, так что не уверен, как продолжить. Что нужно настроить/включено дальше, чем то, что я должен заставить это работать? Обратите внимание, что остальная часть API работает нормально без проблем. Не уверен, что SSL нужно переносить вплоть до восходящих серверов (то есть SSL на уровне API на хорошо). < /P>
Документация, которую я видел на Nginx для GRPC, имеет именно то, что у меня есть ниже. http_v2_module включен в Nginx, и я могу проверить, что он работает для не GRPC части API через протокол ответа. < /p>

Код: Выделить всё

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>
Я также попытался раскрутить отдельные конечные точки для REST /GRPC. Из этой части документации, когда появляются небезопасные запросы, их автоматически предполагается, что это HTTP1 -запросы. Я настроил Kestrel вручную, чтобы иметь 2 отдельные конечные точки, два порта - один для HTTP1+HTTP2 и другие для запросов HTTP2.  < /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>
В nginx я также создал отдельные записи: < /p>
upstream api {
server apiserver:5001;
}
upstream grpcservice {
server apiserver:5010;
}
upstream function {
server funcserver:5002;
}
< /code>
Это тоже не работает. Я даже пробовал вверх по течению SSL через создание конечной точки HTT2 принять только SSL -соединения, но без кубиков. Proxy < /li>
 Используемые изображения на основе Debian /ubuntu вместо Alpine < /li>
< /ul>
ни один из них тоже не работает.location /CartCheckoutService/ValidateCartCheckout {
grpc_pass grpc://api;
}
По какой -то причине единственная конфигурация для Nginx, которая работает, - это только grpc_pass . Это не похоже на прокси, а другая конфигурация не требуется. Я наконец -то могу заставить это работать без необходимости выполнять вверх по течению SSL и просто использовать прокси, как я хотел - завершить SSL на прокси.>

Подробнее здесь: https://stackoverflow.com/questions/626 ... n-net-core
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Можно ли сделать что-то вроде «row-reverse» и «column-reverse» одновременно с Flexbox?
    Anonymous » » в форуме CSS
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Apache2 Reverse Proxy со страницей входа в систему PHP (проверьте сеанс VAR перед пересылкой на сервер)
    Anonymous » » в форуме Php
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Apache2 Reverse Proxy со страницей входа в систему PHP (проверьте сеанс VAR перед пересылкой на сервер)
    Anonymous » » в форуме Php
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как настроить NextJs через SSL Apache Reverse Proxy?
    Anonymous » » в форуме Apache
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Apache Reverse Proxy: как отправить уведомление всякий раз, когда происходит услуга 503.
    Anonymous » » в форуме Apache
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»