haproxy官网(pigchaproxy官网)

http://www.itjxue.com  2023-02-17 20:42  来源:未知  点击次数: 

HAProxy介绍

HAProxy是一个单线程,事件驱动的非阻塞引擎,它将一个非常快速的I / O层与一个基于优先级的调度器结合在一起。由于其设计时考虑了数据转发目标,因此其架构经过优化,可尽可能快地将数据移动到最少的操作。因此,它实现了在每个级别提供旁路机制的分层模型,确保数据不会达到更高的水平,除非需要。大多数处理在内核中执行,HAProxy尽可能快地通过

提供一些提示或避免某些操作来帮助内核尽快完成工作,当它猜测它们可以被分组以后。结果,典型的数字显示了15%的处理时间花费在HAProxy上,在TCP或HTTP关闭模式下花费在内核上的85%,在HAProxy上花费约30%,在HTTP保持花费模式下花费70%。

一个进程可以运行多个代理实例; 据报道,单个进程中30万个不同代理的配置运行良好。因此,通常不需要为所有实例启动多个进程。

有可能使HAProxy运行在多个进程上,但是它有一些限制。一般来说,在HTTP关闭或TCP模式下没有意义,因为内核端不能很好地进行一些操作,比如connect()。对于HTTP保持活动模式,性能非常好可以通过一个单一的流程来实现,这个流程通常比一般的需求要好一个数量级。当用作SSL 卸载程序时,这是有意义的,而且这个特性在多进程模式下得到很好的支持。

HAProxy只需要haproxy可执行文件和配置文件即可运行。对于日志记录,强烈建议使用正确配置的syslog守护进程

和日志循环。配置文件在启动之前被解析,然后HAProxy尝试绑定所有监听套接字,如果有任何失败,则拒绝启动。过去这一点,它不能再失败了。这意味着没有运行时失败,如果它接受启动,它将工作,直到停止。

一旦HAProxy启动,它确实做了三件事情:

处理传入连接是迄今为止最复杂的任务,因为它依赖

于很多配置可能性,但是可以概括为以下9个步骤:

前端和后端有时被视为半代理,因为他们只看端到端连接的一端; 前端只关心客户端,而后端只关心服务器。HAProxy还支持

完整的代理,这正是前端和后端的联合。当需要进行HTTP 处理时,配置通常会被分割成前端和后端,因为任何前端都可能将

连接传递给任何后端。相对于TCP-only代理,使用前端和后端的一个好处是配置比用完整的代理更可读。

【tcp/ip】关于ip透传

TCP透传功能使用说明

TCP透传方式接入设备

MQTT相比于TCP长连接透传的优势

TCP四层代理透传客户端真实IP

HAProxy官方文档 proxy protocol

蜜罐项目-端口流量转发(透传ip)方案调研

ONENET平台--TCP透传

配置部署支持源IP透传的TCP监听器

Marathon-LB实现服务限流

参考官网Haproxy的配置手册 HAProxy Configuration Manual , 我们可以利用http_req_rate这个配置项实现限流,如下图所示:

Marathon-LB(MLB)是一个根据Marathon应用状态自动调整和配置HAProxy的工具。Marathon-LB既可以用作服务代理,也可以用作负载均衡和服务发现工具。

参考github MLB的 Templates信息 ,我们可以利用HAPROXY_0_BACKEND_HTTP_OPTIONS 这个模板修改服务backend部分的信息,如下图所示:

利用marathon发布服务blackname,marathon.json中配置label如下:

"HAPROXY_0_BACKEND_HTTP_OPTIONS": " stick-table type ip? size 200k? expire 60s store conn_rate(30s) , bytes_out_rate(30s) \n tcp-request content? track-sc2 src? \n acl conn_rate_abuse? sc2_conn_rate gt 5? \n acl data_rate_abuse? sc2_bytes_out_rate? gt 20000000 \n http-request deny? if conn_rate_abuse \n http-request deny? if data_rate_abuse \n"

MLB会动态监控marathon的事件流,动态生成Haproxy的配置文件。经过上面的配置,在浏览器30S之内访问次数大于5 次会断开TCP连接。如下图所示:

如何把一个web集群由HTTP转换为HTTPS

1、概述

如果你的应用使用SSL证书,则需要决定如何在负载均衡器上使用它们。

单服务器的简单配置通常是考虑客户端SSL连接如何被接收请求的服务器解码。由于负载均衡器处在客户端和更多服务器之间,SSL连接解码就成了需要关注的焦点。

2、有两种主要的策略

第一种是我们选择的模式,在haproxy这里设定SSL,这样我们可以继续使用七层负载均衡。SSL连接终止在负载均衡器haproxy -----解码SSL连接并发送非加密连接到后端应用tomcat,这意味着负载均衡器负责解码SSL连接,这与SSL穿透相反,它是直接向代理服务器发送SSL连接的。

第二种使用SSL穿透,SSL连接在每个tomcat服务器终止,将CPU负载都分散到tomcat服务器。然而,这样做会让你失去增加或修改HTTP报头的能力,因为连接只是简单地从负载均衡器路由到tomcat服务器,这意味着应用服务器会失去获取 X-Forwarded-* 报头的能力,这个报头包含了客户端IP地址、端口和使用的协议。

有两种策略的组合做法,那就是第三种,SSL连接在负载均衡器处终止,按需求调整,然后作为新的SSL连接代理到后台服务器。这可能会提供最大的安全性和发送客户端信息的能力。这样做的代价是更多的CPU能耗和稍复杂一点的配置。

选择哪个策略取决于你及应用的需求。SSL终端为我所见过最典型的策略,但SSL穿透可能会更安全。

3、使用HAProxy作为SSL终端

首先,我们将介绍最典型的解决方案 - SSL 终端。正如前面提到的,我们需要让负载均衡器处理SSL连接。这就意味着要将SSL证书放在负载均衡服务器上。

记住,在生产环境里使用(而不是自签名)的SSL证书,是不会需要你自己来生成或签名 - 你只需要创建证书签名请求 (csr) 并把它交给那个你向它购买证书的机构即可。

首先, 我们创建一份自签名的证书作为示范,并在本地使用同一份证书。

openssl genrsa -out /etc/haproxy/wzlinux.key 2048

openssl req -new -key /etc/haproxy/wzlinux.key -out /etc/haproxy/wzlinux.csr

Country Name (2 letter code) [AU]:CN

State or Province Name (full name) [Some-State]:Shanghai

Locality Name (eg, city) []:Shanghai

Organization Name (eg, company) [Internet Widgits Pty Ltd]:wzlinux

Organizational Unit Name (eg, section) []:

Common Name (e.g. server FQDN or YOUR name) []:

Email Address []:

Please enter the following 'extra' attributes to be sent with your certificate request

A challenge password []:

An optional company name []:

cd /etc/haproxy

openssl x509 -req -days 3655 -in wzlinux.csr -signkey wzlinux.key -out wzlinux.crt

这就生成了wzlinux.csr,wzlinux.key和wzlinux.crt文件了。

接着,在创建了证书之后,我们需要创建pem文件。pem文件本质上只是将证书、密钥及证书认证中心证书(可有可无)拼接成一个文件。在我们的例子中,我们只是简单地将证书及密钥文件并以这个顺序拼接在一样来创建wzlinux.pem 文件。这是HAProxy读取SSL证书首选的方式。

cat wzlinux.crt wzlinux.key | tee wzlinux.pem

当购买真正的证书 时,你不一定会获取拼接后的文件。你可以要自己拼接它们。然而,很多机构也会提供一份拼接好的文件给你。如果你没有获取到拼接后的文件,则它可能不是一个 pem 文件,而是 bundle、cert、cert、key文件或一些相同概念但名称类似的文件。

无论如何,只要我们得到了HAProxy使用的pem文件,我们只需经过简单配置就是可以处理SSL连接了。

下面我们将要配置haproxy来安装SSL证书,配置文件如下

#---------------------------------------------------------------------

# Example configuration for a possible web application. See the

# full configuration options online.

#

#

#

#---------------------------------------------------------------------

#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global

# to have these messages end up in /var/log/haproxy.log you will

# need to:

#

# 1) configure syslog to accept network log events. This is done

# by adding the '-r' option to the SYSLOGD_OPTIONS in

# /etc/sysconfig/syslog

#

# 2) configure local2 events to go to the /var/log/haproxy.log

# file. A line like the following can be added to

# /etc/sysconfig/syslog

#

# local2.* /var/log/haproxy.log

#

log 127.0.0.1 local2 warning

chroot /var/lib/haproxy

pidfile /var/run/haproxy.pid

maxconn 400000

user haproxy

group haproxy

daemon

tune.ssl.default-dh-param 2048

# nbproc 3

# turn on stats unix socket

stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------

# common defaults that all the 'listen' and 'backend' sections will

# use if not designated in their block

#---------------------------------------------------------------------

defaults

mode http

log global

option httplog

option dontlognull

option http-server-close

option forwardfor except 127.0.0.0/8

option redispatch

option httpclose

retries 3

timeout http-request 10s

timeout queue 1m

timeout connect 10s

timeout client 1m

timeout server 1m

timeout http-keep-alive 10s

timeout check 10s

stats enable

stats hide-version

stats uri /haproxy?status

stats realm Haproxy\ Statistics

stats auth admin:asd870719

# stats admin if TRUE

#---------------------------------------------------------------------

# main frontend which proxys to the backends

#---------------------------------------------------------------------

#frontend main *:5000

# acl url_static path_beg -i /static /images /javascript /stylesheets

# acl url_static path_end -i .jpg .gif .png .css .js

# use_backend static if url_static

# default_backend app

frontend wzlinux_ssl

bind *:80

bind *:443 ssl crt /etc/haproxy/wzlinux.pem

mode http

default_backend wzlinux

#---------------------------------------------------------------------

# static backend for serving up images, stylesheets and such

#---------------------------------------------------------------------

#backend static

# balance roundrobin

# server static 127.0.0.1:4331 check

backend wzlinux

mode http

balance roundrobin

option forwardfor

# option httpchk HEAD / HTTP/1.1\r\nHost:localhost

server wzlinux01 10.0.0.9:8080 check inter 15000 rise 2 fall 4

server wzlinux02 10.0.0.9:8081 check inter 15000 rise 2 fall 4

server wzlinux03 10.0.0.9:8082 check inter 15000 rise 2 fall 4

server wzlinux04 10.0.0.9:8083 check inter 15000 rise 2 fall 4

server wzlinux05 10.0.0.9:8084 check inter 15000 rise 2 fall 4

server wzlinux06 10.0.0.9:8085 check inter 15000 rise 2 fall 4

server wzlinux07 10.0.0.9:8086 check inter 15000 rise 2 fall 4

# http-request set-header X-Forwarded-Port %[dst_port]

# http-request add-header X-Forwarded-Proto https if { ssl_fc }

因为 SSL 连接在负载均衡器上终止了,我们依然来发送正常的 HTTP 请求到后台服务器。

只接受SSL连接

如果你想让网站只接受SSL连接,你可以添加向前端配置加上redirect导向:

frontend wzlinux_ssl

bind *:80

bind *:443 ssl crt /etc/haproxy/wzlinux.pem

redirect scheme https if !{ ssl_fc }

mode http

default_backend wzlinux

上面,我们添加了 redirect 导向,如果连接不是通过SSL连接的,它将http重定向到https。

4、使用HAProxy实现SSL穿透

使用SSL穿透,我们将让后台服务器处理SSL连接,而非负载均衡器来处理。

负载均衡器的工作就只是简单地将请求转发到配置好的后台服务器。因为连接还保持加密状态,HAProxy只能将它转发给其他服务器,其他事情就没法做了。

在这个配置中,我们需要在前端和后台配置中同时使用TCP模式而不是HTTP模式。HAProxy只会把连接当作信息流来转发到其他服务器,而不会使用在HTTP请求上才能使用的功能。

首先,我们调整一下前端配置:

frontend wzlinux_ssl

bind *:80

bind *:443

option tcplog

mode tcp

default_backend wzlinux

这里依然同时绑定80和443端口,以保证正常的HTTP连接和SSL连接都能工作。

正如上述提到的,转发一个安全连接而服务器而不作任何解码,我们需要使用TCP模式(mode tcp)。这也意味着我们需要设置tcp日志而不是默认的http日志(option tcplog)。

接着,我们要调整后台end配置。注意,我们还要将这个更改成TCP模式,并删除一些directives以避免因为修改/增加HTTP报头功能所带来的冲突:

backend wzlinux

mode tcp

balance roundrobin

option ssl-hello-chk

server wzlinux01 10.0.0.9:8080 check inter 15000 rise 2 fall 4

server wzlinux02 10.0.0.9:8081 check inter 15000 rise 2 fall 4

server wzlinux03 10.0.0.9:8082 check inter 15000 rise 2 fall 4

server wzlinux04 10.0.0.9:8083 check inter 15000 rise 2 fall 4

server wzlinux05 10.0.0.9:8084 check inter 15000 rise 2 fall 4

server wzlinux06 10.0.0.9:8085 check inter 15000 rise 2 fall 4

server wzlinux07 10.0.0.9:8086 check inter 15000 rise 2 fall 4

正如你所看到的,这里设置成了mode tcp - 前端和后台配置都需要设置成这个模式。

我们还删除了option forwardfor和http-request选项 - 这些不能用于TCP模式,而且我们也不能向已加密的请求添加报头,还有一些前面的默认配置也删去关于http的配置,这里不再演示。

为了检查正确与否,我们可以使用ssl-hello-chk来检查连接及它处理SSL(特别是SSLv3)连接的能力。

在这个例子中,我虚构了两个接受SSL证书的后台服务器。如果你有阅读过 edition SSL certificates ,你会看到如何将它们集成到 Apache 或 Nginx 来创建一个网络服务器后台,以处理SSL通信。使用SSL 穿越,不需要给HAProxy创建或使用SSL证书。后台服务器都能够处理SSL连接,如同只有一台服务器且没有使用负载均衡器那样。

(责任编辑:IT教学网)

更多

推荐照片处理文章