AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77488295
Accepted
mikyll98
mikyll98
Asked: 2023-11-15 21:54:36 +0800 CST2023-11-15 21:54:36 +0800 CST 2023-11-15 21:54:36 +0800 CST

Kong 502 Bad Gateway: “Uma resposta inválida foi recebida do servidor upstream”

  • 772

DR

Não consigo enviar uma solicitação HTTP para o contêiner docker local (acessível via 127.0.0.1:4002) por meio do gateway Kong.

Componentes do Gateway Kong:

  • Serviço test_service : url=http://127.0.0.1:4002;
  • Rota test_route : paths[]=/test, name=test_route;

Solicitação ao proxy Kong:

$ curl -X GET http://localhost:8000/test
{
  "message":"An invalid response was received from the upstream server",
  "request_id":"9aba1e35ea54222d9fd27c4e2eeea850"
}

Versão longa

Criei um aplicativo Express simples que responde a solicitações HTTP com "Foo" e "Bar" e o encaixei.

Aplicativo

index.js :

const express = require('express');

const app = express();
var port = 4002;

app.use("/foo", (req, res) => {
    res.send("Foo");
});

app.use("/bar", (req, res) => {
  res.send("Bar");
});

app.use((req, res) => {
  res.send("Test unknown path");
});

app.listen(port, () => {
  console.log(`Foo-bar listening on port ${port}`)
})

Arquivo Docker :

FROM node:lts-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 4002
CMD ["node", "index.js"]

Depois de compilá-lo e executá-lo, posso enviar solicitações HTTP para "localhost:4002" e obter as respostas corretamente.

Exemplo:

$ docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED              STATUS                 PORTS                                             NAMES
fce1cc4e7b24   mikyll/test-service:latest   "docker-entrypoint.s…"   About a minute ago   Up About a minute      0.0.0.0:4002->4002/tcp                            nice_blackwell

$ curl -X GET http://localhost:4002
Test unknown path

$ curl -X GET http://localhost:4002/foo
Foo

$ curl -X GET http://localhost:4002/bar
Bar

Configuração do Kong

Segui as instruções para configurar o Kong Gateway no Docker e gerenciar serviços e rotas :

  1. Eu executo o contêiner Kong Gateway:
curl -Ls https://get.konghq.com/quickstart | bash
  1. Testei a conexão:
$ curl --head localhost:8001
HTTP/1.1 200 OK
[...]
  1. Criou um serviço:
$ curl -i -s -X POST http://localhost:8001/services --data name=test_service --data url='http://127.0.0.1:4002'
HTTP/1.1 201 Created
[...]

JSON de serviço:

{
  "data":[
    {
      "retries":5,
      "tls_verify":null,
      "protocol":"http",
      "port":4002,
      "updated_at":1700054325,
      "created_at":1700054325,
      "connect_timeout":60000,
      "read_timeout":60000,
      "client_certificate":null,
      "host":"127.0.0.1",
      "path":null,
      "name":"test_service",
      "enabled":true,
      "tags":null,
      "write_timeout":60000,
      "ca_certificates":null,
      "id":"e79539ca-603b-4237-8abd-6ff07bd73160",
      "tls_verify_depth":null
    }
  ],
  "next":null
}
  1. Criou uma rota:
$ curl -i -X POST http://localhost:8001/services/test_service/routes --data 'paths[]=/test' --data name=test_route

Rota JSON:

{
  "data":[
    {
      "https_redirect_status_code":426,
      "service":{
        "id":"e79539ca-603b-4237-8abd-6ff07bd73160"
      },
      "id":"4b04a262-6229-4361-9b2c-88f00b0fe6c2",
      "hosts":null,
      "path_handling":"v0",
      "updated_at":1700054404,
      "created_at":1700054404,
      "preserve_host":false,
      "headers":null,
      "methods":null,
      "sources":null,
      "destinations":null,
      "paths":[
        "/test"
      ],
      "snis":null,
      "name":"test_route",
      "tags":null,
      "request_buffering":true,
      "response_buffering":true,
      "protocols":[
        "http",
        "https"
      ],
      "regex_priority":0,
      "strip_path":true
    }
  ],
  "next":null
}

Problema

Quando tento enviar uma solicitação HTTP, recebo o erro "Uma resposta inválida foi recebida do servidor upstream.":

$ curl -X GET http://localhost:8000/test
{
  "message":"An invalid response was received from the upstream server",
  "request_id":"9aba1e35ea54222d9fd27c4e2eeea850"
}

Pergunta

Minha configuração (serviço/rota) está errada? Estou faltando alguma etapa de configuração?

node.js
  • 2 2 respostas
  • 35 Views

2 respostas

  • Voted
  1. Best Answer
    Ponsakorn30214
    2023-11-15T22:28:35+08:002023-11-15T22:28:35+08:00

    O problema é principalmente como você conecta o Kong ao seu serviço no Docker.
    O serviço http://127.0.0.1:4002significa que Kong chamará 127.0.0.1 (localhost) com a porta 4002, basicamente chamando o próprio contêiner Kong, não o aplicativo Expressjs.

    Para corrigir o problema, execute o aplicativo ExpressJS e o Kong na mesma rede definida pelo usuário e chame o aplicativo com o nome de serviço do Docker (nice_blackwell, neste caso).
    Talvez crie um arquivo de composição apenas para facilitar o gerenciamento.

    • 1
  2. mikyll98
    2023-11-15T22:41:21+08:002023-11-15T22:41:21+08:00

    Tópico relacionado do GitHub

    Conforme afirmado por Ponsakorn30214 , as solicitações estão falhando porque (obviamente) url=http://127.0.0.1:4002significa "localhost" do ponto de vista do contêiner do docker Kong.

    Solução alternativa

    Outra possibilidade de resolver o problema seria usar o endereço IP privado da máquina em que ambos os contêineres estão sendo executados, mas isso será interrompido caso o endereço IP seja reatribuído.

    Correção

    Corrija o serviço Kong com o seguinte comando (suponha que o endereço IP do host seja 192.168.XXX.XXX):

    curl --request PATCH --url localhost:8001/services/test_service --data url=http://192.168.XXX.XXX:4002
    

    Resultado

    Teste a solicitação HTTP para o gateway:

    $ curl -X GET http://localhost:8000/test/test
    Foo
    
    $ curl -X GET http://localhost:8000/test/foo
    Foo
    
    $ curl -X GET http://localhost:8000/test/bar
    Bar
    
    • 0

relate perguntas

  • Não é possível encontrar o módulo "build" no Docker Container

  • Como faço para enviar para o banco de dados node.js depois de clicar no elemento html canvas?

  • Meu script de instalação para um programa trava depois de instalar o npm do node.js e não continua

  • Rest-Api Dynamic Image Path e Express excepto

  • módulo bcrypt não está funcionando de forma assíncrona

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve