使用 Haproxy + Nginx 实现高可用配置
一、基本介绍
Haproxy 是目前比较流行的一种集群调度工具,同类集群调度器工具有很多,如 LVS 和 Nginx。相比较而言,LVS 性能最好,但是搭建相对复杂;Nginx 的 upstream
模块虽然支持集群功能,但是对集群节点健康检查功能不强,性能没有 Haproxy 好。
Haproxy 可以提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,并且支持虚拟主机配置。官方介绍
常见调度模式:
调度模式 | 作用 |
---|---|
Round Robin(轮询) | 根据轮询分配访问请求,来实现负载均衡的效果(可以配置权重,以此增加调度概率) |
Least Connections(最小连接数) | 根据后端节点的连接数大小,来动态的分配前端请求(将请求优先分配到连接数小的节点上) |
Source Hashing(基于来源访问调度) | 用于一些有 Session 会话记录在服务器端的场景,可以基于来源 IP、Cookie 等进行集群调度。 |
二、使用 Haproxy + Nginx 实现高可用配置
准备工作:
主机名 | 操作系统 | IP地址 | 软件包 |
---|---|---|---|
Nginx-1 | CentOS7.4 | 192.168.1.1 | nginx-1.21.0.tar.gz |
Nginx-2 | CentOS7.4 | 192.168.1.2 | nginx-1.21.0.tar.gz |
Haproxy | CentOS7.4 | 192.168.1.3 | haproxy-2.6.0.tar.gz |
1.安装 Nginx
1)安装并启动 Nginx 服务
[root@Nginx-1 ~]# yum -y install pcre-devel zlib-devel popt-devel openssl-devel openssl
[root@Nginx-1 ~]# wget http://www.nginx.org/download/nginx-1.21.0.tar.gz
[root@Nginx-1 ~]# ls
anaconda-ks.cfg nginx-1.21.0.tar.gz
[root@Nginx-1 ~]# tar zxf nginx-1.21.0.tar.gz -C /usr/src/
[root@Nginx-1 ~]# cd /usr/src/nginx-1.21.0/
[root@Nginx-1 nginx-1.21.0]# useradd -M -s /sbin/nologin nginx
[root@Nginx-1 nginx-1.21.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_ssl_module \
--with-stream \
--with-pcre && make && make install
[root@Nginx-1 nginx-1.21.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@Nginx-1 nginx-1.21.0]# cd
[root@Nginx-1 ~]# nginx
[root@Nginx-1 ~]# netstat -anpt | grep 80
2)配置 Nginx 页面
[root@Nginx-1 ~]# echo "<h1>This is 192.168.1.1</h1>" > /usr/local/nginx/html/index.html
[root@Nginx-2 ~]# echo "<h1>This is 192.168.1.2</h1>" > /usr/local/nginx/html/index.html
2.安装 Haproxy
[root@Haproxy ~]# wget https://www.haproxy.org/download/2.6/src/haproxy-2.6.0.tar.gz
[root@Haproxy ~]# ls
anaconda-ks.cfg haproxy-2.6.0.tar.gz
[root@Haproxy ~]# tar xf haproxy-2.6.0.tar.gz -C /usr/src/
[root@Haproxy ~]# cd /usr/src/haproxy-2.6.0/
[root@Haproxy haproxy-2.6.0]# make \
TARGET=linux$(uname -r | awk -F. '{print $1$2}') ARCH=$(uname -r | awk -F. '{print $NF}')
[root@Haproxy haproxy-2.6.0]# make install PREFIX=/usr/local/haproxy
TARGET
和ARCH
:分别对应系统的内核版本和系统位数。
3.修改 Haproxy 配置文件
[root@Haproxy ~]# vim /usr/local/haproxy/haproxy.cfg
global
log 127.0.0.1 local0 info
log 127.0.0.1 local1 notice
maxconn 204800 # 最大连接数
chroot /usr/local/haproxy #
pidfile /usr/local/haproxy/haproxy.pid # 进程文件位置
uid 99 # 运行用户的 UID (对应的用户是 nobody)
gid 99 # 运行组的 GID
daemon # 后台启动
defaults
log global # 引用 global 定义的日志格式
mode http # 代理模式为 HTTP
option httplog # 采用 HTTP 日志格式记录日志
option httpclose # 请求完成后主动关闭 HTTP 通道
option dontlognull # 禁止记录空连接日志记录
option forwardfor # 将客户端真实IP发送至后端服务器
retries 3 # 最大失败次数
balance leastconn # 基于最小连接数进行调度
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
listen admin_status
bind 0.0.0.0:8001
mode http
stats uri /haproxy # Haproxy 监控界面的 URL
stats auth admin:123123
stats hide-version # 隐藏 Haproxy 监控界面的版本号
listen nginx_upstream
bind 0.0.0.0:8080
mode http
server nginx_1 192.168.1.1:80 check inter 10s fall 3
server nginx_2 192.168.1.2:80 check inter 10s fall 3
4.启动 Haproxy 服务
1)启动 Haproxy 服务
[root@Haproxy ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
[root@Haproxy ~]# ps aux | grep haproxy
2)修改 Rsyslog 配置文件
Haproxy 在默认情况下并不会记录日志,除了需要在 Haproxy 配置文件内指定日志的输出外,还需要修改系统日志的配置文件。
[root@Haproxy ~]# sed -i 's/ModLoad imudp/^#//' /etc/rsyslog.conf
[root@Haproxy ~]# sed -i 's/UDPServerRun 514/^#//' /etc/rsyslog.conf
[root@Haproxy ~]# echo "local0.info /usr/local/haproxy/logs/access.log" >> /etc/rsyslog.conf
[root@Haproxy ~]# echo "local0.notice /usr/local/haproxy/logs/error.log" >> /etc/rsyslog.conf
[root@Haproxy ~]# mkdir /usr/local/haproxy/logs
[root@Haproxy ~]# systemctl restart rsyslog
5.验证
1)验证 LB(负载均衡)
[root@Haproxy ~]# for i in $(seq 1 10);do curl 192.168.1.3:8080;done
2)验证 HA(高可用)
[root@Nginx-1 ~]# /usr/local/nginx/sbin/nginx -s stop
[root@Haproxy ~]# for i in $(seq 1 10);do curl 192.168.1.3:8080;done
3)查看日志
[root@Haproxy ~]# tail /usr/local/haproxy/logs/access.log
Jul 27 10:21:24 localhost haproxy[19810]: 192.168.1.1:34478 [27/Jul/2022:10:21:24.095] nginx_upstream nginx_upstream/nginx_2 0/0/0/0/0 200 228 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Jul 27 10:21:25 localhost haproxy[19810]: 192.168.1.1:34480 [27/Jul/2022:10:21:25.102] nginx_upstream nginx_upstream/nginx_2 0/0/0/0/0 200 228 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Jul 27 10:21:26 localhost haproxy[19810]: 192.168.1.1:34482 [27/Jul/2022:10:21:26.109] nginx_upstream nginx_upstream/nginx_2 0/0/0/0/0 200 228 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Jul 27 10:21:27 localhost haproxy[19810]: 192.168.1.1:34484 [27/Jul/2022:10:21:27.117] nginx_upstream nginx_upstream/nginx_2 0/0/0/0/0 200 228 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Jul 27 10:21:28 localhost haproxy[19810]: 192.168.1.1:34486 [27/Jul/2022:10:21:28.125] nginx_upstream nginx_upstream/nginx_2 0/0/0/0/0 200 228 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
4)查看 Haproxy 监控界面