标签: haproxy

负载平衡长时间运行的 TCP 连接

我正在尝试研究针对以下场景对长时间运行的 TCP 连接进行负载平衡的最佳方法:

我们在一组冗余防火墙后面有多个服务器,客户端与我们的后端服务器建立长期运行(通常 10-15 小时)的 TCP 连接。
现在,“负载平衡”是通过客户端循环方法处理的,以通过 IP 地址列表,这些 IP 地址都位于我们的防火墙中,并相应地 NAT 到后端服务器。

我想摆脱这种方法,只有一个公共 IP,并有一个单独的负载平衡器,可以检查服务器的运行状况/负载并相应地分发传入的客户端连接请求。

这里的一个问题是,每个客户端在 3 个不同的端口上建立 3 个套接字连接,如果这些连接是“粘性的”,我更喜欢,因此所有这 3 个连接请求都发送到同一个后端服务器。

我一直在研究例如 HAProxy,但我不确定它是否真的适合我的场景。我们的连接数相对较少(约 300 个客户端 * 每个客户端 3 个套接字连接)。通常我们看到每个套接字约 15KB/s 的连续数据传输量。

非常感谢您对此的任何意见!

谢谢,

汤姆

load-balancing tcp haproxy

8
推荐指数
1
解决办法
9313
查看次数

使用 HTTP 标头的 Haproxy 负载平衡

我们正在使用 HAProxy 来平衡我们的 websocket 和 Comet 应用程序。后面有一个 HAProxy 和 3 个应用程序在运行。我们使用 HTTP 基本身份验证(将来我们将使用其他类型的身份验证,如 OAuth)来识别连接的用户。

我们不能使用常规循环,因为给定用户的连接最终在同一台服务器上很重要。在哪里并不重要,但重要的是他们使用相同的服务器。

我知道 HAProxy 是一种基于智能 cookie 的方法,但不幸的是,在我们的例子中,有时,同一用户会从不同的机器连接,所以 cookie 不起作用)。

是否可以使用 HTTP Authorization 标头的散列来进行负载平衡?另外,这更复杂,是否可以定义我们自己的散列方法?

后续问题[在威利的回应之后]:

既然可以做balance hdr(Authorization),是否可以在登录字段上做(解析后)?

另外,确切的算法是什么?我相信它的形式是hash(Authorization) % number_of_backend_server,但是,散列函数是什么,更重要的是,它是否可以调整?(或者我可以添加一个偏移量)。

我问是因为这个应用程序实际上是保持 XMPP 组件连接打开,我需要使用相同的算法对 XMPP 组件进行负载平衡toXMPP 节中的jid 由 HTTP 标头授权确定。

load-balancing http-headers haproxy socket

8
推荐指数
1
解决办法
5163
查看次数

配置 haproxy 为某个 ACL 匹配返回 204

如果有人试图访问我的 Web 服务器上的特定路径,我想返回 HTTP 204 错误代码。我可以将我的一个网络服务器设置为返回 204 错误并将 haproxy 指向它作为后端。但是,由于没有发送任何信息,我认为这应该可以从 haproxy 本身完成。无需打扰我的实际 Web 服务器。

我尝试创建一个会产生 204 错误的后端,如下所示:

frontend ...
    ...
    acl is_always204 path_beg /thisone
    use_backend always204 if is_always204
    ...

backend always204
    errorfile 404 /etc/haproxy-shared/errors/204.http
Run Code Online (Sandbox Code Playgroud)

204.http 文件包含:

HTTP/1.0 204 No Content Cache-Control: no-cache Connection: close Content-Type: image/png

当我启动 haproxy 时,出现此错误:

parsing [/etc/haproxy/haproxy:51] : status code 404 not handled, error customization will be ignored.

我想我可能会以错误的方式解决这个问题。任何人都可以建议一种方法来强制 haproxy 为给定的 acl 匹配返回 204 吗?

haproxy

8
推荐指数
1
解决办法
6974
查看次数

Haproxy“use_backend”匹配顺序

我的 HAProxy 有问题,下面是我的haproxy.cfg的片段,

acl url_a path_beg   /a
acl dom_eye hdr_dom(host) -i www.mydomin.com
use_backend eye1 if dom_eye
use_backend eye2 if dom_eye url_a
Run Code Online (Sandbox Code Playgroud)
  1. 当我访问www.mydomin.com/a 时,它使用eye2
  2. 当我访问www.mydomin.com/a/b 时,它使用eye1

但我希望所有的 url 都以/a开头,使用 eye2。

而且,我发现当像下面这样切换use_backend的顺序时,

acl url_a path_beg   /a
acl dom_eye hdr_dom(host) -i www.mydomin.com
use_backend eye2 if dom_eye url_a
use_backend eye1 if dom_eye
Run Code Online (Sandbox Code Playgroud)

它对我有用。

但是我不明白Haproxy的“匹配顺序规则”,也找不到谷歌的任何解释。

对此有何想法?

rewrite haproxy

8
推荐指数
1
解决办法
2万
查看次数

Haproxy:拒绝来自文件的用户代理流量

我正在尝试使用带有 -f 选项的 haproxy ACL 从文件中读取来拒绝来自特定用户代理的连接(通过匹配用户代理标头的子字符串)。但是它不起作用,它运行时好像忽略了配置。

有更多haproxy经验的人可以指出我缺少什么吗?或者关于如何调试这个 haproxy 配置的一些提示?

我正在运行 haproxy 1.4.18。

这是 haproxy.cfg 的摘录:

listen http 0.0.0.0:80
    acl abuser hdr_sub(user-agent) -f /etc/haproxy/abuser.lst
    tcp-request content reject if abuser
    mode http
    server www1 127.0.0.1:8080 maxconn 10000
Run Code Online (Sandbox Code Playgroud)

这是abuser.lst 文件的内容:

# annoying bots
annoyingbot1
annoyingbot2
Run Code Online (Sandbox Code Playgroud)

access-control-list blocking http-headers haproxy useragent

8
推荐指数
1
解决办法
1万
查看次数

HAProxy 切换到 500 个错误和/或服务器停机时进行备份

我只在 2 个后端服务器前面设置了一个 HAProxy,有一个特定的配置:任何请求都应该转到服务器 A;但是,如果服务器 A 返回 5xx 错误代码,则所有请求都应转到备用服务器 B。当 A 返回“up”时,所有请求都应转到 A。

我正在尝试这种配置:

backend example_cluster
        balance roundrobin
        option httpclose
        option forwardfor

        option httpchk HEAD /ping.html HTTP/1.0\r\nHost:www.example.com
        http-check disable-on-404
        default-server error-limit 1 on-error mark-down

        redirect scheme https if !{ ssl_fc }
        server node1 1.2.3.4:80 check observe layer7
        server node_back 5.6.7.8:443 backup ssl verify none
Run Code Online (Sandbox Code Playgroud)

但它不起作用有两个原因:

  1. 所有请求都路由到服务器 node_back (B),即使 node1 (A) 已启动。
  2. 似乎没有对服务器 A 执行 httpchecks;或者更好的是,在 syslog 中,我没有看到有关服务器 A 停机的任何错误。

如果我删除“option httpchk”行,以及它下面的两行;我还删除了服务器 A 中的“观察层 7”;HAProxy 通过将所有请求路由到节点 A 来工作。但是,很明显,当服务器 A 返回 500 …

proxy reverse-proxy load-balancing haproxy

8
推荐指数
1
解决办法
3502
查看次数

带有子域设置的 Haproxy 设置

希望有人可以帮助确认这是否可行?我正在尝试将 3 个子域流量路由到同一个 haproxy 主机;

这是我的设置

haproxy 具有一个接口 ip 10.10.10.100 和 dns 名称 haproxy01.mydomain.com

3个与之关联的CNAME记录;sub1.mydomain.com、sub2.mydomain.com 和 sub3.mydomain.com

所有传入流量都用于端口 443。

有两个后端应用程序服务器在三个端口 8081、8082、8083 上接受流量,比如说;

sub1.mydomain.com for 8081 sub2.mydomain.com for 8082 and sub3.mydomain.com for 8083

该应用程序仅要求端口 8081 流量通过 SSL,所以我相信我必须使用 tcp 模式,8082 和 8083 的其他流量也是 SSL,但它可以在 Haproxy 处终止,但为了测试,我使用了所有 TCP模式。

我实现这一点的配置部分如下;

    #Application Setup 
frontend mytraffic
    bind *:443
    mode  tcp
    acl host_sub1 hdr(host) -i sub1.mydomain.com
    acl host_sub2 hdr(host) -i sub2.mydomain.com
    acl host_sub3 hdr(host) -i sub3.mydomain.com

    use_backend sub1_nodes if host_sub1
    use_backend sub2_nodes if host_sub2
    use_backend sub3_nodes if …
Run Code Online (Sandbox Code Playgroud)

subdomain haproxy

8
推荐指数
1
解决办法
2万
查看次数

HaProxy - 502 错误网关:在 HTTPS 端口上使用 HTTP

我会尽力解释我的问题。

我正在研究 HaProxy 1.5.8 / apache 2.2,我尝试进行一些 SSL 配置,但我失败了,失败了,失败了。

让我们看看一些日志:

Haproxy 日志

Aug 13 17:00:28 localhost haproxy[10930]: x.x.x.x - - [13/Aug/2015:15:00:28 +0000] "URLxxxxx HTTP/1.1" 502 +656 "" "" 50567 131 "FT-https-in~" "BK-https-out" "myserver-https" 13 0 1 -1 +17 PH-- 0 0 0 0 0 0 0 "" "" 
Run Code Online (Sandbox Code Playgroud)

Apache 错误日志

[Thu Aug 13 17:02:38 2015] [debug] ssl_engine_kernel.c(1903): OpenSSL: Exit: error in SSLv2/v3 read client hello A
[Thu Aug 13 17:02:38 2015] [info] [client haproxy-server] SSL handshake failed: HTTP spoken on …
Run Code Online (Sandbox Code Playgroud)

ssl https haproxy apache-2.2

8
推荐指数
1
解决办法
8093
查看次数

HAProxy 1.7 统计设置

我已经尝试了多个网络教程来启用 HAProxy 统计(只是谷歌 haproxy 统计并尝试前 10 个链接),但我相信这些适用于较旧的 HAProxy 版本。我在 Ubuntu 16.04 LTS 上运行 1.7。

这是我的 /etc/haproxy/haproxy.cfg 文件(这包括 Datadog 提供的有关启用统计信息的说明)。

如果我删除 listen.... 块,它开始正常。当它在那里时,我收到以下错误:

sudo service haproxy stop
sudo service haproxy start
Job for haproxy.service failed because the control process exited with error code. See "systemctl status haproxy.service" and "journalctl -xe" for details.
Run Code Online (Sandbox Code Playgroud)

journalctl 和 systemctl 输出都显示“服务启动太快错误

haproxy.service - HAProxy Load Balancer
Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled)
Active: inactive (dead) (Result: exit-code) since Sun 2016-07-31 11:24:06 BST; 1min 19s ago …
Run Code Online (Sandbox Code Playgroud)

haproxy

8
推荐指数
1
解决办法
2万
查看次数

haproxy stats 后端限制说明

我的相关部分/etc/haproxy/haproxy.cfg是:

global
    maxconn 30000
    ...

defaults
    ...

frontend frontend_for_all_sites
    maxconn 22000
    mode http
    bind *:80

    acl acl_hostname_www hdr_dom(host)    www.example.com
    acl acl_hostname_static hdr_dom(host) static.example.com
    use_backend www_backend      if acl_hostname_www
    use_backend static_backend   if acl_hostname_static

backend www_backend
    server www 127.0.0.1:9090 maxconn 500

backend static_backend
    server s 127.0.0.1:8080 maxconn 5000
Run Code Online (Sandbox Code Playgroud)

因此,我有 2 个后端,每个后端只有 1 个后端,没有负载平衡,只是根据请求的主机名将请求代理到不同的后端。

www后端我将 maxconn 设置为 500,在static后端我将其设置为 5000。

统计页面现在如下所示:

在此输入图像描述

我的问题是两个后端的“后端限制”2200 代表什么?据我了解,这个值是 22000 maxxconn 上的 10% frontend_for_all_sites。这个 2200 是否意味着后端将处理的最大连接数为 2200,超过该值 haproxy 将返回 503?

haproxy

8
推荐指数
1
解决办法
9877
查看次数