docker Kong 502 Bad Gateway:“从上游服务器收到无效响应”

gzjq41n4  于 2023-11-17  发布在  Docker
关注(0)|答案(2)|浏览(209)

TL;DR

我无法通过Kong网关向本地Docker容器(可通过127.0.0.1:4002访问)发送HTTP请求。
Kong Gateway组件:

  • 服务test_serviceurl=http://127.0.0.1:4002;
  • 路由test_routepaths[]=/testname=test_route;

请求Kong代理:

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

字符串

长版本

我创建了一个简单的Express应用程序,它使用“Foo”和“Bar”响应HTTP请求,并将其码头化。

应用

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}`)
})

Dockerfile

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


在构建并运行它之后,我可以向“localhost:4002”发送HTTP请求并正确地获得响应。
示例如下:

$ 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

Kong设置

我使用了instructions to setup Kong Gateway on Dockermanage services and routes
1.我运行Kong Gateway容器:

curl -Ls https://get.konghq.com/quickstart | bash


1.已测试连接:

$ curl --head localhost:8001
HTTP/1.1 200 OK
[...]


1.创建一个服务:

$ 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:

{
  "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.创建一条路线:

$ curl -i -X POST http://localhost:8001/services/test_service/routes --data 'paths[]=/test' --data name=test_route


路由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
}

问题

当我尝试发送HTTP请求时,我得到错误“从上游服务器接收到无效响应"。

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

提问

我的配置(服务/路由)是否错误?我是否错过了某些设置步骤?

kxe2p93d

kxe2p93d1#

问题主要在于如何将Kong与Docker上的服务连接起来。
服务http://127.0.0.1:4002意味着Kong将使用端口4002调用 127.0.0.1(localhost),基本上调用的是Kong容器本身,而不是您的Java应用程序。
要解决这个问题,请在同一个用户定义的网络上运行您的Java JS应用程序和Kong,并使用Docker的服务名称(在本例中为nice_blackwell)调用该应用程序。
也许创建一个合成文件只是为了更容易管理。

plicqrtu

plicqrtu2#

Related GitHub thread
正如Ponsakorn30214所述,请求失败是因为(显然)从Kong Docker容器的Angular 来看,url=http://127.0.0.1:4002意味着“localhost”。

替代方案

解决这个问题的另一种可能性是使用两个容器运行的机器的私有IP地址,但如果IP地址被重新分配,这将中断。

补丁

使用以下命令修补Kong服务(假设主机IP地址为192.168.XXX.XXX):

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

字符串

结果

测试对网关的HTTP请求:

$ 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

相关问题