标签: haproxy

HAProxy 无需 SSL 终止即可将多个域名的 http 重定向到 https

我正在使用 HAProxy 将流量重定向到本地网络中的不同 Web 服务器。

如果没有启用 SSL,我可以像这样根据主机名进行路由(在前端部分):

acl is_local hdr_end(host) -i mirror.skbx.co
acl is_kiev  hdr_end(host) -i kiev.skbx.co

use_backend kiev if is_kiev
default_backend wwwlocalbackend
Run Code Online (Sandbox Code Playgroud)

一旦我启用 SSL,一切都会通过 SSL 传递模式在 TCP 模式下工作。

但我还需要确保 HTTP 重定向到 HTTPS。当我使用:

redirect scheme https if !{ ssl_fc }
Run Code Online (Sandbox Code Playgroud)

在 HAProxy 配置的 HTTP 前端部分,我将所有请求重定向到默认后端,因此如果请求从redirect scheme.

这个问题有一个关于如何通过 SSL Termination 使其工作的答案,其中 SSL 在 HAProxy 级别被剥离。

我的问题是 - 是否可以在保留直通(模式 tcp)的同时从 HTTP 重定向到 HTTPS?

我拥有的前端和后端部分的完整配置在这个要点中

haproxy

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

基于路径的 Haproxy 重定向

类似于HAProxy reqrep remove URI on backend request

以下问题适用于我们。

我们有一些应用程序在一个域中以不同的上下文根运行。但是,并非所有 url 的客户端都已更改。

如果请求与旧路径匹配,我想在 haproxy 中使用 301 重定向进行重定向。

举个例子http://example.com/abchttp://example.com/def

...
frontend https
  bind *:{{ proxy_port }} ssl crt /etc/haproxy/bundle_dh.pem ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4 no-sslv3
  http-request set-header X-Forwarded-Proto https if { ssl_fc }
  http-request set-header X-Forwarded-Port %[dst_port]

  acl has_legacy_abc path_beg /abc
  acl has_legacy_def path_beg /def
  redirect location 301 https://abcdomain.com/{PATH_WITHOUT_ABC} if { has_legacy_abc }
  redirect location 301 https://defdomain.com/{PATH_WITHOUT_ABC} if { has_legacy_def }

  use backend abc_backend if { hdr(Host) -i abcdomain.com } …
Run Code Online (Sandbox Code Playgroud)

redirect haproxy

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

当 Varnish 可以充当负载均衡器时,是否仍然需要 HAProxy?

我想对我的应用程序服务器进行负载平衡,并缓存来自它们的响应。

我在 HAProxy 的网站上阅读了 2012 年的一篇文章,该文章旨在消除 HAProxy 和 Varnish 之间的混淆:

http://blog.haproxy.com/2012/07/04/haproxy-and-varnish-comparison/

这篇文章基本上说HAProxy只是一个反向代理负载均衡器(无缓存),而Varnish是一个反向代理缓存(无负载均衡),因此它们是互补的。

但是今天,我可以在 Varnish 文档中看到它也进行负载平衡:

https://www.varnish-cache.org/trac/wiki/LoadBalancing

所以我只能猜测这个功能是从2012年开始引入的,现在在负载均衡方面直接与HAProxy竞争。

现在考虑到我需要一个反向代理缓存 + 负载平衡器,我是否可以只使用带有 Varnish 的单个服务器,这两者都可以吗?与典型的 HAProxy <-> Varnish 设置相比,可能有什么限制?

varnish reverse-proxy load-balancing haproxy

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

了解 HAProxy 前端和后端当前会话统计信息

我已经使用单个前端和后端配置了 HAProxy,从统计页面我看到以下统计信息:

system limits: memmax = unlimited; ulimit-n = 20013
maxsocs = 20013; maxconn = 10000; maxpripes =0
current conns = 361; current pipes 0/0; conn rate = 27/sec
Running tasks: 1/366; idle = 98%
Run Code Online (Sandbox Code Playgroud)

在会话部分的前端,我看到:

Cur: 360
Max: 427
Limit 2000
Run Code Online (Sandbox Code Playgroud)

后端的一个:

Cur: 0
Max: 3
Limit: 2000
Run Code Online (Sandbox Code Playgroud)

为了简化,我附上这个数字的图像: 在此处输入图片说明

我不太明白的事情是为什么如果当前连接是:361,后端有0

由于设置,HAproxy 是否会限制/排队传入连接以保护后端timeout queue

如何知道前端联系后端所需的时间?

这是我正在使用的测试配置:

global
    maxconn 10000
    spread-checks 3
    log /var/run/log local0 notice
    daemon
    tune.ssl.default-dh-param 2048
    ssl-default-bind-options no-sslv3 no-tls-tickets
    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:HIGH:!aNULL:!MD5:!DSS
    ssl-default-server-options …
Run Code Online (Sandbox Code Playgroud)

haproxy

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

如何将 Docker 与 HAProxy+Keepalived 结合使用?

我想练习在一台机器上使用多个 Docker 容器创建高可用的 Web 应用程序。

我在 Docker 容器中启动了多个 Web 服务器。比如说,三台服务器rest1rest2rest3

我将 Docker 与 HAProxy 平衡器结合使用,该平衡器绑定到服务器127.0.0.1:80并将查询路由到rest服务器。这使我可以确定,当一两台rest服务器发生故障时,我将能够进行查询127.0.0.1:80并收到正确的结果。

坏事是:当 HAProxy 关闭时,Web 应用程序也会关闭。

我想使用多个 HAProxy Docker 容器,每个容器中都带有 Keepalived 服务。问题是:我需要几个Docker容器来监听一个IP和一个PORT。例如,我将拥有haproxy1和,它将通过 Keepalivedhaproxy2绑定到。localhost

当我在 HAProxy 配置文件中设置 IP(不是当前 Docker 容器的 IP)时,它显示一个错误,HAProxy 无法侦听此 IP 和端口。

是否可以使用HAProxy和Keepalived配置多个Docker容器来监听一个IP和PORT?

HAProxy的配置:

defaults
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http-in
    mode http
    bind 172.17.0.10:80
    default_backend BACKEND

backend BACKEND
    option httpchk
    server rest1 …
Run Code Online (Sandbox Code Playgroud)

high-availability haproxy failovercluster keepalived docker

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

在 haproxy.cfg 中导入配置文件

我有将近 200 行 ACL 配置haprox.cfg,还包含 150 个后端。为了消除这种配置复杂性,我想将此配置捆绑在单独的文件中,并将这些文件导入到haprox.cfg. 这在haproxy中可能吗?

haproxy

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

在 HAProxy 中阻止 IP

一个客户的网站目前受到攻击,我被要求修复它。

大量 IP(轻松超过 5,000 个)不断攻击/login,大概是试图强行进入。

我更改了站点,因此页面返回 500 错误,但他们并没有放弃。显然,这对现在无法登录的真实用户不利。

负载平衡是通过HAProxy完成的,我对此知之甚少(尽管我比几个小时前知道的要多得多)。我已经尝试了很多我在网上找到的明智的方法,但似乎都没有帮助,可能是因为有如此大的 IP 块在执行攻击。

那么问题来了: 如果一个 IP在Y秒内命中/login超过X次,我该如何拒绝?

而且,子点 - 我怎样才能看到拒绝日志,所以我知道它确实在工作?

这是haproxy.log的示例

Jun  3 14:24:50 hap-server haproxy[11831]: 46.161.62.79:15290 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-03 751/0/202/38/991 500 220 - - ---- 428/428/120/38/0 0/0 "GET /login HTTP/1.1"
Jun  3 14:24:50 hap-server haproxy[11831]: 46.161.63.132:47804 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-04 751/0/202/38/991 500 220 - - ---- 428/428/119/42/0 0/0 "GET /login HTTP/1.1"
Jun  3 14:24:50 hap-server haproxy[11831]: 46.161.62.43:53176 [03/Jun/2017:14:24:49.505] …
Run Code Online (Sandbox Code Playgroud)

brute-force-attacks haproxy rate-limiting

4
推荐指数
2
解决办法
9360
查看次数

HAProxy 间歇性 504 错误

数周以来,我一直在为这个问题而苦苦挣扎,但我的想法已经不多了。我运行 HAProxy 以根据请求的路径/标头在 3 个后端之间代理请求。

我的后端是:

  • 一个 Amazon S3 存储桶
  • 一个 Node.js 应用程序(2 个服务器)
  • 一个名为 prerender.io 的服务

最后一个后端 (prerender.io) 似乎有零问题(尽管它的流量很少)。另外两个随机向客户端返回 504 错误(根据日志大约每分钟一次,但没有明确的模式)。

这是我的(消毒)配置:

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5s
    timeout client  120s
    timeout server  120s

frontend foobar
    mode http
    bind *:80
    bind *:443 ssl crt /etc/ssl/certs/foobar.com.pem
    redirect scheme https code 301 if !{ ssl_fc }

    default_backend s3

    acl api path_beg -i /api/
    use_backend node if api

    acl user-agent-bot hdr_sub(User-Agent) -i baiduspider twitterbot facebookexternalhit 
    use_backend …
Run Code Online (Sandbox Code Playgroud)

timeout haproxy 504

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

HAProxy - 根据请求主机添加响应头

我设置了一个 HAProxy 来将流量重定向到一些内部服务器。

我要做的是根据请求主机设置一些响应标头。不幸的是,我无法让它工作。

当前设置如下所示

acl mywebsite req.hdr(host) -i example.com

http-response set-header X-Frame-Options SAMEORIGIN if mywebsite
http-response set-header X-XSS-Protection 1;mode=block if mywebsite
http-response set-header X-Content-Type-Options nosniff if mywebsite
Run Code Online (Sandbox Code Playgroud)

据我了解,http-response set-header 无法读取请求标头。有没有办法解决?

haproxy headers request

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

Haproxy TLS 配置

我需要用 tls 创建 haproxy,虽然它可以成功地使用 ssl 证书,但我已经完成了以下配置

global
    log 127.0.0.1 local0 debug
    ssl-default-bind-options no-sslv3 2048
Run Code Online (Sandbox Code Playgroud)

它给出以下错误,请建议我应该在哪里更改

[ALERT] 330/075452 (70779) : parsing [/etc/haproxy/haproxy.cfg:8] : unknown keyword 'ssl-default-bind-options' in 'global' section
[ALERT] 330/075452 (70779) : Error(s) found in configuration file : /etc/haproxy/haproxy.cfg
[WARNING] 330/075452 (70779) : Setting tune.ssl.default-dh-param to 1024 by default, if your workload permits it you should set it to at least 2048. Please set a value >= 1024 to make this warning disappear.
[ALERT] 330/075452 (70779) : Fatal errors found …
Run Code Online (Sandbox Code Playgroud)

haproxy

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