我的一个特定客户端出现问题,该客户端访问了我的 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)
也尝试过使用 …
我正在使用以下配置为两个 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 无
#------------------------------------------------- -------------------- … 我在多主设置中设置了一个由 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) 我最近发现您可以根据请求主机头动态匹配后端,如下所示:
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) 我有多个网络服务器,托管多个域。有时,我需要将域从一台 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) 使用 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) 我有一个重命名的应用程序,我希望 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 作为在 IIS 上运行的一组 web api 前面的平衡器。
我们目前正在使用主机头来正确解析 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 …
我已经设置了一个 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 脚本。
怎么可能呢?
我有一个以 HA 代理负载均衡器为前端的 Web API。Web API 使用客户端认证证书进行身份认证和授权。我希望 HA 代理设备终止 TLS 连接并在后端使用普通 HTTP 与 Web API 通信,但我需要通过 HTTP 连接传递的客户端身份验证证书。需要如何设置 HA 代理以将请求的身份验证证书保留在后端,但仅使用 HTTP?
haproxy ×10
ssl ×2
alert ×1
certificate ×1
godaddy ×1
healthcheck ×1
host-headers ×1
https ×1
iis ×1
java ×1
mariadb ×1
mysql ×1
openssl ×1
proxy ×1