有没有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) 在 HAProxy 中,是否可以为虚拟主机重定向编写 ACL(适用于所有虚拟主机的一条规则)
例子说
如果标头包含backend-name.domain.com---> 使用带有名称的后端backend-name
它应该像这样工作,
a.domain.com -----> backend a
b.domain.com -----> backend b
Run Code Online (Sandbox Code Playgroud)
无需分别为 a 和 b 明确编写 ACL。
在这里,我需要为所有基于域的路由使用一个 ACL,因为我使用通配符 DNS 将 domain.com 的所有子域解析为 HAProxy IP。
我动态添加和删除后端,很难使用脚本为每个新前端编写 ACL。
提前致谢。
我有一台运行 kibana 的服务器,我已将其设置为从本地主机访问。这是一个 linux 服务器,所以我可以这样做:
links http://localhost:5601
Run Code Online (Sandbox Code Playgroud)
这运行良好。我需要将此 kibana 服务器置于 HAProxy 之后,它将充当 Kibana 的反向代理。
我的 Haproxy 配置文件(/etc/haproxy/haproxy.cfg)看起来像
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 SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode …Run Code Online (Sandbox Code Playgroud) 我有 2 个虚拟主机
app.example.com:80 在 IP 地址上 xxx.xxx.xxx.xxx
app2.example.com:80 在 IP 地址上 yyy.yyy.yyy.yyy
我的haproxy ipaddress是 sss.sss.sss.sss
这是 haproxy 配置:
global
log 127.0.0.1 local0 notice
maxconn 2000
user haproxy
group haproxy
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
timeout connect 5000
timeout client 10000
timeout server 10000
frontend www-http
mode http
bind *:80
default_backend appname
stats enable
stats uri /haproxy?stats
stats auth admin:password
stats show-node
backend appname
balance roundrobin
option httpclose
option forwardfor
server lamp1 …Run Code Online (Sandbox Code Playgroud) 我有使用 http 和 https 的 haproxy v1.5.4。我将 *:80 & :*443 绑定到相同的前端并使用相同的 acl。
我想创建一个 http -> https 重定向
frontend http-in
bind *:80
bind *:443 ssl crt /etc/pki/tls/certs/...
...
acl is_office path_beg /office
http-request redirect scheme https if !{ ssl_fc } is_office
use_backend office if is_office
Run Code Online (Sandbox Code Playgroud)
这引起
10.XXXXX:36909 [16/Dec/2015:17:23:07.678] http-in/2: SSL handshake failure
Run Code Online (Sandbox Code Playgroud)
当我通过 http 访问时(期待重定向)
如果我通过 https 访问,那么它会正确地访问后端并通过 443 代理通过服务。
backend office
balance roundrobin
server backbone-daily 10.XXXXXX:443 ssl check verify none
Run Code Online (Sandbox Code Playgroud)
自签名证书无需重定向即可验证和工作。感觉就像我在重定向阶段遗漏了一些东西。
非常感谢任何帮助
我有 3 个不同的 Restful 服务器:w1、w2、w3
引用我的负载均衡器的客户端提供名为“ip”(ipv4) 的 url 参数。请求之间的 url 参数 ip 是不同的:
curl -XGET http://localhost:8080/api/v1/link?ip=x.x.x.x
Run Code Online (Sandbox Code Playgroud)
我想使用 HASH 算法根据 ip 参数平衡 HAProxy 到 w1、w2、w3。
HAProxy 配置如下:
global
#daemon
maxconn 3000
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:80
default_backend workers
backend workers
balance url_param ip
hash-type consistent
server w1 localhost:8080 weight 1 maxconn 1000 check
server w2 localhost:8081 weight 1 maxconn 1000 check
server w3 localhost:8082 weight 1 maxconn 1000 check
listen …Run Code Online (Sandbox Code Playgroud) 我使用 Haproxy 作为 SSL 终止来识别客户端证书。我想检查客户端证书中的 CN 值是否与客户端发送的标头值匹配。如果证书中的 CN 值与标头中的值不匹配,有没有办法设置 ACL?
就像是:
http-request set-header X-SSL-Client-CN %{+Q}[ssl_c_s_dn(cn)]
acl id_not_match hdr(client-id) -m hdr(X-SSL-Client-CN)Run Code Online (Sandbox Code Playgroud)
我正在尝试docker kill -s HUP <container>在 Ansible 中完成,但看起来我尝试的选项总是重新启动容器或尝试而不是重新加载配置。
运行以下命令允许我在不重新启动容器的情况下重新加载配置:
docker kill -s HUP <container>
Ansibledocker_container文档建议了以下选项:
force_kill停止正在运行的容器时使用 kill 命令。
kill_signal覆盖用于终止正在运行的容器的默认信号。
单独使用kill_signal没有任何作用。
下面是我希望能起作用的一个例子:
- name: Reload haproxy config
docker_container:
name: '{{ haproxy_docker_name }}'
state: stopped
image: '{{ haproxy_docker_image }}'
force_kill: True
kill_signal: HUP
Run Code Online (Sandbox Code Playgroud)
我假设覆盖force_kill并kill_signal会给我所需的行为。我也尝试将状态设置为“开始”和present.
这样做的正确方法是什么?