我正在使用 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 reqrep remove URI on backend request。
以下问题适用于我们。
我们有一些应用程序在一个域中以不同的上下文根运行。但是,并非所有 url 的客户端都已更改。
如果请求与旧路径匹配,我想在 haproxy 中使用 301 重定向进行重定向。
举个例子http://example.com/abc和http://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) 我想对我的应用程序服务器进行负载平衡,并缓存来自它们的响应。
我在 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 设置相比,可能有什么限制?
我已经使用单个前端和后端配置了 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) 我想练习在一台机器上使用多个 Docker 容器创建高可用的 Web 应用程序。
我在 Docker 容器中启动了多个 Web 服务器。比如说,三台服务器rest1和rest2。rest3
我将 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) 我有将近 200 行 ACL 配置haprox.cfg,还包含 150 个后端。为了消除这种配置复杂性,我想将此配置捆绑在单独的文件中,并将这些文件导入到haprox.cfg. 这在haproxy中可能吗?
一个客户的网站目前受到攻击,我被要求修复它。
大量 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) 数周以来,我一直在为这个问题而苦苦挣扎,但我的想法已经不多了。我运行 HAProxy 以根据请求的路径/标头在 3 个后端之间代理请求。
我的后端是:
最后一个后端 (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) 我设置了一个 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 无法读取请求标头。有没有办法解决?
我需要用 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)