使用 Haproxy + Nginx 实现高可用配置

  • 一、基本介绍
  • 二、使用 Haproxy + Nginx 实现高可用配置
  • 1.安装 Nginx
  • 2.安装 Haproxy
  • 3.修改 Haproxy 配置文件
  • 4.启动 Haproxy 服务
  • 5.验证


一、基本介绍

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

nginx HAProxy性能 nginx和haproxy_高可用

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
  • TARGETARCH:分别对应系统的内核版本和系统位数。

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

nginx HAProxy性能 nginx和haproxy_高可用_02

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

nginx HAProxy性能 nginx和haproxy_linux_03


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 监控界面

nginx HAProxy性能 nginx和haproxy_nginx HAProxy性能_04