在上篇安装的nginx的机器环境上将nginx停掉

/usr/local/nginx/sbin/nginx -s stop
在linux-node2上编译安装haproxy作为反向代理服务器
[root@linux-node1 ~]# cd /usr/local/src
[root@linux-node1 src]# wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.2.tar.gz
[root@linux-node1 src]# tar zxf haproxy-1.6.2.tar.gz
[root@linux-node1 src]# cd haproxy-1.6.2
[root@linux-node1 src]# make TARGET=linux2628 PREFIX=/usr/local/haproxy-1.6.2
[root@linux-node1 src]# make install
[root@linux-node1 ~]# cp /usr/local/sbin/haproxy /usr/sbin/
[root@linux-node1 ~]# haproxy -v
HA-Proxy version 1.6.2 2015/12/25
Copyright 2000-2015 Willy Tarreau <willy@haproxy.org>

编辑Haproxy启动脚本

cd /usr/local/src/haproxy-1.6.2/

cp examples/haproxy.init /etc/init.d/haproxy

chmod 755 /etc/init.d/haproxy

针对配置文件的路径创建以下文件

useradd -r haproxy

mkdir /etc/haproxy

mkdir /var/lib/haproxy

mkdir /var/run/haproxy

编辑haproxy配置文件,配置log,并启动

cd /etc/haproxy/
cat haproxy.cfg
global #全局配置,在所有配置段中都生效
log 127.0.0.1 local3 info #记录日志,,info是日志级别
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
defaults #默认配置,可以被前端和后端继承
log global #使用global的log设置
mode http #使用http模式,也可以使用tcp模式
option httplog #启动http请求的log
option dontlognull #在日志中不记录空连接(空连接:健康检查的链接)
timeout connect 5000 #长连接超时时间
timeout client 50000 #客户端连接超时
timeout server 50000 #RS连接超时
frontend www_check-blog_com #前端配置 + 一个配置段的名字(最好不要乱写,和项目直接相关最佳)
mode http #使用http模式,也可以使用tcp模式
bind *:80 #监听80端口
stats uri /haproxy?stats #状态页面dashboard
default_backend www_check-blog_com_backend #对应的backend名称
backend www_check-blog_com_backend #对应的frontend的default_backend
#source cookie SERVERID #算法,source相当于ip hash
option httpchk GET /index.html #检测url
balance roundrobin #使用rr负载均衡方式
server linux-node1 192.168.230.129:8080 check inter 2000 rise 3 fall 3 weight 5
server linux-node2 192.168.230.128:8080 check inter 2000 rise 3 fall 3 weight 1 #RS健康检测时间间隔2秒,重试三次,失败三次不可用,权重1
[root@linux-node2 haproxy]# vim /etc/rsyslog.conf
• 15 $ModLoad imudp #打开注释
• 16 $UDPServerRun 514 #打开注释
• 74 local3.* /var/log/haproxy.log #local3的路径
[root@linux-node2 haproxy]# /etc/init.d/rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
[root@linux-node2 haproxy]# /etc/init.d/haproxy start
Starting haproxy: [ OK ]

浏览器访问

更改配置文件的检查url,对url检查页面进行测试

[root@linux-node2 haproxy]#  sed -i 's/index\.html/chuck-blog.html/g' haproxy.cfg
[root@linux-node2 haproxy]# /etc/init.d/haproxy restart
Shutting down haproxy: [ OK ]
Starting haproxy: [ OK ]

下面是检测url和uri的几种方式

option httpchk
option httpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version>

将页面改回来

[root@linux-node2 haproxy]#  sed -i 's/chuck-blog.html/index\.html/g' haproxy.cfg
[root@linux-node2 haproxy]# /etc/init.d/haproxy restart
Shutting down haproxy: [ OK ]
Starting haproxy: [ OK ]

更改配置文件获取客户端的真实ip

在banckend配置段加入一个option

option forwardfor header X-REAL-IP #X-REAL-IP是自定义的一个名称

通过acl设置虚拟主机

一个前端可以对应多个后端,而实际生产环境建议一个frontend对应一个backend,并重载(生产不建议restart,restart会断开现有链接)

global
log 127.0.0.1 local3 info
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend check.blog.com
mode http
bind *:80
stats uri /haproxy?stats
default_backend check-blog #默认的backend
acl web-blog hdr_end(host) -i other.heck-blog.com #web-blog:给此acl起一个名字;hdr_end(host):固定格式,用来识别host,-i是不区分大小写、后面跟的是域名,如果没有匹配到acl,即访问default的bankcend,
use_backend web-blog-1 if web-blog #use_backend:关键词,使用哪个banckend;web-blog-1:指定哪个backend的名称 if web-blog:用来判断acl,if 后面的名称是acl名称
#如果acl中有这个is_other_check-blog_com名称,那就使用这个other_check-blog_com_backend
backend check-blog
#source cookie SERVERID
option forwardfor header X-REAL-IP
option httpchk GET /index.html
balance roundrobin
server linux-node1 192.168.230.128:8080 check inter 2000 rise 3 fall 3 weight 1
backend web-blog-1#source cookie SERVERID
option forwardfor header X-REAL-IP
option httpchk GET /index.html
balance roundrobin
server linux-node2 192.168.230.129:8080 check inter 2000 rise 3 fall 3 weight 1
[root@linux-node1 haproxy]# /etc/init.d/haproxy restart
Shutting down haproxy: [ OK ]
Starting haproxy: [ OK ]

本地hosts解析

192.168.230.128 www.check-blog.com  other.check-blog.com

在fortend添加acl,根据静态文件,设置不同的backend(类似于location),注释的两行和前两行意义相同,分别是通过url正则匹配和url的后缀匹配

acl is_static_reg url_reg /*.(css|jpg|png|js|jpeg|gif)$
use_backend other_chuck-blog_com_backend if is_static_reg

第二种

#acl is_static_path path_end .gif .png .css .jpg .jpeg
#use_backend other_chuck-blog_com_backend if is_static_path

其他形式的acl,正则或者UA(可以理解为nginx的location),更多形式的acl,请浏览文档

https://www.haproxy.org/download/1.6/doc/configuration.txt

  acl is_do_path url_reg /chuck.do
use_backend other_chuck-blog_com_backend if is_do_path
acl is_UA_path hdr_reg(User-Agent) -i andriod
use_backend other_chuck-blog_com_backend if is_UA_path

haproxy的动态维护

在配置文件添加socket

[root@linux-node1 ~]# head -8 /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local3 info
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #指定socket文件路径,权限,管理级别
stats timeout 2m #指定超时时间
安装socat
[root@linux-node1 ~]yum install -y socat
使用help查看socat的事情
[root@linux-node1 ~]# echo "help" |socat stdio /var/lib/haproxy/haproxy.sock
Unknown command. Please enter one of the following commands only :
clear counters : clear max statistics counters (add 'all' for all counters)
clear table : remove an entry from a table
help : this message
prompt : toggle interactive mode with prompt
quit : disconnect
show backend : list backends in the current running config
show info : report information about the running process #查看所有信息
show pools : report information about the memory pools usage #查看所有poll
show stat : report counters for each proxy and server #显示状态
show errors : report last request and response errors for each proxy
show sess [id] : report the list of current sessions or dump this session
show table [id]: report table usage stats or dump this table's contents
show servers state [id]: dump volatile server information (for backend <id>)
get weight : report a server's current weight #获得权重信息
set weight : change a server's weight #设置权重
set server : change a server's state, weight or address #改变一个server的转态权重或地址
set table [id] : update or create a table entry's data
set timeout : change a timeout setting
set maxconn : change a maxconn sett
ing
set rate-limit : change a rate limiting value
disable : put a server or frontend in maintenance mode #将一个server或者fortend置于维护模式
enable : re-enable a server or frontend which is in maintenance mode #启用一个维护状态的server或者frontend
shutdown : kill a session or a frontend (eg:to release listening ports)
show acl [id] : report avalaible acls or dump an acl's contents
get acl : reports the patterns matching a sample for an ACL #获取acl
add acl : add acl entry #加一个acl
del acl : delete acl entry #删一个acl
clear acl <id> : clear the content of this acl
show map [id] : report avalaible maps or dump a map's contents
get map : reports the keys and values matching a sample for a map
set map : modify map entry
add map : add map entry
del map : delete map entry
clear map <id> : clear the content of this map
set ssl <stmt> : set statement for ssl
查看info信息,内容值可以利用来监控
[root@linux-node1 haproxy]# echo "show info" |socat stdio /var/lib/haproxy/haproxy.sock
Name: HAProxy
Version: 1.6.2
Release_date: 2015/11/03
Nbproc: 1
Process_num: 1
Pid: 14841
Uptime: 0d 0h03m44s
Uptime_sec: 224
Memmax_MB: 0
Ulimit-n: 4033
Maxsock: 4033
Maxconn: 2000
Hard_maxconn: 2000
CurrConns: 0
CumConns: 2
CumReq: 2
Maxpipes: 0
PipesUsed: 0
PipesFree: 0
ConnRate: 0
ConnRateLimit: 0
MaxConnRate: 0
SessRate: 0
SessRateLimit: 0
MaxSessRate: 0
CompressBpsIn: 0
CompressBpsOut: 0
CompressBpsRateLim: 0
Tasks: 8
Run_queue: 1
Idle_pct: 100
node: linux-node1.example.com
description:

关闭linux-node2主机

echo "disable server other_check-blog_com_backend/linux-node2" |socat stdio /var/lib/haproxy/haproxy.sock

可以看到linux-node2进入了维护(maintain)状态

打开linux-node2主机(只对现有的server生效,不能用来新增节点)

echo "enable server other_check-blog_com_backend/linux-node2" |socat stdio /var/lib/haproxy/haproxy.sock

可以看到linux-node2恢复正常

生产环境遇到的问题

haproxy的本地端口可能用尽,解决方案如下4条
1)更改local的端口范围,调整内核参数

[root@linux-node1 ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000

2)调整timewait的端口复用,设置为1

[root@linux-node1 ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse
0

3)缩短tcp_wait的时间,并不建议修改

[root@linux-node1 ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
60

4)终极方案:增加为多个ip,自然端口数就够了

haproxy对比nginx

nginx

优点
1.web服务器,应用比较广泛
2.7层负载均衡,location设置复杂的基于HTTP的负载均衡
3.性能强大,网络依赖小
4.安装配置简单

缺点
1.健康检查单一
2.负载均衡算法少
3.不能动态管理
4.没有集群upstream的状态页面
haproxy

优点
1.专门做负载均衡
2.负载均衡算法多
3.性能>=nginx
4.通过和socket通信进行动态管理
5.有比较丰富的dashboard页面
6.强大的7层代理

缺点
1.配置没有nginx简单
2.应用没有nginx广泛

反向代理负载均衡之haproxy的更多相关文章

  1. centos7使用haproxy1.7.5实现反向代理负载均衡实战

    使用haproxy实现反向代理负载均衡实战环境准备:两台虚拟机 # yum install -y gcc glibc gcc-c++ make screen tree lrzsz node1源码编译安 ...

  2. 反向代理负载均衡之nginx

    一.集群 1.1 什么是集群 集群是一组相互独立的.通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理.一个客户与集群相互作用时,集群像是一个独立的服务器.集群配置是用于提高可用性 ...

  3. 如何使用Weave以及Docker搭建Nginx反向代理/负载均衡服务器

    Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动 ...

  4. 项目实战2.2—nginx 反向代理负载均衡、动静分离和缓存的实现

    实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备注 nginx VIP:172.17.11.11 反向代理服务器 开启代理功能 设置监控,调度 rs01 RIP ...

  5. Nginx 反向代理 负载均衡 虚拟主机配置

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  6. nginx 详解反向代理负载均衡

    什么是反向代理负载均衡 使用代理服务器可以将请求转发给内部的Web服务器,使用这种加速模式显然可以提升静态网页的访问速度.因此也可以考虑使用这种技术,让代理服务器将请求 均匀转发给多台内部Web服务器 ...

  7. Nginx 反向代理 负载均衡 虚拟主机

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  8. 十.nginx反向代理负载均衡服务实践部署

    期中集群架构-第十章-nginx反向代理负载均衡章节章节====================================================================== 0 ...

  9. 项目实战2.1—nginx 反向代理负载均衡、动静分离和缓存的实现

    总项目流程图,详见 http://www.cnblogs.com/along21/p/8000812.html 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备 ...

随机推荐

  1. Python3安装Crypto加密包

    Python3安装Crypto加密包 下载链接 加密包地址 步骤 下载加密包,解压加密包到Python安装目录下Lib\site-packages目录中,尝试在Pycharm中导入 from Cryp ...

  2. B 蒜头君的树

    时间限制 : - MS   空间限制 : - KB  评测说明 : 2s,256m 问题描述 蒜头君有一棵有根树,树的每一边都有边权,蒜头君想知道任意两点间最短距离之和为多少. 另外,由于各种原因,蒜 ...

  3. 2019NYIST计科第七次周赛总结

    2019NYIST计科第七次周赛总结 文章目录 2019NYIST计科第七次周赛总结 [秤取物体重量( 二进制枚举法)](https://blog.csdn.net/qq_34261446/artic ...

  4. Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 中级篇

    本着每天记录一点成长一点的原则,打算将目前完成的一个WPF项目相关的技术分享出来,供团队学习与总结. 总共分三个部分: 基础篇主要争对C#初学者,巩固C#常用知识点: 中级篇主要争对WPF布局与Mat ...

  5. Zookeeper是如何实现分布式锁的

    [toc] Zookeeper是如何实现分布式锁的 标签 : Zookeeper 分布式 实现分布式锁要考虑的重要问题 1. 三个核心要素 加锁, 解锁, 锁超时 2. 三个问题 要保证原子性操作, ...

  6. 原地算法(in-place algorithm)

    原地算法(in-place algorithm) 在计算机科学中,一个原地算法(in-place algorithm)基本上不需要额外辅助的数据结构,然而,允许少量额外的辅助变量来转换数据的算法.当算 ...

  7. 包格式及IP地址,网络层协议

    包格式及IP地址,网络层协议 案例1:配置静态路由 案例2:配置浮动路由 案例3:配置多路由的静态路由 案例4:配置默认路由 1 案例1:配置静态路由 1.1 问题 配置路由接口IP地址并通过静态路由 ...

  8. Vulnhub homeless靶机渗透

    信息搜集 nmap -sP 192.168.146.6 nmap -A -Pn 192.168.146.151 直接访问web服务. 大概浏览一下没发现什么,直接扫描下目录把dirb+bp. BP具体 ...

  9. 如果你的 pip 命令不能用,你可以这样解决

    文章更新于:2020-04-05 注:如果想了解 pip 参数的使用参见:pip 命令参数以及如何配置国内镜像源 如何解决 pip 不能用的问题 一.你可能会遇到的问题 1.检查你敲命令的位置 2.如 ...

  10. 10.6 IoStudentManager

    package day11_io_student.student_demo; public class Student { private String id; private String name ...