好吧,我已经尝试解决这个问题有一段时间了,但没有结果。因此,我们在 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) 我有一台主机,HAProxy 使用 docker compose 作为 docker 容器运行。我想水平扩展我们的 HAProxy,使其在多个主机上高度可用。
我读了一些关于 keepalived 的教程,但这是在主机上完成的,并且是作为主机安装的 HAProxy 服务器,而不是在 docker 容器中。
是否可以通过docker化的方式部署高可用的HAProxy?
(我知道我有虚拟化设置)
我有两个后端,以便在我的应用程序中维护两组规则。一种用于通过浏览器访问的主网站(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后端标记为启动或关闭。这可能吗?或者也许有更好的方法来分离后端但保留通用功能。
如果 HAProxy 有可用于提供的域的证书,我想强制使用 TSL/SSL/HTTPS。我可以只提供一个包含域名的列表,但我宁愿动态地提供它,这样我就不必一遍又一遍地更新它。
这是我当前的配置:
frontend public
acl has_ssl hdr(host) -i one.nl two.be three.be four.nl five.nl six.com seven.com eight.net nine.com ten.org
use_backend www-https if has_ssl
default_backend www
backend www-https
redirect scheme https if !{ ssl_fc }
Run Code Online (Sandbox Code Playgroud)
是否有系统变量或其他东西可以检查域名的证书是否可用?
我最近将我的证书更改为 LetsEncrypt 的。
我将新证书放在旧证书的位置:
cat /etc/haproxy/certs/fullchain.pem /etc/haproxy/certs/privkey.pem > /etc/haproxy/certs/mydomain.com.pem
Run Code Online (Sandbox Code Playgroud)
在我的haproxy.cfg我有:
frontend https
bind :::8443 v4v6 ssl crt /etc/haproxy/certs/mydomain.com.pem no-sslv3
Run Code Online (Sandbox Code Playgroud)
然后我运行了,但当我在浏览器中或使用SSLLabssystemctl reload haproxy访问它时,它仍然会带来旧的。
如果我使用curl -kv mydomain.com它会显示正确的证书。
配置 HAProxy 时,单独设置“超时隧道”与同时设置“超时客户端”和“超时服务器”(全部设置为相同值)有什么区别?
我有一个 HAProxy 在两台以独立模式运行 Keycloak 的机器前面充当负载均衡器。
版本
HAProxy 配置
global
user haproxy
group haproxy
log /dev/log local0
log-tag WARDEN
chroot /var/lib/haproxy
daemon
quiet
stats socket /var/lib/haproxy/stats level admin
maxconn 256
pidfile /var/run/haproxy.pid
tune.bufsize 262144
defaults
timeout connect 5000ms
timeout client 5000ms
timeout server 5000ms
log global
mode http
option httplog
option dontlognull
option redispatch
retries 5
stats uri /haproxy-status
frontend http-in
mode http
bind *:80
maxconn 2000
redirect scheme https code 301 if !{ ssl_fc } …Run Code Online (Sandbox Code Playgroud)