学习Haproxy (七)
haproxy是个高性能的tcp和http的反向代理。它就是个代理。不像nginx还做web服务器

nginx的优点和缺点
|
1
2
3
4
5
6
7
8
9
10
11
|
优点:1、web服务器,应用比较广泛,大家都会2、可以作为7层负载均衡,location设置复杂的基于HTTP的负载均衡3、性能强大,网络依赖小4、安装配置简单缺点:1、健康检查单一,不支持基于url的健康检查(可以使用第三方插件实现)2、负载均衡算法少3、不能动态管理,比如踢出某个web节点,需要reload配置4、没有集群upstream的状态页面 |
haproxy的优点和缺点
|
1
2
3
4
5
6
7
8
9
10
11
|
优点:1、专门做反向代理负载均衡2、负载均衡算法比较多,大于等于8种,比nginx丰富3、性能不低于nginx,大于等于nginx4、支持动态管理,通过和haproxy的sock进行通信,可以进行管理5、有比较丰富的Dashboard的页面,监控方便。有管理页面6、比较强大的7层反向代理功能,在7层方便,功能强大7、会话保持比nginx丰富。可以基于cookie和源IP(nginx也能做到基于IP和cookie)缺点:配置没有Nginx简单(相对熟悉) |
先杀掉原先的nginx进程,防止80端口被占用,导致haproxy无法启动
|
1
2
3
4
|
[root@linux-node1 conf]# pkill nginx[root@linux-node1 conf]# ps aux | grep nginxroot 27201 0.0 0.0 112664 972 pts/0 S+ 05:39 0:00 grep --colour=auto nginx[root@linux-node1 conf]# |
部署haproxy,这里是编译安装,版本是1.6.3,执行命令如下
|
1
2
3
4
5
6
7
8
|
cd /usr/local/src/wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.3.tar.gztar xfz haproxy-1.6.3.tar.gz cd haproxy-1.6.3make TARGET=linux2628 PREFIX=/usr/local/haproxy-1.6.3make installcp /usr/local/sbin/haproxy /usr/sbin/haproxy -v |
|
1
2
3
4
5
|
[root@linux-node1 haproxy-1.6.3]# haproxy -vHA-Proxy version 1.6.3 2015/12/25Copyright 2000-2015 Willy Tarreau <willy@haproxy.org>[root@linux-node1 haproxy-1.6.3]# |
|
1
2
3
4
5
6
7
8
|
[root@linux-node1 haproxy-1.6.3]# pwd/usr/local/src/haproxy-1.6.3[root@linux-node1 haproxy-1.6.3]# cd examples/[root@linux-node1 examples]# ls haproxy.init haproxy.init[root@linux-node1 examples]# cp haproxy.init /etc/init.d/haproxy[root@linux-node1 examples]# chmod +x /etc/init.d/haproxy [root@linux-node1 examples]# |
创建haproxy用户和相关目录
useradd -r表示创建系统账号
|
1
2
3
4
5
|
[root@linux-node1 examples]# useradd -r haproxy[root@linux-node1 examples]# [root@linux-node1 examples]# mkdir /etc/haproxy -p[root@linux-node1 examples]# mkdir /var/lib/haproxy -p[root@linux-node1 examples]# |
重启rsyslog
|
1
2
3
4
5
6
|
[root@linux-node1 ~]# vim /etc/rsyslog.conf [root@linux-node1 ~]# systemctl restart rsyslog[root@linux-node1 ~]# netstat -lnup | grep 514udp 0 0 0.0.0.0:514 0.0.0.0:* 27509/rsyslogd udp6 0 0 :::514 :::* 27509/rsyslogd [root@linux-node1 ~]# |
关于mode http 你如果不写,默认继承defaults里面的
defaults默认不写好像也是http。
tcp的需要注明。
mode tcp
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[root@linux-node1 ~]# cd /etc/haproxy/[root@linux-node1 haproxy]# vim haproxy.cfg[root@linux-node1 haproxy]# cat haproxy.cfg global chroot /var/lib/haproxy daemon group haproxy user haproxy log 127.0.0.1:514 local3 infodefaults log global #使用全局的日志配置 mode http option httplog option dontlognull #日志中不记录空连接,比如不记录健康检查的连接 timeout client 50000 timeout server 50000 timeout connect 5000frontend http_front bind *:80 stats uri /haproxy?stats default_backend http_backbackend http_back balance roundrobin server linux-node1 10.0.1.105:8080 check server linux-node2 10.0.1.106:8080 check[root@linux-node1 haproxy]# |
启动haproxy
|
1
2
3
4
5
6
7
8
|
[root@linux-node1 ~]# /etc/init.d/haproxy startReloading systemd: [ 确定 ]Starting haproxy (via systemctl): [ 确定 ][root@linux-node1 ~]# [root@linux-node1 ~]# netstat -lntp | grep 80tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 27556/haproxy tcp6 0 0 :::8080 :::* LISTEN 20130/httpd [root@linux-node1 ~]# |
|
1
2
3
4
5
|
[root@linux-node1 ~]# grep local3 /etc/rsyslog.conf local3.* /var/log/haproxy.log[root@linux-node1 ~]# [root@linux-node1 ~]# systemctl restart rsyslog[root@linux-node1 ~]# |

再次重启haproxy服务,就可以看到haproxy的日志文件生成了。可以看到启动过程
|
1
2
3
4
5
6
7
8
9
|
[root@linux-node1 ~]# /etc/init.d/haproxy restartRestarting haproxy (via systemctl): [ 确定 ][root@linux-node1 ~]# tail -f /var/log/haproxy.log Feb 27 06:33:43 localhost haproxy[27648]: Stopping frontend http_front in 0 ms.Feb 27 06:33:43 localhost haproxy[27648]: Stopping backend http_back in 0 ms.Feb 27 06:33:43 localhost haproxy[27648]: Proxy http_front stopped (FE: 0 conns, BE: 0 conns).Feb 27 06:33:43 localhost haproxy[27648]: Proxy http_back stopped (FE: 0 conns, BE: 0 conns).Feb 27 06:33:43 localhost haproxy[27687]: Proxy http_front started.Feb 27 06:33:43 localhost haproxy[27687]: Proxy http_back started. |
继续优化更改下配置
haproxy可以自定义健康检查的url,这是nginx不具备的
check:启用健康检测
inter:健康检测间隔
rise:检测服务可用的连续次数
fall:检测服务不可用的连续次数
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
[root@linux-node1 ~]# cd /etc/haproxy/[root@linux-node1 haproxy]# vim haproxy.cfg [root@linux-node1 haproxy]# cat haproxy.cfg global chroot /var/lib/haproxy daemon group haproxy user haproxy log 127.0.0.1:514 local3 infodefaults log global mode http option httplog option dontlognull timeout client 50000 timeout server 50000 timeout connect 5000frontend http_front mode http bind *:80 stats uri /haproxy?stats default_backend http_backbackend http_back option httpchk GET /index.html balance roundrobin server linux-node1 10.0.1.105:8080 check inter 2000 rise 3 fall 3 weight 1 server linux-node2 10.0.1.106:8080 check inter 2000 rise 3 fall 3 weight 1[root@linux-node1 haproxy]# |
重启服务
|
1
2
3
4
5
6
|
[root@linux-node1 haproxy]# /etc/init.d/haproxy restartRestarting haproxy (via systemctl): [ 确定 ][root@linux-node1 haproxy]# netstat -lntp | grep 80tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 27849/haproxy tcp6 0 0 :::8080 :::* LISTEN 20130/httpd [root@linux-node1 haproxy]# |
页面测试,目前也是轮询的

多访问几次,健康页面有新的数据变化

sessions这里可以看到有没有失败的访问

结合haproxy的acl配置反向代理功能,先备份原先配置文件
设置acl
这样能支持多个域名,让不同的域名,访问不同的backend上面去
|
1
2
|
[root@linux-node1 conf]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.ori[root@linux-node1 conf]# vim /etc/haproxy/haproxy.cfg |
修改配置文件为如下
注意,配置文件中,前端和后端不要用特殊符号以及点。它对这些敏感。推荐使用下划线
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
[root@linux-node1 conf]# vim /etc/haproxy/haproxy.cfg [root@linux-node1 conf]# cat /etc/haproxy/haproxy.cfg global chroot /var/lib/haproxy daemon group haproxy user haproxy log 127.0.0.1:514 local3 info stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin stats timeout 2mdefaults log global mode http option httplog option dontlognull timeout client 50000 timeout server 50000 timeout connect 5000frontend www_nmap_com mode http bind *:80 stats uri /haproxy?stats default_backend www_nmap_com_backend acl is_other_nmap_com hdr_end(host) other.nmap-blog.com use_backend other_nmap_com_backend if is_other_nmap_combackend www_nmap_com_backend option forwardfor header X-REAL-IP option httpchk GET /index.html balance roundrobin server linux-node1 10.0.1.105:8080 check inter 2000 rise 3 fall 3 weight 1backend other_nmap_com_backend option forwardfor header X-REAL-IP option httpchk GET /index.html balance roundrobin server linux-node2 10.0.1.106:8080 check inter 2000 rise 3 fall 3 weight 1[root@linux-node1 conf]# |
重启haproxy
|
1
2
|
[root@linux-node1 conf]# /etc/init.d/haproxy restartRestarting haproxy (via systemctl): [ 确定 ] |
windows客户端配置host文件
|
1
|
10.0.1.105 www.nmap-blog.com other.nmap-blog.com |
这样也实现了haproxy的多域名反向代理


haproxy的acl,也可以根据正则,和后缀设置,下面2种方法。推荐第一种,正则方式匹配
|
1
2
|
acl is_static_reg url_reg /*.(css|jpg|png|js|jpeg|gif)$acl is_static_path path_end .gif .png .js |
修改配置文件做基于正则的acl
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
[root@linux-node1 conf]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.2[root@linux-node1 conf]# vim /etc/haproxy/haproxy.cfg[root@linux-node1 conf]# cat /etc/haproxy/haproxy.cfgglobal chroot /var/lib/haproxy daemon group haproxy user haproxy log 127.0.0.1:514 local3 info stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin stats timeout 2mdefaults log global mode http option httplog option dontlognull timeout client 50000 timeout server 50000 timeout connect 5000frontend www_nmap_com mode http bind *:80 stats uri /haproxy?stats default_backend www_nmap_com_backend acl is_static_reg url_reg /*.(css|jpg|png|js|jpeg|gif)$ use_backend other_nmap_com_backend if is_static_reg #acl is_static_path path_end .gif .png .js #acl is_other_nmap_com hdr_end(host) other.nmap-blog.com #use_backend other_nmap_com_backend if is_other_nmap_combackend www_nmap_com_backend option forwardfor header X-REAL-IP option httpchk GET /index.html balance roundrobin server linux-node1 10.0.1.105:8080 check inter 2000 rise 3 fall 3 weight 1backend other_nmap_com_backend option forwardfor header X-REAL-IP option httpchk GET /index.html balance roundrobin server linux-node2 10.0.1.106:8080 check inter 2000 rise 3 fall 3 weight 1[root@linux-node1 conf]# |
重启服务
|
1
2
3
4
5
6
|
[root@linux-node1 conf]# /etc/init.d/haproxy restartRestarting haproxy (via systemctl): [ 确定 ][root@linux-node1 conf]# lsof -i:80COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEhaproxy 48521 haproxy 5u IPv4 1371377 0t0 TCP *:http (LISTEN)[root@linux-node1 conf]# |
因为匹配后会连接到node2,这里就在node2上设置一个js文件,node1不做任何设置。
|
1
2
|
[root@linux-node2 ~]# echo 'test111' >/var/www/html/test.js[root@linux-node2 ~]# |
测试成功

关于后端web节点记录检查日志的问题,因为我设置检查check inter 2000 ,也就是2秒发一次检查包。后端节点日志这里也能看到
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@linux-node2 ~]# tail -f /var/log/httpd/access_log 10.0.1.105 - - [04/Mar/2017:00:35:46 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:35:48 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:35:50 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:35:52 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:35:54 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:35:56 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:35:58 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:36:00 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:36:02 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:36:04 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:36:06 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-"10.0.1.105 - - [04/Mar/2017:00:36:08 +0800] "GET /index.html HTTP/1.0" 200 24 "-" "-" |
关于怎么让后端apache不记录健康检查日志,以及如何记录真正的客户端IP,这里不做实验。
学习Haproxy (七)的更多相关文章
- C语言学习 第七次作业总结
C语言学习 第七次作业总结 数组可以分为数组和多下标数组(在传统的国内C语言书本中,将其称为二/多维数组). 数组名称 在之前的课程中,大家应该都有印象,对于int a这样的定义,会为变量 a 声明一 ...
- 前端学习 第七弹: Javascript实现图片的延迟加载
前端学习 第七弹: Javascript实现图片的延迟加载 为了实现图片进入视野范围才开始加载首先: <img src="" x-src="/acsascas ...
- MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- 【转】MyBatis学习总结(七)——Mybatis缓存
[转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍
目录 python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍 一丶元祖 1.元祖简介 2.元祖变量的定义 3.元祖变量的常用操作. 4.元祖的遍历 5.元祖的应用场景 p ...
- Python学习第七课
Python学习第七课 'Alex' "Alex"print('hello'*5) #重复输出字符串 print('hellowold'[2:]) #类似于切片操作:会取出 llo ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
随机推荐
- Smartbi代替Alteryx+Tableau,用1份投入如何获得2份回报?
Smartbi是国内一家知名的BI厂商,Alteryx.Tableau是国外两款重要的BI工具,它们都是在BI领域内提供特定的功能,以满足企业的数据分析需求.那么,对于用户来说,在选择BI工具的时候要 ...
- 【C# 线程】优先级反转与优先级继承
什么是优先级反转(翻转)优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即: 高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度.但其他中等优先级的任务却能抢到CP ...
- PostgreSQL-PL/pgSQL控制结构
PL/pgSQL的控制结构是最重要及最有用的一部分了,在实际工作场景都离不开业务处理逻辑,在写PL/pgSQL时,利用控制结构来操作数据.PL/pgSQL支持的控制结构与其他语言几乎差不多,比如:条件 ...
- Jenkins——为什么使用持续集成?
一.开发模型 1.瀑布开发模型:过程线性不可逆的开发模型 优势: 1)简单易懂 2)当前阶段完成后只需要关注后续阶段 3)为项目提供了按阶段划分的检查节点 劣势: 1)各个阶段的划分完全固定,阶段之间 ...
- LeetCode-071-简化路径
简化路径 题目描述:给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径. 在 Unix 风格的文件系统中,一个点(. ...
- Jmeter计数器实现自增功能
如果需要引用的数据量较大,且要求不能重复或者需要自增,那么可以使用计数器来实现 如:新增功能,要求名称不能重复 1,新增计数器 计数器:允许用户创建一个在线程组之内都可以被引用的计数器. 计数器允许用 ...
- linux基础篇--复习重点成长之路
linux阶段性复习提纲 1.xshell与shell之间的区别 shell shell是一个由C语言编写的程序,它的主要作用就是在用户和操作系统之间搭起一道桥梁(人机操作界面).直接在命令行执行 ...
- SQL从零到迅速精通【表连接查询】
看了这些表连接,个人感觉'左外连接'.'右外连接'和'全外连接'应用好就可以了. 1.外连接 (1)LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录. 在student ...
- 华为交换机配置telnet、SSH
如果网络中有一台或多台网络设备需要远程进行配置和管理,可以通过Telnet远程连接到每一台设备上,对这些网络设备进行集中的管理一维护. 一.AAA认证Telnet服务端 1.配置接口信息 <Hu ...
- 35个高级python知识点
No.1 一切皆对象 众所周知,Java中强调"一切皆对象",但是Python中的面向对象比Java更加彻底,因为Python中的类(class)也是对象,函数(function) ...