一、负载均衡 vs 反向代理

内容共同点区别服务
负载均衡用户的请求分发到后端节点上用户–>lb–>web,lb负载均衡做的是数据转发,不会产生新的请求,1个请求1个响应lvs
反向代理用户的请求分发到后端节点上中间有个中介,用户–>中介–>web,2个请求2个响应。代理代替用户去找web服务器nginx、tengine、openresty、haproxy

常见负载均衡产品:

硬件负载均衡:F5
开源软件:nginx、haproxy、lvs。。。
商业软件
公有云产品

二、负载均衡快速上手案例

1、环境准备

角色主机名ip说明
负载均衡服务器lb01192.168.10.5、172.16.1.5站点目录:/app/code/lb/已安装nginx
web服务器web01192.168.10.7、172.16.1.7已安装nginx
web服务器web02192.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_failsnginx具备一些健康检查功能,指定失败的次数,超过这个次数就认为节点挂了一般情况下,可以设置1-3即可,不太重要,缓存业务可以设置为10
fail_timeout认为节点挂了后,间隔多久再次检查健康情况,默认是10s根据要求设置时间间隔即可,例如30秒、60秒
backup备用服务器,当其他服务器都挂了的时候才启用使用的时候,需要考虑雪崩的情况