Web服务器群集——HAproxy+Nginx负载均衡集群
Posted 611-_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web服务器群集——HAproxy+Nginx负载均衡集群相关的知识,希望对你有一定的参考价值。
HAproxy+nginx负载均衡集群
HAproxy概述
关于4/7层负载均衡
无负载均衡
- 在此示例中,用户直接连接到您的Web服务器,在yourdomain.com上,并且没有负载平衡。如果您的单个Web服务器出现故障,用户将无法再访问您的Web服务器。此外,如果许多用户试图同时访问您的服务器并且无法处理负载,他们可能会遇到缓慢的体验,或者可能根本无法连接。
四层负载均衡
- 将网络流量负载,平衡到多个服务器的最简单方法,是使用第4层(传输层)负载平衡。以这种方式进行负载均衡将根据IP范围和端口转发用户流量(即,如果请求进入http://yourdomain.com/anything,则流量将转发到处理yourdomain.com的所有请求的后端。端口80)
- 用户访问负载均衡器,负载均衡器将用户的请求转发给后端服务器的Web后端组。无论选择哪个后端服务器,都将直接响应用户的请求。通常,Web后端中的所有服务器应该提供相同的内容-否则用户可能会收到不一致的内容。
七层负载均衡
- 7层负载平衡是更复杂的负载均衡网络流量的方法是使用第7层(应用层)负载均衡。使用第7层允许负载均衡器根据用户请求的内容将请求转发到不同的后端服务器。这种负载平衡模式允许您在同一域和端口下运行多个Web应用程序服务器。
- 示例中,如果用户请求yourdomain.com/blog,则会将其转发到博客后端,后端是一组运行博客应用程序的服务器。其他请求被转发到web-backend,后端可能正在运行另一个应用程序。
关于HAproxy
7层负载均衡、应用程序负载均衡、URL负载均衡、动静分离技术,免费、快速并且可靠
是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。
HAProxy Session亲缘性
haproxy负载均衡保持客户端和服务器Session亲缘性的三种方式
- 用户IP识别
- cookie识别
- session识别
HAproxy特点
- 支持tcp / http两种协议层的负载均衡,使得其负载均衡功能非常丰富。
- 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
- 性能非常优秀,基于事件驱动的链接处理模式及单进程处理模式(和Nginx类似)让其性能卓越。
- 拥有一个功能出色的监控页面,实时了解系统的当前状况。
- 功能强大的ACL支持,给用户极大的方便。
HAproxy配置
#环境
四台Linux,做好域名解析
HAproxy:192.168.100.10
Web1:192.168.100.20
Web2:192.168.100.30
Client:192.168.100.40
#域名解析
[root@haproxy ~]# vim /etc/hosts
192.168.100.10 haproxy
192.168.100.20 web1
192.168.100.30 web2
192.168.100.40 client
[root@haproxy ~]# scp /etc/hosts web1:/etc/
[root@haproxy ~]# scp /etc/hosts web2:/etc/
[root@haproxy ~]# scp /etc/hosts client:/etc/
Web1和Web2创建测试页面
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo web1 > /var/www/html/index.html
[root@web1 ~]# systemctl enable httpd --now
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo web2 > /var/www/html/index.html
[root@web2 ~]# systemctl enable httpd --now
安装HAproxy
[root@haproxy ~]# yum -y install epel-release
[root@haproxy ~]# yum -y install haproxy
配置HAproxy
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
global #全局配置
log 127.0.0.1 local3 info #日志配置记录本机日志中 local3 日志类型自定义
maxconn 4096 #最大连接限制(优先级低)
user nobody #运行haproxy用户是谁/也可以写99
group nobody #组用户
daemon #守护进程常驻系统内存
nbproc 1 #haproxy进程数,该值的设置应与服务器cpu核心数一致,如16,即2颗8核心
pidfile /run/haproxy.pid #haproxy 进程id存放位置
defaults #默认配置
log global #日志使用全局设置
mode http #haproxy工作模式七层LB,程序会检查用户url
maxconn 2048 #haproxy最大连接数(优先级中)
retries 3 #健康检查,对后端真实服务器,3次失败认为服务不可用
option redispatch #重新匹配,服务器不可用后的操作,重定向至健康服务器
timeout connect 5000 #重传计时器,定义haproxy将客户端请求转发至后端服务器所等待的时间/毫秒
timeout client 50000 #向后长连接,haproxy作为客户,和后端服务器之间空闲连接的超时时间,到时发送fin指令
timeout server 50000 #向前长连接,haproxy作为服务器,和用户之间空闲连接的超时时间,到时发送fin指令
option abortonclose #关于关闭的选项,当服务器过载过高,自动结束当前队列处理较久的连接
stats uri /admin?stats #设置统计页面的uri为/admin?stats
stats realm Private lands #设置统计页面认证时的提示内容
stats auth admin:password #设置统计页面认证的用户和密码,如果设置多个,另一行写入即可
stats hide-version #隐藏统计页面上的haproxy版本信息
frontend http-in #前端虚拟服务器
bind 0.0.0.0:80 #绑定地址,为本机所有IP服务
mode http #面对前端http模式检查用户uri
log global #可以对面向前端日志单独存放,也可以放入本机全局设置
option httplog #日志格式,记录详细
option httpclose #关闭长连接
acl html url_reg -i \\.html$ #访问控制列名名称html,用户url地址可以被正则匹配,-i:忽略大小写,if如果html规则命中,则向后端真实服务器转发
use_backend html-server if html #如果满足acl html规则,则推送给后端服务器html-server
default_backend html-server #默认的后端服务器
backend html-server #真实服务器
mode http #观察用户url地址进行分发
balance roundrobin #轮询策略
option httpchk GET /index.html #健康状态检查查看服务器主页
cookie SERVERID insert indirect nocache #将相同用户请求,转发给相同的真实服务器
server html-A web1:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
server html-B web2:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
#cookie 3 服务器id,避免rr算法将客户机请求转发给其他服务器,对后端服务器的健康状态检查为2000毫秒,连续两次健康检查成功,则认为有效,连续五次健康检查失败,则认为宕机
[root@haproxy ~]# systemctl start haproxy #启动haproxy
测试结果
[root@client ~]# elinks --dump http://haproxy
HAproxy配置文件五部分
- global:设置全局配置参数,属于进程的配置,通常是和操作系统相关;
- defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件;
- frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend;
- backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器;
- Listen:frontend和backend的组合体。
HAproxy状态
http://192.168.100.10/admin?stats
密码为刚才在配置文件中配置的账户密码
Nginx七层负载均衡集群
特点
- 功能强大,性能卓越,运行稳定
- 配置简单灵活
- 能够自动剔除工作不正常的后端服务器
- 上传文件使用异步模式。client—nginx-web1 web2 web3 lvs同步请求DRclient–>dr—web1
- 支持多种分配策略,可以分配权重,分配方式灵活。
优势
- nginx复制用户请求,在后端服务器出现问题时,nginx会再复制一份请求发给另一台后端服务器,lvs则在这种情况,只能用户重新发请求
缺点
- 流量会经过nginx,nginx成为瓶颈
生产架构
Nginx配置
基于刚才的实验环境
[root@haproxy ~]# systemctl stop haproxy #停止haproxy
nginx:192.168.100.10
Web1:192.168.100.20
Web2:192.168.100.30
域名解析
[root@nginxproxy ~]# vim /etc/hosts
192.168.100.10 nginx
192.168.100.20 web1
192.168.100.30 web2
192.168.100.40 client
[root@nginx ~]# scp /etc/hosts web1:/etc/
[root@nginx ~]# scp /etc/hosts web2:/etc/
[root@nginx ~]# scp /etc/hosts client:/etc/
#页面准备使用刚才实验的试验主页
配置Nginx
[root@nginx ~]# yum -y install nginx
[root@nginx ~]# vim /etc/nginx/nginx.conf
...
#找到http模块添加 upstream
http {
upstream html { #上游服务器,服务器名html
server web1:80;
server web2:80;
}
...
#找到server模块中的location /
location / {
proxy_pass http://html; #html对应上方html服务器集群名
}
...
[root@nginx ~]# systemctl restart nginx
测试负载均衡
[root@client ~]# elinks --dump http://nginx
如需做动静分离添加location即可
#例:
location / { upstream html {
server web1:80;
} server web2:80;
location ~\\.html$ { }
proxy_pass ... upstream php {
} server web3:80;
location ~\\php$ { server web4:80;
proxy_pass ... }
} server {
location ~\\.(jpg|png|css|js)$ { location / {
proxy_pass ... proxy_pass http://html;
} }
location ~\\.php$ {
proxy_pass http://php;
}
以上是关于Web服务器群集——HAproxy+Nginx负载均衡集群的主要内容,如果未能解决你的问题,请参考以下文章