使用 Haproxy + Nginx 实现高可用
一、基本介绍
二、使用 Haproxy + Nginx 实现高可用
1.安装 Nginx 服务
2.安装 Haproxy 服务
3.验证 Web 群集
4.Haproxy 日志管理
1)修改 Rsyslog 配置
2)查看日志信息
5.Haproxy 配置优化
一、基本介绍
Haproxy 是目前比较流行的一种集群调度工具,同类集群调度器工具有很多,如 LVS 和 Nginx。相比较而言,LVS 性能最好,但是搭建相对复杂;Nginx 的 upstream 模块虽然支持集群功能,但是对集群节点健康检查功能不强,性能没有 Haproxy 好。
LVS、Haproxy、Nginx 最常用的调度器算法有三种,如下:
- RR:最简单最常用的一种算法,即轮询调度。
- LC:最小连接数算法,根据后端的节点连接数大小动态分配前端请求。
- SH:基于来源访问调度算法,此算法用于一些 Session 会话记录在服务器端的场景,可以基于来源的 IP、Cookie 等做群集调度。
二、使用 Haproxy + Nginx 实现高可用
准备工作:
1.安装 Nginx 服务
[root@Nginx-1 ~]# yum -y install pcre-devel zlib-devel [root@Nginx-1 ~]# wget http://www.nginx.org/download/nginx-1.18.0.tar.gz [root@Nginx-1 ~]# tar zxf nginx-1.18.0.tar.gz -C /usr/src/ [root@Nginx-1 ~]# useradd -M -s /sbin/nologin nginx # 创建 Nginx 运行用户 [root@Nginx-1 ~]# cd /usr/src/nginx-1.18.0/ [root@Nginx-1 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
1)分别在两台 Nginx 上创建页面:
[root@Nginx-1 ~]# echo "<h1>this is web111</h1>" > /usr/local/nginx/html/index.html [root@Nginx-2 ~]# echo "<h1>this is web222</h1>" > /usr/local/nginx/html/index.html
2)启动 Nginx:
[root@Nginx-1 ~]# /usr/local/nginx/sbin/nginx [root@Nginx-1 ~]# netstat -anpt | grep nginx
2.安装 Haproxy 服务
[root@Haproxy ~]# yum -y install pcre-devel bzip2-devel [root@Haproxy ~]# https://www.haproxy.org/download/1.5/src/haproxy-1.5.19.tar.gz [root@Haproxy ~]# tar zxf haproxy-1.5.19.tar.gz -C /usr/src/ [root@Haproxy ~]# cd /usr/src/haproxy-1.5.19/ [root@Haproxy haproxy-1.5.19]# make TARGET=linux26 # 64位系统 [root@Haproxy haproxy-1.5.19]# make install # 安装
1)配置 Haproxy
[root@Haproxy haproxy-1.5.19]# mkdir /etc/haproxy # 创建配置文件目录 [root@Haproxy haproxy-1.5.19]# cp examples/haproxy.cfg /etc/haproxy/ # 将配置文件复制到刚才目录中 [root@Haproxy haproxy-1.5.19]# cd [root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg # this config needs haproxy-1.1.28 or haproxy-1.2.1 global log 127.0.0.1 local0 # 配置日志记录. local0 为日志设备. 默认存放到系统日志 log 127.0.0.1 local0 notice # notice 为日志级别. 通常为 24 个级别 #log loghost local0 info maxconn 4096 # 最大连接数 uid 99 # 用户ID gid 99 # 组ID daemon #debug #quiet defaults log global mode http # 模式为 HTTP option httplog # 采用 HTTP 日志格式记录日志 option dontlognull retries 3 # 检测节点服务器失败次数. 连续达到三次失败. 则认为节点不可用 redispatch # 当服务器负载很高时. 自动结束当前队列处理比较久的连接 maxconn 2000 # 最大连接数 contimeout 5000 # 连接超时时间 clitimeout 50000 # 客户端超时时间 srvtimeout 50000 # 服务器超时时间 listen webcluster 0.0.0.0:80 # 定义一个 Web 应用 option httpchk GET /index.html # 检测服务器的 index.html 文件 balance roundrobin # 负载调度器算法使用轮询算法 server inst1 192.168.1.2:80 check inter 2000 fall 3 # 指定群集服务池中服务器 IP server inst2 192.168.1.3:80 check inter 2000 fall 3 # 这两个是 Nginx 的 IP
2)创建自启动脚本
[root@Haproxy ~]# cp /usr/src/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy [root@Haproxy ~]# chmod +x /etc/init.d/haproxy # 添加可执行权限 [root@Haproxy ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy # 软链接. 优化执行路径 [root@Haproxy ~]# /etc/init.d/haproxy restart # 重启 Haproxy
3.验证 Web 群集
1)验证负载均衡(使用浏览器访问:http://192.168.1.10)
再次访问:
2)验证高可用(在任意一台 Nginx 服务器上关闭网站服务)
[root@Nginx-1 ~]# killall -s QUIT nginx [root@Nginx-1 ~]# netstat -anpt | grep 80
在客户机上使用浏览器访问测试:
- 刷新发现还是这个页面,并不会切换,原因是刚才关闭了一台 Nginx 服务器。
当测试成功后再打开 Nginx 即可
[root@Nginx-1 ~]# /usr/local/nginx/sbin/nginx
4.Haproxy 日志管理
- Haproxy 的日志默认是输出到系统的 syslog 中,查看起来不是很方便,为了方便管理 haproxy 的日志,在生产环境中单独定义。
修改 Haproxy 配置文件中关于日志配置的选项,将原有的日志配置更改为以下配置:
[root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg global log /dev/log local0 info log /dev/log local1 notice [root@Haproxy ~]# /etc/init.d/haproxy restart # 重启 Haproxy
1)修改 Rsyslog 配置
[root@Haproxy ~]# vim /etc/rsyslog.d/haproxy.conf 添加: # 将 Haproxy 的 info 日志输出到 /var/log/haproxy/haproxy-info.log 文件中 if ($programname == 'haproxy' and $syslogseverity-text == 'info') then -/var/log/haproxy/haproxy-info.log & ~ # 将 Haproxy 的 notice 日志输出到 /var/log/haproxy/haproxy-notice.log 文件中 if ($programname == 'haproxy' and $syslogseverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log & ~ [root@Haproxy ~]# systemctl restart rsyslog # 重启 Rsyslog 服务
- 如果报错如下,那可能是因为刚刚的配置文件有错误。
2)查看日志信息
在客户机使用浏览器访问:http://192.168.1.10
5.Haproxy 配置优化









