Haproxy 概述
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,由C语言编写而成,支持会话保持、七层处理、健康检查、故障修复后自动加载、动静分离。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接;
Haproxy软件引入了frontend,backend的功能,frontend(acl规则匹配)可以运维管理人员根据任意HTTP请求头做规则匹配,然后把请求定向到相关的backend(server pools等待前端把请求转过来的服务器组)。
Haproxy 特性
支持 Session 的保持,Cookie 的引导;
基于TCP 协议的负载效率高于nginx;
负载均衡策略丰富;
动静分离:支持acl规则匹配;
节点健康检查:支持多种方式检测,如端口,URL;
缺点:扩展性差;在四层代理时,仅支持tcp协议
Harproxy 调度算法
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请求。
Haproxy配置文件讲解
Haproxy由两打部分组成,分别是
global
和proxies
部分
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段,有多个字段
defaults 为frontend,backend,listen提供默认配置
listen 同时拥有前端和后端配置
frontend 前端,相当于nginx中的server {}
backend 后端,相当于nginx中的upstream {}
global配置参数:
global
#锁定运行目录
chroot /usr/local/haproxy
#定义全局的syslog服务器;最多可以定义两个
log 127.0.0.1 local3 info
#指定pid文件路径
pidfile /var/run/haproxy.pid
#以守护进程运行
deamon
#每个haproxy进程的最大并发连接数
maxconn 4000
#运行haproxy的用户身份
user haproxy
group haproxy
#或者
uid 99
gid 99
/********************可选项********************/
#开启的haproxy进程数,与CPU保持一致
nbproc 4
#CPU绑定
cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3
#指定每个haproxy进程开启的线程数,默认为每个进程一个线程
nbthread 1
#socket文件1,mode文件的权限,level等级,process多进程时使用,绑定socket文件
stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1
#socket文件2
stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2
#每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
maxsslconn
#每个进程每秒创建的最大连接数量
maxconnrate 200
#后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间
spread-checks 3
defaults配置:
defaults
#默认工作类型,可选tcp/http/health
mode http
#定义日志,global表示根据全局定义
log global
#开启与客户端的会话保持
option http-keep-alive
#透传客户端真实IP至后端web服务器
option forwardfor
#当server Id对应的服务器挂掉后,强制定向到其他健康的服务器
option redispatch
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option abortonclose
#客户端请求到后端server的最长连接等待时间(TCP之前)
timeout connect 120s
#客户端请求到后端服务端的超时超时时长(TCP之后)
timeout server 600s
#与客户端的最长非活动时间
timeout client 600s
#session 会话保持超时时间,范围内会转发到相同的后端服务器
timeout http-keep-alive 120s
#对后端服务器的检测超时时间
timeout check 5s
Haproxy 实现动静分离
案例架构图
案例环境
系统环境 | IP地址 | 主机名 | 所需软件 |
---|---|---|---|
CentOS 7.6 1810 | 10.4.7.100 | haproxy | haproxy-2.1.0.tar.gz |
CentOS 7.6 1810 | 10.4.7.111 | nginx01 | nginx-1.16.1.tar.gz |
CentOS 7.6 1810 | 10.4.7.112 | nginx02 | nginx-1.16.1.tar.gz |
CentOS 7.6 1810 | 10.4.7.121 | tomcat01 | apache-tomcat-9.0.31.tar.gz jdk-8u60-linux-x64.tar.gz |
CentOS 7.6 1810 | 10.4.7.122 | tomcat02 | apache-tomcat-9.0.31.tar.gz jdk-8u60-linux-x64.tar.gz |
搭建并配置nginx 节点
#安装nginx依赖
[root@nginx01 ~]# yum install -y pcre-devel zlib-devel
#创建nginx用户
[root@nginx01 ~]# useradd -s /sbin/nologin nginx -M
#下载nginx源码包
[root@nginx01 ~]# wget http://nginx.org/download/nginx-1.16.1.tar.gz
#解压nginx安装包
[root@nginx01 ~]# mkdir -p /application
[root@nginx01 ~]# tar xf nginx-1.16.1.tar.gz
[root@nginx01 ~]# cd nginx-1.16.1/
#编译
[root@nginx01 nginx-1.16.1]# ./configure --prefix=/application/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@nginx01 nginx-1.16.1]# make && make install
#创建软连接
[root@nginx01 nginx-1.16.1]# ln -s /application/nginx/sbin/nginx /usr/local/sbin/
#编写system启动脚本
[root@nginx01 nginx]# vi /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginxapi
After=network.target
[Service]
Type=forking
PIDFile=/application/nginx/logs/nginx.pid
ExecStart=/application/nginx/sbin/nginx
ExecReload=kill -s HUP $(cat /application/nginx/logs/nginx.pid)
ExecStop=kill -s QUIT $(cat /application/nginx/logs/nginx.pid)
PrivateTmp=Flase
[Install]
WantedBy=multi-user.target
#启动nginx
[root@nginx01 nginx]# systemctl enable nginx
[root@nginx01 nginx]# systemctl start nginx
[root@nginx01 nginx]# netstat -lntup|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15452/nginx: master
#编写首页文件(此处两台主机不同)
[root@nginx01 html]# echo "10.4.7.111" >/application/nginx/html/index.html //nginx01主机
[root@nginx02 application]# echo "10.4.7.112" > /application/nginx/html/index.html
#测试nginx
[root@nginx02 ~]# curl 10.4.7.111
10.4.7.111
[root@nginx02 ~]# curl 10.4.7.112
10.4.7.112
搭建并配置tomcat节点
#上传软件包
[root@tomcat01 ~]# ls
apache-tomcat-9.0.31.tar.gz jdk-8u60-linux-x64.tar.gz
#安装java环境
[root@tomcat01 ~]# tar xf jdk-8u60-linux-x64.tar.gz
[root@tomcat01 ~]# mv jdk1.8.0_60/ /usr/local/java
[root@tomcat01 ~]# cat <>/etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:/usr/local/java/bin
EFO
[root@tomcat01 ~]# source /etc/profile
[root@tomcat01 ~]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
#解压tomcat软件包
[root@tomcat01 ~]# mkdir -p /application
[root@tomcat01 ~]# tar xf apache-tomcat-9.0.31.tar.gz -C /application/
[root@tomcat01 ~]# ln -s /application/apache-tomcat-9.0.31/ /application/tomcat
#tomcat主配置文件添加(HOST段中)
[root@tomcat01 tomcat]# vim /application/tomcat/conf/server.xml
154
#创建tomcat首页文件//两台tomcat主将,IP地址不同
[root@tomcat01 tomcat]# mkdir -p /web/webapp
[root@tomcat01 tomcat]# vim /web/webapp/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
JSP TEST PAGE1
<% out.println("Welcome to test site;http://10.4.7.121");%>
#启动tomcat
[root@tomcat01 tomcat]# /application/tomcat/bin/startup.sh
[root@tomcat01 tomcat]# netstat -lntup|grep 8080
tcp6 0 0 :::8080 :::* LISTEN 8598/java
访问测试
部署Haproxy
#解压haproxy
[root@haproxy ~]# mkdir /application/
[root@haproxy ~]# tar xf haproxy-2.1.0.tar.gz
#查看内核版本
[root@haproxy haproxy]# uname -r
3.10.0-957.el7.x86_64
#编译安装
[root@haproxy ~]# cdhaproxy-2.1.0
[root@haproxy haproxy-2.1.0]# make TARGET=linux310 //需指定内核版本
[root@haproxy haproxy-2.1.0]# make install PREFIX=/application/haproxy
编写haproxy配置文件
[root@haproxy ~]# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0 info ##日志级别
log 127.0.0.1 local1 notice
maxconn 4096 ##最大连接数
pidfile /var/run/haproxy.pid ##PID文件
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中的值
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
##################有分离页面需求的配置##############
frontend http ##定义名称为http
bind *:80 ##指定监听地址和端口
acl linux01 hdr_end(host) -i 10.4.7.100
acl linux02 hdr_end(host) -i www.onelpc.com
acl linux03 path_end -i .jsp .do .css .js
#acl linuxfan3 hdr_reg -i \.(css|png|jpg|jpeg|gif|ico|swf|xml|txt|pdf|do|jsp|js)$ ##调用正则表达式
acl linux04 path_end -i .html .css .png .jpg .jpeg .xml
acl linux05 path_beg -i /WebRoot
use_backend dongtai if linux01 linux03
use_backend dongtai if linux02 linux03
use_backend dongtai if linux01 linux05 linux03
use_backend dongtai if linux05 linux03
default_backend jingtai
backend jingtai
mode http
balance roundrobin
server jingtai01 10.4.7.111:80 check inter 2000 fall 3
server jingtai02 10.4.7.112:80 check inter 2000 fall 3
backend dongtai
mode http
balance roundrobin
server dongtai01 10.4.7.121:8080 check inter 2000 fall 3
server dongtai02 10.4.7.122:8080 check inter 2000 fall 3
启动Haproxy服务
[root@haproxy ~]# ln -s /application/haproxy/sbin/haproxy /usr/sbin/
[root@haproxy ~]# cp ~/haproxy-2.1.0/examples/haproxy.init /etc/init.d/haproxy
[root@haproxy ~]# netstat -lntup|grep haproxy
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14292/haproxy
udp 0 0 0.0.0.0:35046 0.0.0.0:* 14292/haproxy
Haproxy访问测试
配置Haproxy 日志文件分离
修改syslog.conf
[root@haproxy ~]# vim /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主配置文件中所指定的日志设备和日志级别将其输出到不同的文件中,以方便查
修改rsyslog
[root@haproxy ~]# vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-r -m 0 -c 2"
## -r 接收udp 514号端口的系统日志消息
## -m 0 为日志消息添加时间等的标记
## -c 2表示使用兼容模式
重启服务
[root@haproxy ~]# systemctl restart rsyslog.service
[root@haproxy ~]# /etc/init.d/haproxy restart
访问后查看日志
[root@haproxy ~]# tail -f /var/log/haproxy/ha-info.log
Feb 22 14:41:22 localhost haproxy[8883]: 10.4.7.1:13044 [22/Feb/2020:14:41:22.956] http jingtai/jingtai01 0/0/0/0/1 200 215 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
配置Haproxy服务的日志管理界面
修改Haproxy配置文件
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
## 添加以下内容
listen status
bind *:8080 //监听的ip端口号
stats enable
stats uri /stats //访问的url
stats auth admin:admin //认证用户名和密码
stats realm Haproxy
stats hide-version //隐藏HAProxy的版本号
stats admin if TRUE //管理界面,如果认证成功了,可通过webui管理节点
重启服务
[root@haproxy ~]# /etc/init.d/haproxy restart
Restarting haproxy (via systemctl): [ OK ]
访问测试
http//IP:8080/stats
用户名admin,密码admin