一、正反向代理
正向代理是在客户端和目标服务器之间充当中间人的代理服务器。当客户端请求访问目标服务器时,请求先发送到正向代理服务器,然后由代理服务器转发请求给目标服务器,并将目标服务器的响应返回给客户端。正向代理隐藏了客户端的真实IP地址,使得目标服务器无法直接识别和追踪客户端。 简而言之:正向代理是客户端访问代理服务器去访问目标服务器,并且对目标服务器隐藏了客户端的真实信息(IP等信息)。
反向代理是在服务器端和客户端之间充当中间人的代理服务器。当客户端发送请求访问反向代理服务器时,代理服务器会根据一定的规则将请求转发给后端的多个服务器中的一台,然后将后端服务器的响应返回给客户端。反向代理隐藏了真实的服务端,对于客户端而言,它们并不知道具体访问的是哪一台后端服务器。 简而言之:反向代理是指代理服务器接收客户端的请求,然后反向代理将客户端的请求分发给一个或多个目标服务器,最后将响应返回给客户端,对于客户端隐藏了真实的服务端信息。
二、负载均衡的配置
Nginx 负载均衡的核心工作原理是通过 反向代理 将客户端请求智能分发到多个后端服务器,结合多种算法和健康检查机制,实现高可用、高性能的服务架构。
1.基础配置
在 代理服务器Nginx 子配置文件目录中通过 upstream
模块定义后端服务器池,并在 server
模块中反向代理到该池
[root@lb ~]# vim /etc/nginx/conf.d/lb.conf
upstream webPools { #upstream集群组的名字 # 定义后端服务器列表
server 192.168.8.156;
server 192.168.8.157;
#server关键字是固定的,后面可以接域名(门户会用)或IP。如果不指定端口,默认是80端口。weight代表权重,数值越大被分配的请求越多,结尾有分号。}
server {
listen 80;
server_name example.com; location / {
# 访问example.com,请求发送给www_server_pools里面的节点,在实际的反向代理工作中,会通过location功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池。proxy_pass http://webPools;
#在代理向后端服务器发送的http请求头中加入host字段信息后,若后端服务器配置有多个虚拟主机,它就可以识别代理的是哪个虚拟主机proxy_set_header Host $host;
#接收记录真实用户的 IP ,而不是代理服务器的IPproxy_set_header X-Real-IP $remote_addr;
}
实现 Nginx 负载均衡的组件说明
ngx_http_proxy_module : proxy 代理模块, 用于把请求拋给服务器节点或 upstream 服务器池
Nginx反向代理案例:
web01服务器、web02服务器、lb负载均衡器、客户端
1、服务器和负载均衡器均下载Nginx
[root@all ~]# yum install nginx -y2、web服务器的配置
2.1、准备测试页面
[root@web ~]# mkdir -p /usr/share/nginx/html/{www,bs}/logs
[root@web ~]# echo "`hostname -I `www" > /usr/share/nginx/html/www/index.html
[root@web ~]# echo "`hostname -I `bbs" > /usr/share/nginx/html/bbs/index.html2.2、配置虚拟主机
[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 conf.d]# vim vhosts.conf
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root /usr/share/nginx/html/bbs;
index index.html index.htm;
}
access_log /usr/share/nginx/html/bbs/logs/access_bbs.log main;
}
server {
listen 80;
server_name www.yunjisuan.com;
location / {
root /usr/share/nginx/html/www;
index index.html index.htm;
}
access_log /usr/share/nginx/html/www/logs/access_www.log main;
}2.3、启动服务
[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf sntax is ok
nginx: configuration file /etc/nginx/nginx.conf test s successful
[root@web01 conf.d]# systemctl restart nginx3、lb负载均衡器的配置
[root@lb ~]# vim /etc/nginx/conf.d/lb.conf
upstream webPools {server 192.168.8.156;server 192.168.8.157;
}server {listen 80;server_name www.yunjisuan.com;location / {proxy_pass http://webPools;proxy_set_header X-Forwarded-For $remote_addr;proxy_set_header Host $host;}
}
server {listen 80;server_name bbs.yunjisuan.com;location / {proxy_pass http://webPools;proxy_set_header X-Forwarded-For $remote_addr;proxy_set_header Host $host;}
}[root@lb ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf sntax is ok
nginx: configuration file /etc/nginx/nginx.conf test s successful
[root@lb ~]# systemctl restart nginx4、客户端的配置与测试
[root@localhost ~]# vim /etc/hosts
192.168.8.154 www.yunjisuan.com bbs.yunjisuan.com[root@localhost ~]# for ((i=1;i<=6;i++));do curl bbs.unjisuan.com;done
192.168.8.156 bbs
192.168.8.157 bbs
192.168.8.156 bbs
192.168.8.157 bbs
192.168.8.156 bbs
192.168.8.157 bbs
[root@localhost ~]# for ((i=1;i<=6;i++));do curl www.yunjisuan.com;done
192.168.8.156 www
192.168.8.157 www
192.168.8.156 www
192.168.8.157 www
192.168.8.156 www
192.168.8.157 www[root@web02 conf.d]# tail /usr/share/nginx/html/bbs/logs/access_bbs.log
192.168.8.154 - - [14/Feb/2025:17:47:06 +0800] "GET / HTTP/1.0" 200 18 "-" "curl/7.79.1" "192.168.8.158"
192.168.8.154 - - [14/Feb/2025:17:47:07 +0800] "GET / HTTP/1.0" 200 18 "-" "curl/7.79.1" "192.168.8.158"
192.168.8.154 - - [14/Feb/2025:17:47:07 +0800] "GET / HTTP/1.0" 200 18 "-" "curl/7.79.1" "192.168.8.158"
192.168.8.154 - - [14/Feb/2025:17:47:07 +0800] "GET / HTTP/1.0" 200 18 "-" "curl/7.79.1" "192.168.8.158"
192.168.8.154 - - [14/Feb/2025:17:47:08 +0800] "GET / HTTP/1.0" 200 18 "-" "curl/7.79.1" "192.168.8.158"
192.168.8.154 - - [14/Feb/2025:17:47:08 +0800] "GET / HTTP/1.0" 200 18 "-" "curl/7.79.1" "192.168.8.158"
192.168.8.154 - - [14/Feb/2025:17:47:08 +0800] "GET / HTTP/1.0" 200 18 "-" "curl/7.79.1" "192.168.8.158"
192.168.8.154 - - [14/Feb/2025:19:57:52 +0800] "GET / HTTP/1.0" 200 18 "-" "curl/7.79.1" "192.168.8.158"
192.168.8.154 - - [14/Feb/2025:19:57:52 +0800] "GET / HTTP/1.0" 200 18 "-" "curl/7.79.1" "192.168.8.158"
192.168.8.154 - - [14/Feb/2025:19:57:52 +0800] "GET / HTTP/1.0" 200 18 "-" "curl/7.79.1" "192.168.8.158"
2、负载均衡算法
Nginx 支持多种负载均衡策略,根据场景选择合适算法:
2.1、轮询(Round Robin)
-
默认策略:按顺序分配请求到后端服务器。
-
加权轮询:通过
weight
参数分配权重。
upstream webPools {server 192.168.8.156 weight=2; # 处理2倍请求server 192.168.8.157 weight=1;
}
2.2、IP哈希(IP Hash)
基于客户端 IP 分配请求,确保同一用户访问固定服务器(适合会话保持)
upstream webPools {ip_hash;server 192.168.8.156 ;server 192.168.8.157 ;
}
2.3、最少连接(Least Connections)
将请求分发到当前连接数最少的服务器。
upstream webPools {least_conn;server 192.168.8.156 ;server 192.168.8.157 ;
}
3、健康检查
Nginx 默认通过被动健康检查剔除故障节点:
upstream webPools {server 192.168.8.156 max_fails=3 fail_timeout=30s ;server 192.168.8.157 max_fails=2 fail_timeout=20s ;
}
-
max_fails
: 允许的连续失败次数。 -
fail_timeout
: 故障服务器暂停服务时间。
4. 动态调整与扩展
4.1、临时下线节点:标记服务器为 down
。
server 192.168.8.157 down;
4.2、热备服务器:通过 backup
标记备用节点。
server 192.168.8.158 backup;