标签: haproxy

Haproxy SSL 握手失败

我的一个特定客户端出现问题,该客户端访问了我的 haproxy 负载均衡器。haproxy 日志中的错误消息:]

incoming_ssl/1: SSL handshake failure
Run Code Online (Sandbox Code Playgroud)

有问题的客户端似乎是一些 Apache Java 客户端或 ActiveMq 服务器 - 无论哪种方式,它都是我们对其进行零控制的远程服务器。

使用 ssldump,我看到这些行:

11 5  0.4152 (0.1649)  C>S  Alert
    level           fatal
    value           certificate_unknown
11    0.4152 (0.0000)  C>S  TCP FIN
Run Code Online (Sandbox Code Playgroud)

使用curl /浏览器一切看起来都很好,我已经做了一些ssl检查,没有报告此类问题。

我已经从我的 haproxy 配置文件中删除了尽可能多的内容来诊断问题。我什至测试过直接访问后端(NodeJS)服务器,效果很好 - 客户端可以连接。这确实是 haproxy,我只是不知道如何修复它。

我的基本 haproxy conf 文件如下所示:

frontend incoming_ssl
  bind *:443 ssl crt /etc/haproxy/cert.key ca-file /etc/haproxy/cert.pem ciphers ECDHE-RSA-AES256-SHA:RC4-SHA:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM
  acl flume hdr_dom(host) -i dom.ain.com
  use_backend flume if flume

backend flume :80
  server flume 10.40.14.1:8000 weight 1 maxconn 1000 check inter 2000
Run Code Online (Sandbox Code Playgroud)

也尝试过使用 …

godaddy openssl haproxy

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

HaProxy 给予 - 503 服务不可用

我正在使用以下配置为两个 Tomcat 服务器执行负载平衡。我将 HAProxy 配置为执行 SSL/TLS 桥接/重新加密。

#------------------------------------------------- --------------------
# 可能的 Web 应用程序的示例配置。见
# 在线完整配置选项。
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#------------------------------------------------- --------------------

#------------------------------------------------- --------------------
# 全局设置
#------------------------------------------------- --------------------
全球的
    # 要让这些消息最终出现在 /var/log/haproxy.log 中,您将
    # 需要:
    #
    # 1) 配置syslog 以接受网络日志事件。这个做完了
    # 通过在 SYSLOGD_OPTIONS 中添加“-r”选项
    # /etc/sysconfig/syslog
    #
    #2) 配置local2事件到/var/log/haproxy.log
    # 文件。可以添加如下一行
    # /etc/sysconfig/syslog
    #
    # local2.* /var/log/haproxy.log
    #
    日志 127.0.0.1 local2 调试

    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    最大康 4000
    用户haproxy
    组haproxy
    守护进程

    # 打开 stats unix 套接字
    统计套接字/var/lib/haproxy/stats
    ssl-server-verify 无

#------------------------------------------------- -------------------- …

ssl https load-balancing haproxy

6
推荐指数
1
解决办法
6073
查看次数

错误 2006 (HY000):MySQL 服务器消失了......(HaProxy / Galera)

我在多主设置中设置了一个由 3 个 MariaDB 服务器组成的集群,它运行良好。我为 HaProxy 添加了第 4 个服务器以进行负载平衡和循环,以便我们可以有一点冗余,这也可以正常工作,除了 1 个问题。

我登录到运行以下查询的 HaProxy 服务器上的 MySQL 客户端:

show variables like 'server_id';
Run Code Online (Sandbox Code Playgroud)

我正在获取结果,但是如果我等待 5 秒或更长时间并再次运行查询,我会收到以下错误:

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    52
Current database: *** NONE ***
Run Code Online (Sandbox Code Playgroud)

在那之后,我得到了不同 server_id 的结果,这表明负载平衡正在工作。这导致的问题是,当我尝试从 Spring/Java 应用程序连接时,我可以在短时间内运行查询并且连接断开。我想如果我可以在 HaProxy 服务器上解决它,那将解决我遇到的其他问题。

编辑:添加 HAPROXY.CFG

global
    log 127.0.0.1 local0 notice
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    user haproxy
    group haproxy
    maxconn 4096
    daemon

defaults
    log global
    retries 2
    timeout connect 3000
    timeout server 5000 …
Run Code Online (Sandbox Code Playgroud)

mysql java haproxy mariadb

6
推荐指数
1
解决办法
6728
查看次数

Haproxy - 从子域动态选择后端

我最近发现您可以根据请求主机头动态匹配后端,如下所示:

 use_backend %[req.hdr(host),lower]
Run Code Online (Sandbox Code Playgroud)

但是,有没有人知道我可以使用请求主机头的子域来匹配后端的任何方式?

例如,沿着这些路线的东西:

backend one
backend two

use_backend %[<SUBDOMAIN OF HOSTHEADER>,lower]
Run Code Online (Sandbox Code Playgroud)

这会像这样匹配:

 one.example.com -> backend one
 two.example.com -> backend two
Run Code Online (Sandbox Code Playgroud)

haproxy

6
推荐指数
2
解决办法
8269
查看次数

如何将HAProxy配置为反向代理?

我有多个网络服务器,托管多个域。有时,我需要将域从一台 Web 服务器移动到另一台。我不想更新域的 DNS 以指向新的服务器位置,而是希望将所有域设置为指向反向代理 (?),然后将 Web 请求传递到正确的服务器。我正在尝试使用 haproxy 来实现这一目标,但没有取得太大成功。

举个例子:

有两个服务器:web1.foo.com 和 web2.foo.com。web1 为 abc.com 和 def.com 提供站点。web2 为 cba.com 和 fed.com 提供网站服务。

还有一个代理服务器 proxy.foo.com。

abc.com 等的 dns 指向 proxy.foo.com,它被配置为将域映射到服务器,如下所示:

abc.com -> web1.foo.com def.com -> web1.foo.com cba.com -> web2.foo.com fed.com -> web2.foo.com

问题是,我无法使用 haproxy 让它工作...它正在尝试负载平衡而不是反向代理...如果我访问 abc.com,它将在 web1 和 web2 之间循环。

所以,我想我想知道,haproxy 是否可以做到这一点?如果可以,我的配置哪里出了问题?我的配置如下所示:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default …
Run Code Online (Sandbox Code Playgroud)

reverse-proxy haproxy

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

我可以使用 HAProxy 的新“捕获”功能将远程地址保存在 TCP 前端,并将其用作 HTTP 后端中的“X-Forwarded-For”标头吗?

使用 HAProxy 1.6 和一个聪明的 hack,我现在有一个 HAProxy tcp 模式前端,它检测浏览器是否支持 SNI,并基于此,路由到一个强加密的 SSL 终止后端,或更弱的一个。这确保了 SSL 实验室的 A+ 等级,同时仍然允许除 IE6 之外的所有浏览器使用 SSL。

这是我的配置。它有一些模板变量应该是不言自明的,但不在与我的问题相关的领域:

frontend https_incoming
 bind 0.0.0.0:443
 mode tcp
 option tcplog
 tcp-request inspect-delay 5s
 tcp-request content accept if { req.ssl_hello_type 1 }
 use_backend https_strong if { req.ssl_sni -m end .transloadit.com }
 default_backend https_weak

backend https_strong
 mode tcp
 option tcplog
 server https_strong 127.0.0.1:1665

frontend https_strong
 bind 127.0.0.1:1665 ssl crt ${DM_ROOT_DIR}/envs/ssl/haproxy-dh2048.pem no-sslv3 no-tls-tickets ciphers ${strongCiphers}
 mode http
 option httplog
 option httpclose
 option forwardfor if-none …
Run Code Online (Sandbox Code Playgroud)

ssl haproxy packet-capture

6
推荐指数
1
解决办法
4057
查看次数

Haproxy 更改 url 的一部分

我有一个重命名的应用程序,我希望 Haproxy 重定向到正确的路径,同时保留请求参数

这就是我所拥有的:

acl old_name path_dir -i /old_name
   http-request set-path /new_name/%[query] if old_name
Run Code Online (Sandbox Code Playgroud)

我希望它从

www.site.com/old_name/Default.aspx?Id=123
Run Code Online (Sandbox Code Playgroud)

www.site.com/new_name/Default.aspx?Id=123 but this is not working. 
Run Code Online (Sandbox Code Playgroud)

haproxy

6
推荐指数
2
解决办法
5万
查看次数

配置 HAProxy 以包含不同后端的主机标头

我正在探索使用 HAProxy 作为在 IIS 上运行的一组 web api 前面的平衡器。

  • node1.myapp.mycompany.com
  • node2.myapp.mycomapny.com

我们目前正在使用主机头来正确解析 IIS 上的正确 Web 应用程序。例如,我们可能在同一服务器/端口上运行 otherapp.mycompany.com,但使用主机头 IIS 知道要提供哪个服务。

我对 HAProxy 的最初尝试给我留下了 404 错误,因为我的请求中没有包含主机标头,因此 IIS 提供绑定到给定 IP 的默认站点,而不是按主机名解析。

修复给我留下了这样的东西:

frontend localnodes
    bind *:80
    mode http
    default_backend nodes

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    reqirep ^Host: Host:\ node1.myapp.mycompany.com
    server web01 node1.myapp.mycompany.com:80
Run Code Online (Sandbox Code Playgroud)

这对单个后端很有用,但我对如何根据哪个后端提供请求包含正确的主机头感到头疼:

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    reqirep ^Host: Host:\ node1.myapp.mycompany.com
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80
Run Code Online (Sandbox Code Playgroud)

每当node2使用上述内容时都不起作用,因为它在 IIS 中无法正确解析(在这种情况下,node2 位于不同的服务器上,因此 IP 不同。事实上,如果它们在同一服务器/IP 上运行,我怀疑请求工作“工作”,但它们都将由每个主机标头的 node1 …

iis proxy haproxy host-headers

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

HAproxy:在运行状况检查更改时运行脚本

我已经设置了一个 haproxy 配置,其后端有两台服务器,如下所示:

...
default
        option log-health-checks
...
mailers mta
        mailer smtp1 127.0.0.1:25
...
backend s_api
        balance roundrobin
        option httpchk GET /sites?site=q&limit=1

        http-check expect rstatus (2|3)[0-9][0-9]

        server s1_a 1.2.3.4:3600 check inter 5s fall 4 rise 1
        server s2_b 1.2.3.5:3600 check backup

        timeout queue 60s
        timeout server 60s
        timeout connect 60s

        email-alert mailers mta
        email-alert level notice
        email-alert from haproxy@example.com
        email-alert to ops@example.com
Run Code Online (Sandbox Code Playgroud)

现在,当服务器出现故障并再次启动时,我会通过电子邮件收到通知。我想要存档的是在服务器启动时启动本地 bash 脚本,在服务器关闭时启动另一个本地 bash 脚本。

怎么可能呢?

healthcheck haproxy alert

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

如何在终止 TLS 时通过 HA 代理转发客户端身份验证证书?

我有一个以 HA 代理负载均衡器为前端的 Web API。Web API 使用客户端认证证书进行身份认证和授权。我希望 HA 代理设备终止 TLS 连接并在后端使用普通 HTTP 与 Web API 通信,但我需要通过 HTTP 连接传递的客户端身份验证证书。需要如何设置 HA 代理以将请求的身份验证证书保留在后端,但仅使用 HTTP?

certificate haproxy client-certificate

6
推荐指数
1
解决办法
3864
查看次数