一、负载均衡 vs 反向代理
内容 | 共同点 | 区别 | 服务 |
---|---|---|---|
负载均衡 | 用户的请求分发到后端节点上 | 用户–>lb–>web,lb负载均衡做的是数据转发,不会产生新的请求,1个请求1个响应 | lvs |
反向代理 | 用户的请求分发到后端节点上 | 中间有个中介,用户–>中介–>web,2个请求2个响应。代理代替用户去找web服务器 | nginx、tengine、openresty、haproxy |
常见负载均衡产品:
硬件负载均衡:F5
开源软件:nginx、haproxy、lvs。。。
商业软件
公有云产品
二、负载均衡快速上手案例
1、环境准备
角色 | 主机名 | ip | 说明 | |
---|---|---|---|---|
负载均衡服务器 | lb01 | 192.168.10.5、172.16.1.5 | 站点目录:/app/code/lb/ | 已安装nginx |
web服务器 | web01 | 192.168.10.7、172.16.1.7 | 已安装nginx | |
web服务器 | web02 | 192.168.10.8、172.16.1.8 | 已安装nginx |
2、安装nginx
3台机子都安装nginx
安装nginx方法:
#配置nginx的yum源
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
#安装nginx
yum install -y nginx
3、web01服务器配置
3.1 配置文件
[root@web01 ~]#vim /etc/nginx/conf.d/lb.conf
server {
listen 80;
server_name lb.com;
error_log /var/log/nginx/lb-error.log notice;
access_log /var/log/nginx/lb-access.log main;
root /app/code/lb;
location / {
index index.html;
}
}
3.2 站点目录及首页文件
[root@web01 ~]#mkdir -p /app/code/lb/
[root@web01 ~]#echo "`hostname` lb.com" > /app/code/lb/index.html
3.3 重启nginx服务
[root@web01 ~]#cd /etc/nginx/conf.d/
[root@web01 /etc/nginx/conf.d]#mv default.conf{,.bak}
[root@web01 ~]#systemctl restart nginx
4、web02服务器配置
参照web01配置即可。
[root@web02 ~]#vim /etc/nginx/conf.d/lb.conf
server {
listen 80;
server_name lb.com;
error_log /var/log/nginx/lb-error.log notice;
access_log /var/log/nginx/lb-access.log main;
root /app/code/lb;
location / {
index index.html;
}
}
[root@web02 ~]#mkdir -p /app/code/lb
[root@web02 ~]#echo "`hostname` lb.com" > /app/code/lb/index.html
[root@web02 ~]#cd /etc/nginx/conf.d/
[root@web02 /etc/nginx/conf.d]#mv default.conf{,.bak}
[root@web02 ~]#systemctl restart nginx
查看nginx服务报错信息:journalctl -u nginx
5、负载均衡服务器(lb0)
5.1 配置文件
#1、修改默认配置文件default.conf
[root@lb01 ~]#vim /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
server_name localhost;
return 403;
}
#2、负载均衡配置文件
#负载均衡配置
#创建负债均衡分组
upstream lb_pools {
server 192.168.10.7:80;
server 192.168.10.8:80;
}
server {
listen 80;
server_name lb.com;
error_log /var/log/nginx/lb-eror.log notice;
access_log /var/log/nginx/lb-access.log main;
location / {
#把请求转发到后端的web节点
proxy_pass http://lb_pools;
proxy_set_header Host $http_host;
}
}
5.2 重启nginx服务
[root@lb01 ~]#systemctl restart nginx
5.3 访问测试
使用命令指定域名访问:
[root@lb01 ~]#curl -H Host:lb.com http://192.168.10.5
web02 lb.com
[root@lb01 ~]#curl -H Host:lb.com http://192.168.10.5
web01 lb.com
[root@lb01 ~]#
注意:
如果用ip访问,则提示403。因为,default.conf文件设置了403,如果要想使用ip访问,则删除default.conf文件重启nginx服务即可。
5.4 抓包
删除default.conf文件重启nginx服务,浏览器打开192.168.10.5,使用Wireshark软件抓包

6、负载均衡指令与模块
2个模块:upstream与proxy
upstream指令:写在http{}区域,不能写在server{}区域
proxy_pass指令:把请求往后抛(一台主机、集群、upstream的分组
proxy_set_header指令:
负载均衡多虚拟主机的故障案例
现象:web节点上有多个虚拟主机,负载均衡在转发数据的时候会有访问异常,访问多个虚拟主机的默认或第1个。
原因:负载均衡向后端节点发出请求的时候,请求头Host变成了upstream的名字,相当于使用ip访问。
解决:通过proxy_set_header指令修改负载到web节点的请求头
proxy_set_header Host $http_host
$http_host:为nginx的变量,即用户请求头(Host)
7、记录客户端的真实ip
在负载均衡中,web服务记录的是负载均衡服务器的ip,并没有记录客户端的真实ip
[root@web01 ~]#tail -f /var/log/nginx/lb-access.log
192.168.10.5 - - [27/Jun/2023:21:53:07 +0800] "GET / HTTP/1.0" 200 13 "-" "curl/7.29.0" "-"
192.168.10.5 - - [27/Jun/2023:21:53:17 +0800] "GET / HTTP/1.0" 200 13 "-" "curl/7.29.0" "-"
那怎么记录用户的真实ip?
增加XFF请求头:X-Forwarded-For,记录用户真实ip地址
在负载均衡上设置:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
即:
location / {
#把请求转发到后端的web节点
proxy_pass http://lb_pools;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
8、负载均衡模块选项
upstream模块server指令支持的选项
upstream后面的分组名称要唯一
upstream lb_pools {
server 192.168.10.7:80 weight=1 max_fails=3 fail_timeout=10s;
server 192.168.10.8:80 weight=1 max_fails=3 fail_timeout=10s;
server 192.168.10.9:80 backup;
}
选项说明:
server后面可以加的选项 | 说明 | 应用场景 |
---|---|---|
weight | 权重,根据权重nginx分配请求 | 如果web服务器配置不同,例如:1核2G、2c8g等 代码更新与测试的时候,给测试服务器较小的权限 |
max_fails | nginx具备一些健康检查功能,指定失败的次数,超过这个次数就认为节点挂了 | 一般情况下,可以设置1-3即可,不太重要,缓存业务可以设置为10 |
fail_timeout | 认为节点挂了后,间隔多久再次检查健康情况,默认是10s | 根据要求设置时间间隔即可,例如30秒、60秒 |
backup | 备用服务器,当其他服务器都挂了的时候才启用 | 使用的时候,需要考虑雪崩的情况 |