目录
1、利用nginx负载均衡后端服务器配置块upstream 组成服务集群
一、Nginx正向代理(客户端 <一> 代理 一>服务端)
正向代理是代理服务器位于客户端和目标服务器之间,客户端发送请求时需先将请求发送至代理服务器,代理服务器再将请求转发给目标服务器,并将响应返回给客户端。这种配置可以用于代理客户端访问受限制的内容或保护客户端的身份信息。(服务端不知道客户端的真实IP,都是通过代理服务器转发的请求和响应)
正向代理,对于服务端来讲,来源地址是一个整体(代理服务器)
二、Nginx反向代理(客户端 一>代理 <一> 服务端)
当外部请求进入系统时,K代理服务器把该请求转发到系统中的某台服务器上,对外部请求来说,与之交互的只有代理服务器,此时代理服务器实现的是反向代理。
其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。(客户端不知道服务端的真实IP)
反向代理,对于客户端来讲,后端地址是一个整体(代理服务器)
正向代理和反向代理的区别:
1、正向代理是为了代理客户端发送请求,而反向代理是为了代理服务器接收请求。
2、正向代理的主体是客户端,而反向代理的主体是服务器
反向代理实例:
目的:在客户端无法直接连接目标服务器的情况下,通过客户端向代理服务器发送请求并转发给目标服务器接收到响应结果
目标服务器:
A:127.0.0.1:8000/API
代理服务器:
B:127.0.0.2:8889
客户端:
C:127.0.0.3
1、修改代理服务器配置设置请求转发。
默认配置文件路径一般在/etc/nginx/conf.d/default.conf,特例情况下通过开源社区拉取的项目可根据/etc/nginx/nginx.conf全局配置文件中的include查看配置文件
nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
配置项 | 解释 | 备注 |
server | 定义虚拟主机的配置项,一个Nginx服务器可以有多个server块来处理不同的域名或IP地址的请求 | |
listen 8080 | 监听8080端口 | |
listen [::]:8080 | 设置服务器监听的IPv6地址和端口 | |
server_name | 设置虚拟主机的域名或IP地址 | |
location | 匹配请求的URL路径,并指定相应的配置块 | |
proxy_pass | 用于将请求反向代理到指定的后端服务器 | |
proxy_set_header | 用于设置转发到后端服务器的HTTP请求头 | 可设置是否将客户端IP地址写入请求头,从而实现隐藏真实客户端IP |
server backend1.example.com; | 默认的负载均衡策略。Nginx按照请求的顺序将请求分发给后端服务器,每个服务器依次接收请求 | |
ip_hash; | Nginx根据客户端的IP地址将请求分发给后端服务器。这样可以确保同一个客户端的请求始终发送到同一个服务器,有助于保持会话的一致性 | |
least_conn; | Nginx将请求发送到当前连接数最少的后端服务器。这个策略可以确保负载均衡,使得连接数相对均匀地分布在后端服务器上 | |
server backend1.example.com weight=3; | Nginx根据服务器的权重分配请求。权重越高的服务器将接收到更多的请求 | |
server backend1.example.com weight=3; least_conn; | Nginx根据服务器的权重和当前连接数将请求分发给后端服务器。权重越高且连接数越少的服务器将接收到更多的请求 |
2、启动nginx代理服务器
docker-compose.yml
version: '2.0'
services:
web: #入口程序
image: nginx:1.20.1
container_name: nginx
ports:
- "8889:8080"
volumes:
- /home/nginx/nginx.conf:/etc/nginx/nginx.conf
- /home/nginx/default.conf:/etc/nginx/conf.d/default.conf
ulimits:
core: 0
3、验证
客户端请求:
curl http://127.0.0.2:8889/API
Request received. Check server console for client IP.
服务端响应:
Client IP:127.0.0.2
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
三、基于反向代理实现的负载均衡
将网络流量在多个后端服务器之间分配的技术,以提高系统的可伸缩性、可靠性和性能
例:比如共有15个请求,通过nginx将这些请求平均分发(理想状态下)到下面三个服务器上,每个服务器上有5个请求
服务端:
A:127.0.0.1:8000
B:127.0.0.1:8001
C:127.0.0.1:8002
客户端:
D:127.0.0.3
负载均衡服务器:
E:127.0.0.2:8889
具体实现:
1、利用nginx负载均衡后端服务器配置块upstream 组成服务集群
nginx代理配置
upstream test_api {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
server {
listen 8080;
listen [::]:8080;
server_name localhost;
# access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://test_api;
proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
2、通过客户端向负载均衡服务器发送请求,模拟并发环境
bash request.sh
#!/bin/bash
TARGET_SERVER="http://127.0.0.2:8889/API"
CONCURRENT_REQUESTS=15
for ((i=1; i<=CONCURRENT_REQUESTS; i++)); do
curl -s "$TARGET_SERVER" >/dev/null &
done
wait
echo "All requests sent"
3、验证
A服务端:127.0.0.1:8000
Client IP:127.0.0.1
Client IP:127.0.0.1
Client IP:127.0.0.1
Client IP:127.0.0.1
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
Client IP:127.0.0.1
B服务端:127.0.0.1:8001
Client IP:127.0.0.1
Client IP:127.0.0.1
Client IP:127.0.0.1
Client IP:127.0.0.1
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
Client IP:127.0.0.1
C服务端:127.0.0.1:8002
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
Client IP:127.0.0.1
Client IP:127.0.0.1
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
127.0.0.2 - - [11/Aug2023 10:58:33] "GET /API HTTP/1.0" 200 -
Client IP:127.0.0.1
Client IP:127.0.0.1
Client IP:127.0.0.1