node.js - HAProxy 未正确运行 nodeJS API

标签 node.js docker haproxy docker-compose

我在 EC2 中运行 coreOS。 我有一个 nodeJS api docker 镜像并在几个端口(25001 和 25002)中运行它。当我向他们弯腰时,我看到了正确的回应。

我的目的是在这些之上有一个 HAProxy(在 25000 上运行),它将在这两者之间进行负载平衡。 所以这是我所做的步骤:

用于 HaProxy 的 DockerFile:

FROM haproxy:1.5
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

haproxy.cfg:

global
  # daemon
  maxconn 256
  log /dev/log local0

defaults
  mode http
  log global
  timeout connect 5000ms
  timeout client 50000ms
  timeout server 50000ms

frontend http-in
  bind *:25000
  default_backend node_api

backend node_api
    mode http
    balance roundrobin
    server api1 localhost:25001
    server api2 localhost:25002 

结果: 当我为单个服务运行curl时,它们起作用了 --->

curl -i localhost:25001/ping
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Content-Length: 68
ETag: W/"44-351401c7"
Date: Sat, 06 Jun 2015 17:22:09 GMT
Connection: keep-alive
{"error":0,"msg":"loc receiver is alive and ready for data capture"}

同样适用于 25002 但是当我运行 25000 时,我收到如下超时错误:

curl -i localhost:25000/ping
HTTP/1.0 504 Gateway Time-out
Cache-Control: no-cache
Connection: close
Content-Type: text/html

<html><body><h1>504 Gateway Time-out</h1>
The server didn't respond in time.
</body></html>

我想知道我在这里做错了什么?任何帮助将不胜感激...

最佳答案

当你告诉HAProxy后端服务器位于

server api1 localhost:25001

您正在提供一个相对于HAProxy 容器的地址。但是您的 Node 服务器没有在该容器上运行,因此本地主机上没有人。

这里有几个选项。

  • 您可以使用 docker run--link 选项将 HAProxy 连接到您的两个后端。
  • 您可以对 docker run 使用 --net=host 选项,然后您的服务器可以在 localhost 找到彼此
  • 您可以向 HAProxy 提供您的主机地址作为后端地址

第一个选项是最容器化的,但是Docker的桥接网络在高负载时性能较差。只要您不介意在网络方面让一切都脱离其容器,第二个选项就很好。第三个是kludgey,但没有其他两个问题。

Docker's article on networking有更多详细信息。

关于node.js - HAProxy 未正确运行 nodeJS API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685612/

相关文章:

node.js - Hapijs-react-views 设置

node.js - Loopback 4不会生成构建文件

django - docker容器已构建并正在运行但无法正常工作

docker - 入口 nginx digital ocean 上的 ssl 终止

load-balancing - 如何在haproxy中使用数千个后端?新的 map 功能对此有用吗?

HAProxy & Consul-模板 : retry request when scaling down

javascript - Node.js - 带有 'request' 模块的 PUT

node.js - Express 提供的 404 页面的相对路径

Docker Hub 和 git 子模块

http - HTTP负载均衡下的TCP连接和流量路由