如果当前HTTP请求的第一个(roundrobin selected)后端返回HTTP 404响应,HAProxy可以使用另一个后端吗?
haproxy是否支持udp负载平衡?
我们只是在后端服务器上使用一个简单的python脚本,它将在udp packects的特定端口上侦听。
有没有java程序或api可以改变haproxy的配置文件的内容?例如动态添加/删除一些配置。
我们使用 haproxy 在 tcp 模式下进行 thrift(rpc) 服务器负载平衡。但是当后端服务器重新启动时,我们遇到了一个问题。
当我们的 thrift(rpc) 服务器重新启动时,它首先停止侦听 haproxy 配置为连接的端口,但仍会处理正在运行的请求,直到它们全部完成(正常重启)。
因此在重启期间,仍然有客户端通过haproxy到后端服务器建立的连接套接字,而后端服务器不接受任何新连接,但haproxy仍然认为该后端服务器是健康的,并将向该服务器调度新连接。分派到该服务器的任何新连接都将花费相当长的时间来连接,然后超时。
有什么方法可以通知 haproxy 服务器已停止侦听并且不向其分派任何连接吗?
我尝试过以下操作:
timeout connect设置为非常低 + redispatch+retry 3option tcp-check两者都不能解决问题。
我在 centos 7 上使用 haproxy 1.5.2 时遇到问题。我创建了一个包含私钥和自签名证书的 pem 文件,但在配置它时,haproxy 无法启动。
当我按以下顺序获得证书时:
-----BEGIN PRIVATE KEY----
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
Feb 20 14:27:29 test.net haproxy-systemd-wrapper[2217]: [ALERT] 050/142729 (2218) : Proxy 'test': no SSL certificate specified for bind '*:443' at [/etc/haproxy/haproxy.cfg:64] (use 'crt').
Feb 20 14:27:29 test.net haproxy-systemd-wrapper[2217]: [ALERT] 050/142729 (2218) : Fatal errors found in configuration.
Feb 20 14:27:29 test.net haproxy-systemd-wrapper[2217]: haproxy-systemd-wrapper: exit, haproxy RC=256
Feb 20 14:30:11 test.net systemd[1]: Starting HAProxy Load Balancer...
Feb 20 14:30:11 test.net …Run Code Online (Sandbox Code Playgroud) 好吧,我已经尝试解决这个问题有一段时间了,但没有结果。因此,我们在 aws 负载均衡器后面有一个 aws ec2 实例,并为负载均衡器分配了一个 aws free ssl。在我们的 ec2 实例中,我们有一个 apache Web 服务器侦听端口 1338 和一个 websocket 服务器(使用 Ratchet)侦听端口 8080。在我们之间,我们使用具有此配置的 HAProxy
global
log 127.0.0.1 local0
maxconn 10000
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
retries 3
backlog 10000
timeout client 30s
timeout connect 30s
timeout server 30s
timeout tunnel 3600s
timeout http-keep-alive 1s
timeout http-request 15s
frontend public
bind *:80
acl is_websocket hdr(Upgrade) -i WebSocket
use_backend ws if is_websocket #is_websocket_server
default_backend www
backend ws
option …Run Code Online (Sandbox Code Playgroud) 我正在解决 haproxy 设置上日志格式的一些问题。首先,我有多个代理设置,这意味着:
请求 -> 客户端代理 -> 中间代理 -> 应用程序
关于客户端代理上的这一点,我添加:
唯一 id 标头 X 唯一 ID
该值在日志中表示为:
日志格式 %ci:%cp\ [%t]\ %f\ %b/%s\ %Tq/%Tw/%Tc/%Tr/%Tt\ %ST\ %B\ %CC\ %CS\ %tsc\ %ac/%fc/%bc/%sc/%rc\ %sq/%bq\ {%hrl}\ {%hsl}\ %{+Q}r\ {%ID}
这太棒了。另一方面,在中间代理上,我可以从前端的标头获取此值:
捕获请求标头 X-Unique-ID len 200
现在在这个代理(中间代理)上我有这样的条件:
acl uniq_header_exist hdr_cnt(X-唯一-ID) eq 0
http-request set-header X-Unique-ID %{+X}o\ %ci:%cp_%fi:%fp_%Ts_%rt:%pid 如果 uniq_header_exist
(它完成了这项工作,所以我可以添加 uuid(如果不存在的话) - 很好)并且日志表示如下:
日志格式 %ci:%cp\ [%t]\ %f\ %b/%s\ %Tq/%Tw/%Tc/%Tr/%Tt\ %ST\ %B\ %CC\ %CS\ %tsc\ %ac/%fc/%bc/%sc/%rc\ %sq/%bq\ {%hrl}\ {%hsl}\ %{+Q}r\ [id=%[capture.req.人类发展报告(2)]]
但我无法有任何可能做这样的事情:
if X-Unique-ID exist then use: …Run Code Online (Sandbox Code Playgroud) 我需要一些有关如何设置haproxy 的建议。我有两个网络服务器正在运行。为了进行测试,他们在端口 8080 上运行一个简单的节点服务器。
现在,在我的 haproxy 服务器上,我启动 haproxy,它提供了以下内容:
$> /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
[WARNING] 325/202628 (16) : Server node-backend/server-a is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[WARNING] 325/202631 (16) : Server node-backend/server-b is DOWN, reason: Layer4 timeout, check duration: 2001ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[ALERT] 325/202631 …Run Code Online (Sandbox Code Playgroud) curl 当我使用without 打开网址时-k,我的请求正在通过,并且我能够看到预期的结果。
$ curl -vvv https://MYHOSTNAME/wex/archive.info -A SUKU$RANDOM
* Trying 10.38.202.192...
* Connected to MYHOSTNAME (10.38.202.192) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate: *.MYCNAME
* Server certificate: ProdIssuedCA1
* Server certificate: InternalRootCA
> GET /wex/archive.info HTTP/1.1
> Host: MYHOSTNAME
> User-Agent: SUKU19816
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.10.2
< Date: Thu, 26 Jan 2017 01:08:40 GMT
< Content-Type: text/html;charset=ISO-8859-1
< Content-Length: 19
< Connection: keep-alive
< Set-Cookie: …Run Code Online (Sandbox Code Playgroud) 我有两个后端,以便在我的应用程序中维护两组规则。一种用于通过浏览器访问的主网站(cookied 会话),另一种用于 API(无状态并通过 API 密钥进行身份验证)。
配置看起来像这样(大大简化)。
defaults
option httpchk HEAD /ping
backend web
cookie _srv insert indirect
server srv1 10.0.0.1:80 cookie srv1 check inter 10s
server srv2 10.0.0.2:80 cookie srv2 check inter 10s
backend api
stick-table type string len 50 expire 1d store http_req_cnt
stick on url_param(key)
server srv1 10.0.0.1:80 check inter 10s
server srv2 10.0.0.2:80 check inter 10s
Run Code Online (Sandbox Code Playgroud)
如图所示,两个后端使用相同的服务器,只是 API 不需要设置 cookie。有(或将会有)更多的逻辑需要分离,例如速率限制规则。
我的问题是如何避免重复健康检查?对每台服务器对同一端点执行两次 ping 操作会浪费资源。我想让web后端进行健康检查,并将api后端标记为启动或关闭。这可能吗?或者也许有更好的方法来分离后端但保留通用功能。