一、Haproxy概述;

二、Haproxy原理实现;

三、Nginx、LVS、Haproxy对比;

四、Haproxy配置文件讲解;

五、案例:Haproxy+Nginx+Tomcat搭建高可用集群;

一、Haproxy概述;

概述:Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,由C语言编写而成,支持会话保持、七层处理、健康检查、故障修复后自动加载、动静分离。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接;

Haproxy软件引入了frontend,backend的功能,frontend(acl规则匹配)可以运维管理人员根据任意HTTP请求头做规则匹配,然后把请求定向到相关的backend(server pools等待前端把请求转过来的服务器组)。

二、Haproxy原理实现;

代理模式:

1.四层tcp代理:例如:可用于邮件服务内部协议通信服务器、Mysql服务等;

2.七层应用代理:例如:HTTP代理或https代理。在4层tcp代理模式下,Haproxy仅在客户端和服务器之间双向转发流量。但是在7层模式下Haproxy会分析应用层协议,并且能通过运行、拒绝、交换、增加、修改或者删除请求(request)或者回应(reponse)里指定内容来控制协议。

四层代理:

ISO参考模型中的第四层传输层。四层负载均衡也称为四层交换机,它主要是通过分析IP层及TCP/UDP层的流量实现的基于IP加端口的负载均衡。常见的基于四层的负载均衡器有LVS、F5等。以常见的TCP应用为例,负载均衡器在接收到第一个来自客户端的SYN请求时,会通过设定的负载均衡算法选择一个最佳的后端服务器,同时将报文中目标IP地址修改为后端服务器IP,然后直接转发给该后端服务器,这样一个负载均衡请求就完成了。从这个过程来看,一个TCP连接是客户端和服务器直接建立的,而负载均衡器只不过完成了一个类似路由器的转发动作。在某些负载均衡策略中,为保证后端服务器返回的报文可以正确传递给负载均衡器,在转发报文的同时可能还会对报文原来的源地址进行修改。整个过程下图所示。

七层代理:

ISO参考模型中的最高层第七层应用层。七层负载均衡也称为七层交换机,此时负载均衡器支持多种应用协议,常见的有HTTP、FTP、SMTP等。七层负载均衡器可以根据报文内容,再配合负载均衡算法来选择后端服务器,因此也称为“内容交换器”。比如,对于Web服务器的负载均衡,七层负载均衡器不但可以根据“IP+端口”的方式进行负载分流,还可以根据网站的URL、访问域名、浏览器类别、语言等决定负载均衡的策略。例如,有两台Web服务器分别对应中英文两个网站,两个域名分别是A、B,要实现访问A域名时进入中文网站,访问B域名时进入英文网站,这在四层负载均衡器中几乎是无法实现的,而七层负载均衡可以根据客户端访问域名的不同选择对应的网页进行负载均衡处理。常见的七层负载均衡器有HAproxy、Nginx等。

这里仍以常见的TCP应用为例,由于负载均衡器要获取到报文的内容,因此只能先代替后端服务器和客户端建立连接,接着,才能收到客户端发送过来的报文内容,然后再根据该报文中特定字段加上负载均衡器中设置的负载均衡算法来决定最终选择的内部服务器。纵观整个过程,七层负载均衡器在这种情况下类似于一个代理服务器。整个过程如下图所示。

调度算法:

balance roundrobin:表示简单的轮询,负载均衡基础算法
balance static-rr:表示根据权重
balance leastconn:表示最少连接者先处理
balance source:表示根据请求源IP
balance uri:表示根据请求的URI;
balance url_param:表示根据请求的URl参数来进行调度
balance hdr(name):表示根据HTTP请求头来锁定每一次HTTP请求;
balance rdp-cookie(name):表示根据据cookie(name)来锁定并哈希每一次TCP请求。

三、Nginx、LVS、Haproxy对比;

 

Nginx(七层代理)

LVS(四层代理)

Haproxy(四层、七层)

优势

1.跨平台性;

2.配置简单,容易上手;

3.非阻塞、高并发连接;

4.事件驱动:通信机制采用 epoll 模型,支持更大的并发连接

Master/Worker 结构;

5.内存消耗小;

6.内置的健康检查功能;

7.支持 GZIP 压缩;

8.稳定性高:用于反向代理,宕机的概率微乎其微;

9.会话保持:通过调度算法实现;

10.动静分离:基于location匹配正则;

 

1.抗负载能力强,强大的四层代理,媲美F5硬件的四层代理;

2.对内存和 cpu 资源消耗比较低;

3.配置性比较低;

4.工作稳定,自身有完整的双机热备方案如 LVS+Keepalived;

5.无流量,LVS 只分发请求,而流量并不从它本身出去,这点保证了均衡器 IO 的性能不会受到大流量的影响。

6.会话保持;

1.支持 Session 的保持,Cookie 的引导;同时支持通过获取指定的 url 来检测后端服务器的状态。

2.基于TCP协议的负载效率高于Nginx;

3.负载均衡策略非常多;

4.动静分离:支持acl规则匹配;

5.高效稳定;

6.节点健康检查:支持多种方式检测,如端口、url;

 

劣势

1.适用性低:仅能支 持http、https 和 Email 协议,这样就在适用范围上面小些;

2.对后端服务器的健康检查,只支持通过端口来检测,不支持通过 ur l来检测;

3.不支持 Session 的直接保持,但能通过 ip_hash 来解决;

4.不适用于高负载量的并发集群;

1.健康检查:无法检查后端节点的健康情况;

2.动静分离:不支持正则,无法区分请求;

3.实现比较麻烦;

4.网络环境依赖性较大;

1.扩展性差:添加新功能很费劲,对不断扩展的新业务,haproxy很难应对;

2.在四层代理时,仅支持tcp协议的代理;

 

总结:

  • 大型网站架构:对性能有严格要求的时候可以使用lvs或者硬件F5,就单纯从负载均衡的角度来说,lvs也许会成为主流,更适合现在大型的互联网公司;
  • 中型网站架构:对于页面分离请求由明确规定,并且性能有严格要求时,可以使用haproxy;
  • 中小型网站架构:比如日 PV 小于1000万,需要进行高并发的网站或者对网络不太严格的时候,可以使用nginx;

 

四、Haproxy配置文件讲解;

  • global:全局配置区域参数是进程级的,通常是和操作系统相关。这些参数一般只设置一次,如果配置无误,就不需要再次进行修改;
  • defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件;
  • frontend:处理请求的虚拟节点,Frontend可以将匹配到本地区域的请求交给下边的backend;
  • backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器;

配置文件样例:

五、案例:Haproxy+Nginx+Tomcat搭建高可用集群

案例拓扑:

案例环境:

案例步骤:

  • 搭建并配置nginx节点,准备网页,启动服务,测试节点(两台nginx配置相同,在此列出一台的配置);
  • 搭建并配置tomcat节点,准备网页,启动服务,测试节点(两台tomcat配置相同,在此列出一台的配置);
  • 安装Haproxy程序软件;
  • 配置Haproxy服务;
  • 启动Haproxy服务;
  • 客户端访问测试验证集群;
  • 将Haproxy的日志文件分离(便于查看);
  • 配置Haproxy服务的日志管理界面;
  • 客户端访问测试Haproxy的日志管理界面;

 

  • 搭建并配置nginx节点,准备网页,启动服务,测试节点(两台nginx配置相同,在此列出一台的配置);

[root@ng1 ~]# yum -y install pcre-devel zlib-devel

[root@ng1 ~]# useradd -M -s /sbin/nologin nginx

[root@ng1 ~]# tar zxvf nginx-1.12.2.tar.gz -C /usr/src/

[root@ng1 ~]# cd /usr/src/nginx-1.12.2/

[root@ng1 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

[root@ng1 nginx-1.12.2]# make && make install

[root@ng1 nginx-1.12.2]# cd

[root@ng1 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

[root@ng1 ~]# vi  /usr/lib/systemd/system/nginx.service

[Unit]

Description=nginxapi

After=network.target

[Service]

Type=forking

PIDFile=/usr/local/nginx/logs/nginx.pid

ExecStart=/usr/local/nginx/sbin/nginx

ExecReload=kill -s HUP $(cat /usr/local/nginx/logs/nginx.pid)

ExecStop=kill -s QUIT $(cat /usr/local/nginx/logs/nginx.pid)

PrivateTmp=Flase

[Install]

WantedBy=multi-user.target

[root@ng1 ~]# echo "192.168.100.102" >>/usr/local/nginx/html/index.html

[root@ng1 ~]# systemctl start nginx

[root@ng1 ~]# systemctl enable nginx

[root@ng1 ~]# netstat -utpln |grep nginx

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3538/nginx: master

 

  • 搭建并配置tomcat节点,准备网页,启动服务,测试节点(两台tomcat配置相同,在此列出一台的配置);

[root@tm1 ~]# ls

apache-tomcat-9.0.10.tar.gz  jdk-8u171-linux-x64.tar.gz

[root@tm1~]# rpm -qa |grep java

[root@tm1 ~]# tar zxvf jdk-8u171-linux-x64.tar.gz

[root@tm1 ~]# mv jdk1.8.0_171/ /usr/local/java

[root@tm1 ~]# ls /usr/local/java

bin        db       javafx-src.zip  lib      man          release  THIRDPARTYLICENSEREADME-JAVAFX.txt

COPYRIGHT  include  jre             LICENSE  README.html  src.zip  THIRDPARTYLICENSEREADME.txt

[root@tm1 ~]# cat <<END >>/etc/profile

export JAVA_HOME=/usr/local/java

export PATH=$PATH:/usr/local/java/bin

END

[root@tm1~]# source  /etc/profile

[root@tm1 ~]# java -version

java version "1.8.0_171"

Java(TM) SE Runtime Environment (build 1.8.0_171-b11)

Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

[root@tm1 ~]# tar zxvf apache-tomcat-9.0.10.tar.gz

[root@tm1 ~]# mv apache-tomcat-9.0.10 /usr/local/tomcat

[root@tm1 ~]# ls /usr/local/tomcat

bin  conf  lib  LICENSE  logs  NOTICE  RELEASE-NOTES  RUNNING.txt  temp  webapps  work

[root@tm1 ~]# vi /usr/local/tomcat/conf/server.xml

150 <Context docBase="/web/webapp" path="" reloadable="false"></Context>

:wq

[root@tm1 ~]# mkdir -p /web/webapp

[root@tm1 ~]# vi /web/webapp/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<head>

<title>JSP TEST PAGE1 </title>

</head>

<body>

<% out.println("Welcome to test site;http://192.168.100.104");%>

</body>

</html>

[root@tm1 ~]# /usr/local/tomcat/bin/startup.sh    ##启动apache-tomcat

[root@tm1 ~]# netstat -utpln |grep 8080

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      14758/java

 

  • 安装Haproxy程序软件;

[root@ha ~]# yum -y install pcre-devel bzip2-devel ##安装依赖软件包

[root@ha ~]# tar zxvf haproxy-1.4.24.tar.gz -C /usr/src/

[root@ha ~]# cd /usr/src/haproxy-1.4.24/

[root@ha haproxy-1.4.24]# uname -r

3.10.0-693.5.2.el7.x86_64

[root@ha haproxy-1.4.24# make TARGET=linux310 ##make编译,指定系统内核版本为3.10

[root@ha haproxy-1.4.24]# make install

[root@ha haproxy-1.4.24]# cd

 

  • 配置Haproxy服务;

[root@ha ~]# mkdir /etc/haproxy ##创建配置文件目录

[root@ha ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /etc/haproxy/

[root@ha ~]# vi /etc/haproxy/haproxy.cfg  ##修改主配置文件如下

global

log 127.0.0.1   local0 info                     ##定义日志级别;

log 127.0.0.1   local1 notice

maxconn 4096            ##设定每个haproxy进程所接受的最大并发连接数

uid 99                  ##指定运行服务的用户和组

gid 99

daemon                  ##指定运行模式为daemon,以守护进程的方式工作在后台

defaults

log     global                          ##采取global中的日志配置

mode    http                            ##默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK

option  httplog                         ##采用http日志格式记录日志

option  dontlognull                     ##不记录健康检查的日志记录

option httpclose                        ##关闭保持连接

retries 3                               ##检查节点最多失败次数

maxconn 2000                            ##最大连接数,定义不得大于global中的值

contimeout      5000    ##连接超时时间,毫秒,在此期间,如若客户端与服务端无法成功建立连接,则断掉

clitimeout      50000   ##设置连接客户端发送数据时的成功连接最长等待时间,单位为毫秒,如若在这期间无法请求成功,则断掉

srvtimeout      50000   ##设置服务器端回应客户端数据发送的最长等待时间,如果在这期间还无法发送成功,则断掉

##################无分离页面需求的配置##############

#listen webcluster 0.0.0.0:80                   ##指定haproxy服务监听地址和端口

#       option  httpchk GET /index.html         ##指定http请求方法和默认文件

#       balance roundrobin                      ##指定轮询调度算法

#       server  inst1 192.168.100.155:80 check inter 2000 fall 3                ##定义web节点,检测心跳频率,单位为毫秒,定义检查节点最多失败次数

#       server  inst2 192.168.100.156:80 check inter 2000 fall 3

##################有分离页面需求的配置##############

frontend http                           ##定义名称为http

bind *:80                       ##指定监听地址和端口

acl linuxfan1 hdr_end(host) -i 192.168.100.101                  ##指定类型为访问路径的域名,-i不区分大小写

acl linuxfan2 hdr_end(host) -i www.linuxfan.cn

acl linuxfan3 path_end -i .jsp .do .css .js                     ##指定请求文件格式为.jsp

#acl linuxfan3 hdr_reg -i \.(css|png|jpg|jpeg|gif|ico|swf|xml|txt|pdf|do|jsp|js)$       ##调用正则表达式

acl linuxfan4 path_end -i .html .css .png .jpg .jpeg .xml       ##指定请求文件格式为.html

acl linuxfan5 path_beg -i /WebRoot                              ##指定访问URL中的路径,如http://www.linuxfan.cn/WebRoot/index.jsp

use_backend dongtai if linuxfan1 linuxfan3

use_backend dongtai if linuxfan2 linuxfan3

use_backend dongtai if linuxfan1 linuxfan5 linuxfan3

use_backend dongtai if linuxfan2 linuxfan5 linuxfan3

default_backend jingtai                                 ##默认的请求使用backend dongtai

backend jingtai         ##定义backend :jingtai

mode http                       ##定义模式

balance roundrobin              ##定义调度算法为轮询

server jingtai01 192.168.100.102:80 check inter 2000 fall 3             ##定义节点

server jingtai02 192.168.100.103:80 check inter 2000 fall 3

backend dongtai

mode http

balance roundrobin

server dongtai01 192.168.100.104:8080 check inter 2000 fall 3

server dongtai02 192.168.100.105:8080 check inter 2000 fall 3

 

  • 启动Haproxy服务;

[root@ha ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy

[root@ha ~]# chmod +x /etc/init.d/haproxy

[root@ha ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/

[root@ha ~]# /etc/init.d/haproxy start

[root@ha ~]# netstat -utpln |grep haproxy

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1264/haproxy

udp        0      0 0.0.0.0:52177           0.0.0.0:*                           1264/haproxy

 

  • 客户端访问测试验证集群;
  • 将Haproxy的日志文件分离(便于查看);

[root@ha ~]# vi /etc/rsyslog.conf

15 $ModLoad imudp

16 $UDPServerRun 514

##打开此配置项的注释,使rsyslog服务可以接受udp协议514端口的系统日志消息

74 local0.*        /var/log/haproxy/ha-info.log

75 local1.*        /var/log/haproxy/ha-notice.log

##在haproxy主配置文件中所指定的日志设备和日志级别将其输出到不同的文件中,以方便查看;

:wq

[root@ha ~]# vi /etc/sysconfig/rsyslog

SYSLOGD_OPTIONS="-r -m 0 -c 2"

##-r 接收udp 514号端口的系统日志消息;-m 0 为日志消息添加时间等的标记 ;-c 2表示使用兼容模式

:wq

[root@ha ~]# systemctl restart rsyslog

[root@ha ~]# /etc/init.d/haproxy  restart

[root@ha ~]# tail -f /var/log/haproxy/ha-info.log

Jul 27 18:14:44 localhost haproxy[1375]: 192.168.100.1:52965 [27/Jul/2018:18:14:44.167] http dongtai/dongtai01 0/0/0/2/3 200 349 - - ---- 0/0/0/0/0 0/0 "GET /index.jsp HTTP/1.1"

  • 配置Haproxy服务的日志管理界面;

[root@ha ~]# vi /etc/haproxy/haproxy.cfg ###在后边添加

listen status 0.0.0.0:8080      ##监控8080端口

stats enable        ##开启stats的模块

stats uri /stats  ##指定访问的url

stats auth admin:123456  ##指定登陆监控页面的用户名密码

stats realm (Haproxy\ statistic)    ##定义页面的提示信息

[root@ha ~]# /etc/init.d/haproxy restart

 

  • 客户端访问测试Haproxy的日志管理界面;

自己操作过程

部署规划表

主机2和3的部署

mcw02主机

yum install -y nginx
nginx
echo mcw02 >/usr/share/nginx/html/index.html mcw03主机 yum install -y nginx
nginx
echo mcw03 >/usr/share/nginx/html/index.html

部署访问结果:

访问主机2

访问主机3

mcw04和mcw05主机的配置

mcw04主机

安装jdk
wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.88/bin/apache-tomcat-8.5.88.tar.gz
tar xf apache-tomcat-8.5.88.tar.gz
cd apache-tomcat-8.5.88/bin/
./startup.sh
cd ../webapps/ROOT
cp index.jsp index.jspbak
[root@mcw04 ROOT]# vim index.jsp
[root@mcw04 ROOT]# cat index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP TEST PAGE1 </title>
</head>
<body>
<% out.println("Welcome to test site;http://mcw04");%>
</body>
</html>
[root@mcw04 ROOT]# mcw05主机 同mcw04主机,区别在于首页显示的是mcw05的主机名 <% out.println("Welcome to test site;http://mcw05");%>

mcw04的访问效果

mcw05的访问效果

mcw01安装haproxy

[root@mcw01 ~]# wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-1.4.6.tar.gz/dc354ea451762135fa45657ddef67734/haproxy-1.4.6.tar.gz
[root@mcw01 ~]# tar xf haproxy-1.4.6.tar.gz
[root@mcw01 ~]# cd haproxy-1.4.6/
[root@mcw01 haproxy-1.4.6]# ls
CHANGELOG contrib doc ebtree examples include LICENSE Makefile Makefile.bsd Makefile.osx README ROADMAP src SUBVERS tests TODO VERDATE VERSION
[root@mcw01 haproxy-1.4.6]# uname -r
3.10.0-693.el7.x86_64
[root@mcw01 haproxy-1.4.6]# make TARGET=linux310
[root@mcw01 haproxy-1.4.6]# make install
install -d /usr/local/sbin
install haproxy /usr/local/sbin
install -d /usr/local/share/man/man1
install -m 644 doc/haproxy.1 /usr/local/share/man/man1
install -d /usr/local/doc/haproxy
for x in configuration architecture haproxy-en haproxy-fr; do \
install -m 644 doc/$x.txt /usr/local/doc/haproxy ; \
done
[root@mcw01 haproxy-1.4.6]#

配置Haproxy服务

[root@mcw01 ~]# mkdir /etc/haproxy
[root@mcw01 ~]# cd haproxy-1.4.6/
[root@mcw01 haproxy-1.4.6]# ls
CHANGELOG contrib doc ebtree examples haproxy include LICENSE Makefile Makefile.bsd Makefile.osx README ROADMAP src SUBVERS tests TODO VERDATE VERSION
[root@mcw01 haproxy-1.4.6]# cp examples/haproxy.cfg /etc/haproxy/
[root@mcw01 haproxy-1.4.6]# vim /etc/haproxy/haproxy.cfg

查看配置文件,可以看的有全局生效的配置,有默认的配置,有监听的服务,还有bakends

global
log 127.0.0.1 local0 info ##定义日志级别;
log 127.0.0.1 local1 notice
maxconn 4096 ##设定每个haproxy进程所接受的最大并发连接数
uid 99 ##指定运行服务的用户和组
gid 99
daemon ##指定运行模式为daemon,以守护进程的方式工作在后台
defaults
log global ##采取global中的日志配置
mode http ##默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
option httplog ##采用http日志格式记录日志
option dontlognull ##不记录健康检查的日志记录
option httpclose ##关闭保持连接
retries 3 ##检查节点最多失败次数
maxconn 2000 ##最大连接数,定义不得大于global中的值
contimeout 5000 ##连接超时时间,毫秒,在此期间,如若客户端与服务端无法成功建立连接,则断掉
clitimeout 50000 ##设置连接客户端发送数据时的成功连接最长等待时间,单位为毫秒,如若在这期间无法请求成功,则断掉
srvtimeout 50000 ##设置服务器端回应客户端数据发送的最长等待时间,如果在这期间还无法发送成功,则断掉 ##################无分离页面需求的配置##############
#listen webcluster 0.0.0.0:80 ##指定haproxy服务监听地址和端口
# option httpchk GET /index.html ##指定http请求方法和默认文件
# balance roundrobin ##指定轮询调度算法
# server inst1 192.168.100.155:80 check inter 2000 fall 3 ##定义web节点,检测心跳频率,单位为毫秒,定义检查节点最多失败次数
# server inst2 192.168.100.156:80 check inter 2000 fall 3 ##################有分离页面需求的配置##############
frontend http ##定义名称为http
bind *:80 ##指定监听地址和端口
acl linuxfan1 hdr_end(host) -i 192.168.100.101 ##指定类型为访问路径的域名,-i不区分大小写
acl linuxfan2 hdr_end(host) -i www.linuxfan.cn acl linuxfan3 path_end -i .jsp .do .css .js ##指定请求文件格式为.jsp
#acl linuxfan3 hdr_reg -i \.(css|png|jpg|jpeg|gif|ico|swf|xml|txt|pdf|do|jsp|js)$ ##调用正则表达式
acl linuxfan4 path_end -i .html .css .png .jpg .jpeg .xml ##指定请求文件格式为.html acl linuxfan5 path_beg -i /WebRoot ##指定访问URL中的路径,如http://www.linuxfan.cn/WebRoot/index.jsp use_backend dongtai if linuxfan1 linuxfan3
use_backend dongtai if linuxfan2 linuxfan3
use_backend dongtai if linuxfan1 linuxfan5 linuxfan3
use_backend dongtai if linuxfan2 linuxfan5 linuxfan3 default_backend jingtai ##默认的请求使用backend dongtai backend jingtai ##定义backend :jingtai
mode http ##定义模式
balance roundrobin ##定义调度算法为轮询
server jingtai01 192.168.100.102:80 check inter 2000 fall 3 ##定义节点
server jingtai02 192.168.100.103:80 check inter 2000 fall 3 backend dongtai
mode http
balance roundrobin
server dongtai01 192.168.100.104:8080 check inter 2000 fall 3
server dongtai02 192.168.100.105:8080 check inter 2000 fall 3

如下分析,满足.jsp .do 这样的文件的就定位为fan3 ,满足访问路径是下面那个ip的就是fan1 ,上面定义好了acl,下面对acl进行判断,如果满足fan1和fan3的,就使用dongtai这个backend。然后看动态bakend,这里是知道模式是http七层代理,轮询算法,服务是什么,检查间隔和失败的次数,后端服务,这里的动态后端指向的是tomcat服务,而不是nginx服务

再看一下fan5,这是指定访问路径带有/WwbRoot的acl的定义,有点像nginx的根据路径匹配

再看下下面有个默认使用的backend,也就是相当于nginx里面匹配/,默认匹配,走jingtai这个backend。下面有对jingtai这个backend的定义,它是走哪些服务,这样就使用haproxy实现了动静分离部署,

我把配置文件修改一下,后端服务器改成我们的主机 2 3 4 5

[root@mcw01 haproxy-1.4.6]# vim /etc/haproxy/haproxy.cfg
[root@mcw01 haproxy-1.4.6]#
[root@mcw01 haproxy-1.4.6]#
[root@mcw01 haproxy-1.4.6]# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0 info ##定义日志级别;
log 127.0.0.1 local1 notice
maxconn 4096 ##设定每个haproxy进程所接受的最大并发连接数
uid 99 ##指定运行服务的用户和组
gid 99
daemon ##指定运行模式为daemon,以守护进程的方式工作在后台
defaults
log global ##采取global中的日志配置
mode http ##默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
option httplog ##采用http日志格式记录日志
option dontlognull ##不记录健康检查的日志记录
option httpclose ##关闭保持连接
retries 3 ##检查节点最多失败次数
maxconn 2000 ##最大连接数,定义不得大于global中的值
contimeout 5000 ##连接超时时间,毫秒,在此期间,如若客户端与服务端无法成功建立连接,则断掉
clitimeout 50000 ##设置连接客户端发送数据时的成功连接最长等待时间,单位为毫秒,如若在这期间无法请求成功,则断掉
srvtimeout 50000 ##设置服务器端回应客户端数据发送的最长等待时间,如果在这期间还无法发送成功,则断掉 ##################无分离页面需求的配置##############
#listen webcluster 0.0.0.0:80 ##指定haproxy服务监听地址和端口
# option httpchk GET /index.html ##指定http请求方法和默认文件
# balance roundrobin ##指定轮询调度算法
# server inst1 192.168.100.155:80 check inter 2000 fall 3 ##定义web节点,检测心跳频率,单位为毫秒,定义检查节点最多失败次数
# server inst2 192.168.100.156:80 check inter 2000 fall 3 ##################有分离页面需求的配置##############
frontend http ##定义名称为http
bind *:80 ##指定监听地址和端口
acl linuxfan1 hdr_end(host) -i 10.0.0.1 ##指定类型为访问路径的域名,-i不区分大小写
acl linuxfan2 hdr_end(host) -i www.linuxfan.cn acl linuxfan3 path_end -i .jsp .do .css .js ##指定请求文件格式为.jsp
#acl linuxfan3 hdr_reg -i \.(css|png|jpg|jpeg|gif|ico|swf|xml|txt|pdf|do|jsp|js)$ ##调用正则表达式
acl linuxfan4 path_end -i .html .css .png .jpg .jpeg .xml ##指定请求文件格式为.html acl linuxfan5 path_beg -i /WebRoot ##指定访问URL中的路径,如http://www.linuxfan.cn/WebRoot/index.jsp use_backend dongtai if linuxfan1 linuxfan3
use_backend dongtai if linuxfan2 linuxfan3
use_backend dongtai if linuxfan1 linuxfan5 linuxfan3
use_backend dongtai if linuxfan2 linuxfan5 linuxfan3 default_backend jingtai ##默认的请求使用backend dongtai backend jingtai ##定义backend :jingtai
mode http ##定义模式
balance roundrobin ##定义调度算法为轮询
server jingtai01 10.0.0.12:80 check inter 2000 fall 3 ##定义节点
server jingtai02 10.0.0.13:80 check inter 2000 fall 3 backend dongtai
mode http
balance roundrobin
server dongtai01 10.0.0.14:8080 check inter 2000 fall 3
server dongtai02 10.0.0.15:8080 check inter 2000 fall 3
[root@mcw01 haproxy-1.4.6]#

复制启动命令并启动haproxy

[root@mcw01 ~]# cp /root/haproxy-1.4.6/examples/haproxy.init /etc/init.d/haproxy
[root@mcw01 ~]# chmod +x /etc/init.d/haproxy
[root@mcw01 ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/
[root@mcw01 ~]# ls -l /usr/sbin/haproxy
lrwxrwxrwx 1 root root 23 Apr 20 23:41 /usr/sbin/haproxy -> /usr/local/sbin/haproxy
[root@mcw01 ~]# /etc/init.d/haproxy start
Reloading systemd: [ OK ]
Starting haproxy (via systemctl): [ OK ]
[root@mcw01 ~]# netstat -utpln |grep haproxy
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13469/haproxy
udp 0 0 0.0.0.0:11498 0.0.0.0:* 13469/haproxy
[root@mcw01 ~]#

然后我们访问一下,看效果,是否能将nginx作为静态,tomcat作为动态来实现负载均衡

mcw02 mcw03 是nginx主机   mcw04 mcw05是tomcat主机  ,mcw01是haproxy主机。我们下面测试,就是访问haproxy的80端口服务,来查看是否根据acl中以.jsp .html来决定访问的是后端那个web服务器。在haproxy的设置中,.jsp结尾的得找tomcat服务器,并实现负载均衡;.html结尾的文件应该是走默认的backend,也就是访问nginx服务器,并实现负载均衡。

下面通过haproxy访问,看效果:

成功实现访问.html的走默认backend,做nginx服务器的负载均衡

访问报错了,说明是走的nginx服务器,但是nginx服务器没有这个jsp文件

我们修改一下,去掉fan1条件,只匹配fan3,匹配成功,也就是jsp结尾就走dongtai backend。然后重启服务

这样我们就能访问到了

并且实现了负载均衡

一些端口转发的参考案例

   #machangwei
listen xiaomaaupage
bind 0.0.0.0:10002
mode tcp
server server1 10.0.0.77:8850 check inter 5000 fall 3 #machangwei
listen xiaomaau80
bind 0.0.0.0:10003
mode tcp
server server1 10.0.0.77:80 check inter 5000 fall 3 #machangwei
listen xiaomaau180
bind 0.0.0.0:10004
mode http
server server1 10.0.0.80:80 check inter 5000 fall 3 #machangwei
listen xiaomaau02
bind 0.0.0.0:10005
mode tcp
server server1 10.0.0.80:8060 check inter 5000 fall 3

生产k8s的apiserver配置高可用

haproxy 用的是bond0网卡,有两个IP,用的第二个IP,这个机器上还开启了隧道tun0网卡。

frontend  kubernetes-apiserver
mode tcp
bind *:xxx3
option tcplog
default_backend kubernetes-apiserver backend kubernetes-apiserver
mode tcp
balance roundrobin
server kubemaster001.x.x.com 10.x.x.x:6443 check
server kubemaster002.x.x.com 10.x.x.1x:6443 check
server kubemaster003.x.x.com 10.x.x.x:6443 check

Haproxy+Nginx+Tomcat实现动静分离页面的更多相关文章

  1. nginx+tomcat实现动静分离(转)

    本文设计的动静分离结构 在本文中,我们将静态资源放在 A 主机的一个目录上,将动态程序放在 B 主机上,同时在 A 上安装 Nginx 并且在 B 上安装 Tomcat.配置 Nginx,当请求的是 ...

  2. nginx+tomcat网页动静分离配置

    1.环境描述 nginx server (Proxy):192.168.1.135(作为代理服务器)WEB server1: 192.168.1.138(使用tomcat作为web容器)WEB ser ...

  3. 使用nginx+tomcat实现动静分离

    动态资源与静态资源的区别 微微的概括一下 静态资源: 当用户多次访问这个资源,资源的源代码永远不会改变的资源. 动态资源:当用户多次访问这个资源,资源的源代码可能会发送改变. 什么是动静分离 动静分离 ...

  4. Nginx+Tomcat实现动静分离和负载均衡

    一.什么是动静分离? Nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离.严格意义上说应该是将动态请求和静态请求分开,可以理解成使用Nginx处理静态 ...

  5. nginx+tomcat实现动静分离

    本文设计的动静分离结构 在本文中,我们将静态资源放在 A 主机的一个目录上,将动态程序放在 B 主机上,同时在 A 上安装 Nginx 并且在 B 上安装 Tomcat.配置 Nginx,当请求的是 ...

  6. nginx+tomcat:动静分离+https

    nginx server { listen 80; server_name 192.168.0.103; # http访问重写为https rewrite ^ https:/$http_host$re ...

  7. Tomcat WEB搭建+Nginx负载均衡动静分离+DNS解析的实验

    实验拓扑图: 实验环境: 在VMware workstation搭建虚拟环境,利用网络适配器的Nat和桥接模式模拟内网和外网环境. 实验过程中需要安装的工具包包括:vim unzip lrzsz ls ...

  8. Ngigx+Tomcat配置动静分离,负载均衡

    由于公司使用过Ngnix,对于刚接触Nginx来说,感觉有些好奇,于是研究了下. 本人在windows下使用的版本是nginx-1.8.1: 1. 启动Ngnix 双击nginx-1.8.1文件夹中n ...

  9. Nginx+Tomcat 实现动态分离,负载均衡

    什么是动静分离 为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时 ...

  10. Nginx教程(6) 动静分离架构

    一.原理 Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离.严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx 处理静态页面,To ...

随机推荐

  1. 小师妹学JavaIO之:文件写入那些事

    目录 简介 字符输出和字节输出 格式化输出 输出其他对象 在特定的位置写入 给文件加锁 总结 简介 小师妹又对F师兄提了一大堆奇奇怪怪的需求,要格式化输出,要特定的编码输出,要自己定位输出,什么?还要 ...

  2. OpenHarmony 4.0 Beta1发布,邀您体验

      初夏之际,OpenAtom OpenHarmony(简称"OpenHarmony") 4.0 Beta1版本如期而至.4.0 Beta1版本在3.2 Release版本基础上, ...

  3. dev DEV控件:gridControl常用属性设置

    引用:https://www.cnblogs.com/kingsliu/articles/6145679.html 1.隐藏最上面的GroupPanelgridView1.OptionsView.Sh ...

  4. Qt线程简单使用三:QRunnable~线程池

    需求: 点击QPushButton按钮,QLabel中的数字,不断累加,一直到999.   做法: 创建任务类,点击QPushButton后,将任务类放入线程池中运行,通过任务类while循环,不断发 ...

  5. HarmonyOS应用事件打点开发指导

      简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志,难以识别其中的关键信息.因此,应用开发者需要一种数据打点机制,用来评估如访问数.日活.用户操作习惯以及影响用户使用的关键因素等关键 ...

  6. nginx重新整理——————https[七]

    前言 简单介绍一些https. 正文 pki 公钥基础设施: 证书链: tls 通讯过程 验证身份 达成安全套件共识 传递秘钥 加密通讯 sudo yum install epel-release s ...

  7. http协议重新整理——————历史[一]

    前言 简单整理一些http协议. 正文 20 世纪 60 年代,美国国防部高等研究计划署(ARPA)建立了 ARPA 网,它有四个分布在各地的节点,被认为是如今互联网的"始祖". ...

  8. 重新点亮linux 基本软件————防火墙[一]

    前言 简单介绍一下linux的防火墙. 正文 防火墙分类: 软件防火墙和硬件防火墙 包过:过滤防火墙和应用层防火墙 iptables 的表和链 规则表: filter nat mangle raw f ...

  9. 牛客网-SQL专项训练8

    ①在SQL中用条件表示价格在在30至40之间,应该如何表达(B) 解析:IN 与BETWEEN AND的区分 (数字型) 1.in (xx,xx,xx,...)  通常是不连续的,in(30,40)要 ...

  10. 阿里云架构师梁旭:MES on 云盒,助力客户快速构建数字工厂

    简介: 四大优势:一站式交付.业务低延时.数据本地驻留.多工厂统一运维 2022年5月18日,在"云上数字工厂与中小企业数字化转型创新论坛"暨"鼎捷MES & 阿 ...