【问题标题】:HAProxy not running nodeJS API correctlyHAProxy 没有正确运行 nodeJS API
【发布时间】:2015-08-21 12:43:49
【问题描述】:

我在 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>

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

【问题讨论】:

  • 你是如何启动你的 Docker 容器的?
  • Docker 运行 -d -p 25000:25000 镜像名称
  • 那是给哈的。对于节点容器 - docker run -d -p 2501:2500 --name api1 image

标签: node.js docker haproxy docker-compose


【解决方案1】:

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

server api1 localhost:25001

您提供的是相对于 HAProxy 容器的地址。但是你的节点服务器没有在那个容器上运行,所以本地主机上没有人。

这里有几个选项。

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

第一个选项是最容器化的,但是 Docker 的桥接网络在高负载时性能很差。第二种选择很好,只要您不介意在涉及网络时让所有内容都脱离其容器。第三个很笨拙,但没有其他两个问题。

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

【讨论】:

  • 感谢您的回复 - 快速提问 - 第二个选项 (--net=host) 会导致某种安全漏洞吗?
  • 看起来第三个选项是最好的......但是在 haproxy 中是新手,正在努力实现它。任何帮助都会很棒!
  • 是的,--net=host 的安全性要低得多,因为如果攻击者在容器上获得了 root 权限,那么他们就在您的主机网络堆栈中获得了 root 权限。 (不过,他们仍然必须管理最初的闯入。)
  • 一个简单的方法:在你的主机上运行ifconfig并找到你的IP地址。将该地址放入您当前拥有localhost 的HAProxy 配置中。您可以通过使用环境变量找到一些更高级的方法来使其动态化,但我认为这最好作为后续问题。
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2016-10-12
  • 2013-04-07
相关资源
最近更新 更多