我使用 haproxy 对多个虚拟机(Web 服务)进行负载均衡。每个虚拟机都有多个 IP 地址。
在 haproxy 上进行设置的最佳做法是什么?现在我的配置是虚拟机的每个IP在haproxy上都有一个条目“listen”,对应的两个真实服务器。
请问它是否可以像多个“监听”和只有两个后端服务器一样修改。因为所有“侦听 IP”仅转发到同一虚拟机。
global
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
stats socket /var/run/haproxy.stat mode 666
maxconn 4096
user haproxy
group haproxy
daemon
defaults
mode http
log global
log 127.0.0.1 local0 notice
option dontlognull
option redispatch
timeout connect 10000 # default 10 second time out if a backend is not foun
timeout client 300000
timeout server 300000
maxconn 60000
retries 3
listen stats
bind xx.xxx.xxx.xxx:8888
stats uri /
stats realm Haproxy\ Statistics
stats auth user:pass …Run Code Online (Sandbox Code Playgroud) 我正在测试运行 HAProxy 作为 Apache 2.2 后面的专用负载均衡器,替换我们当前使用 Apache 负载均衡器的配置。在我们当前的 Apache 设置中,如果所有后端(源)服务器都关闭,Apache 将提供 503 服务不可用消息。使用 HAProxy,我得到 502 错误的网关响应。
我在 Apache 中使用了一个简单的反向代理重写规则
RewriteRule ^/(.*) http://127.0.0.1:8000/$1 [last,proxy]
Run Code Online (Sandbox Code Playgroud)
在 HAProxy 我有以下(在默认 tcp 模式下运行)
defaults
log global
option tcp-smart-accept
timeout connect 7s
timeout client 60s
timeout queue 120s
timeout server 60s
listen my_server 127.0.0.1:8000
balance leastconn
server backend1 127.0.0.1:8001 check observe layer4 maxconn 2
server backend1 127.0.0.1:8001 check observe layer4 maxconn 2
Run Code Online (Sandbox Code Playgroud)
在后端服务器关闭时测试直接连接到负载均衡器:
[root@dev ~]# wget http://127.0.0.1:8000/ test.html
--2012-05-28 11:45:28-- http://127.0.0.1:8000/
Connecting to 127.0.0.1:8000... connected.
HTTP …Run Code Online (Sandbox Code Playgroud) 如何将真实访客的 IP 地址转发给 Unicorn?目前的设置是:
Haproxy => Nginx => Unicorn
Run Code Online (Sandbox Code Playgroud)
Haproxy 配置:
# haproxy config
defaults
log global
mode http
option httplog
option dontlognull
option httpclose
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
# Rails Backend
backend deployer-production
reqrep ^([^\ ]*)\ /api/(.*) \1\ /\2
balance roundrobin
server deployer-production localhost:9000 check
Run Code Online (Sandbox Code Playgroud)
Nginx 配置:
upstream unicorn-production {
server unix:/tmp/unicorn.ordify-backend-production.sock fail_timeout=0;
}
server {
listen …Run Code Online (Sandbox Code Playgroud) 例如,对于haproxy(第7层)负载均衡,只需要配置VIP(即集群IP)后面的“真实服务器”或“后端”即可。例如:
listen smtp 192.168.3.10:25
mode tcp
balance roundrobin
server smtp1 192.168.3.1:25 check
server smtp1 192.168.3.2:25 check
Run Code Online (Sandbox Code Playgroud)
但是,对于lvs(第 4 层),我需要:
lvs机设置为路由器,实现“NAT路由”lvs机和后端都配置有与后端的一些ARP MODS的VIP如果没有更复杂的配置,第 7 层负载平衡如何设法做到这一点?我在这里误解或遗漏了一些基本的东西吗?
我的服务器正在 4 个本地 websocket 服务器上分发 websocket 客户端连接。
是否可以指示 haProxy 仅接受 WebSocket 版本 13 (RFC 6455)?
即验证是否Sec-WebSocket-Version: 13设置
连接到 ipv6 子域 www6.example.com 需要很长时间。在 chrome 中,net 选项卡显示“连接”花费了 20 秒。所有其他时间都快得多。
然而,只有前两个连接很慢(有时是 21 秒、41 秒、24 秒)。以下请求远低于 1 秒。等待约 2 分钟,前 2 个请求再次该死的慢。
通过 ipv4 子域 www.example.com 调用同一个服务器(同时)相当快。
通过 ipv6 调用其他服务器(同时)也相当快。
在服务器上运行 ubuntu 精确与 haproxy。处理的大部分流量是 ipv4。
服务器端有这么长时间才建立连接是什么问题?
我很高兴获得任何见解,并热衷于提供更多信息。

编辑:添加了来自 chrome 的屏幕截图。
我们试图让 HAProxy 侦听来自端口 443(HTTPS 和 WSS)的所有传入流量
下面是我们的 HAProxy 配置:
frontend wwws
bind 0.0.0.0:443 ssl crt /etc/haproxy/server.pem
timeout client 1h
default_backend www_backend
backend www_backend
mode http
stats enable
stats uri /haproxy
option forwardfor
reqadd x-forwarded-proto:\ https
server server1 backend:3000 weight 1 maxconn 8192 check
Run Code Online (Sandbox Code Playgroud)
0.0.0.0:443(例如https://example.com)是我们的 HA 代理服务器,它监听所有传入的 443 流量后端:3000 是我们的 nginx 服务器,它被设置为监听 SSL 连接
我们现在面临的当前问题是,当我们输入https://example.com 时,浏览器显示以下错误:
400 Bad Request
The plain HTTP request was sent to HTTPS port
nginx/1.7.5
Run Code Online (Sandbox Code Playgroud)
当 haproxy 将流量转发到 nginx(后端:3000)时,它似乎确实会转换为 http。
我认为“reqadd x-forwarded-proto:\ https”应该确保它是https。 …
我正在尝试实现这种情况:
仅在特定路径上,我在前端收到稳定的 9 个请求/秒。一切都很好,使用常规后端。我现在收到 11 req/s,我想拒绝任何超过 10 的请求。但仍然想继续回复最大 10 req/sec。
我发现并尝试实现的所有内容(如下所示:https : //blog.codecentric.de/en/2014/12/haproxy-http-header-rate-limiting/)都是黑色或白色的解决方案,一旦率达到。所以它是一种防止 DDOS、滥用者的保护,但不是真正的速率限制解决方案。
有什么方法可以实现吗?
PS:使用 HAproxy 1.5.8
我有问题haproxy。每次关闭 virtuoso 时,haproxy 都会显示以下错误消息:
来自 syslogd@master0 的消息于 7 月 9 日 14:39:18 ... haproxy[4403]:后端 virtuoso 没有可用的服务器!
我找到了 他们建议使用的以下链接,*.emerg;local2.none  *但我真的不明白它如何提供帮助以及它应该在配置文件中的位置。
如何修改配置文件以隐藏错误消息。
#$export HAPROXY=/scratch_globa/HAProxy/haproxy-1.5.12-dist
global
log /dev/log local0
log /dev/log local1 notice
user test
group test_1
maxconn 8890
daemon
defaults
log global
mode http
option httplog
option dontlognull
#
# Listen on *:80 - Send traffic to the backend named "apache"
#
frontend www-http
bind *:8890
default_backend virtuoso
#
# Back-end definition.
#
backend …Run Code Online (Sandbox Code Playgroud) 我有一个当前的 Linux 系统,我想与 haproxy 一起使用。Journald 很乐意从 中记录 stdout .service,并将日志标记为来自该服务,但haproxy 似乎无法登录到 stdout。
让 haproxy 登录到 systemd/journald 的最简单、最干净的方法是什么?
编辑:当前配置是默认值:
global
log 127.0.0.1 local2
Run Code Online (Sandbox Code Playgroud)
但是没有local2设施,因为本地机器上没有系统日志。