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