nginx负载均衡实现过程?
Nginx 负载均衡是通过 upstream
模块实现的,其负载均衡实现过程如下:
- 解析请求
客户端发送请求到 Nginx,Nginx 会解析请求头和请求内容,并根据配置的 upstream 模块确定如何进行负载均衡。
- 选择后端服务器
选择后端服务器通常有以下几种方式:
-
轮询(default):Nginx 默认情况下采用轮询的方式依次将请求分配到不同的服务器上,保证请求负载均衡。
-
最少连接数(least_conn):当后端服务器的连接数不同,Nginx 采用最少连接数的方式将请求分配到与连接数最少的服务器上,保证负载均衡的同时,还能减少服务器的负载。
-
IP 哈希(ip_hash):Nginx 采用 IP 哈希的方式根据客户端的 IP 地址分配请求,保证相同 IP 地址的客户端请求都会分配到同一台服务器上,提高服务的可用性和稳定性。
-
加权轮询(weight):Nginx 可以通过配置文件中给不同的后端服务器赋予不同的权重,由此实现加权轮询的负载均衡方式,在高负载的情况下更好地保障某些服务器的服务。
- 转发请求
一旦 Nginx 选择了一个后端服务器,就会将请求转发到选中的服务器上,等待服务器的响应结果,最终返回客户端响应。如果转发失败,Nginx 会自动选择一个新的后端服务器进行请求转发,保证服务的连续性。
DEMO
下面是一个完整的具有负载均衡配置的 Nginx 配置文件,其中包括了全局块、http 块、server 块、upstream 块和location 块,用于实现对多个后端服务器的负载均衡分发。
# 全局块
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# http 块
http {
# 文件缓存
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
# 文件类型
include /etc/nginx/mime.types;
default_type application/octet-stream;
# tcp 连接
sendfile on;
client_max_body_size 8m;
keepalive_timeout 65;
tcp_nodelay on;
tcp_nopush on;
server_names_hash_bucket_size 128;
types_hash_max_size 2048;
# 服务器块
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com;
# 负载均衡规则
location / {
proxy_cache my_cache; # 文件缓存
proxy_pass http://backend; # 负载均衡
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 静态文件
location /static/ {
root /var/www/example;
expires 1d;
add_header Cache-Control "public, max-age=86400";
access_log off;
}
# 错误页面
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
internal;
}
}
# 负载均衡集群
upstream backend {
server 127.0.0.1:8000 weight=2; # 权重 2
server 127.0.0.1:8001 max_fails=3; # 最大失败次数 3
server 127.0.0.1:8002; # 默认权重为 1
}
}
这个 Nginx 配置文件中包括了全局块、http 块、server 块、upstream 块和 location 块,用于配置 Nginx 的基本参数、静态文件访问、请求转发、负载均衡等。其中,在 http
块下方的 upstream
块中定义了一个名为 backend
的负载均衡集群,包含了三个后端服务器,具体规则如下:
- 服务器
127.0.0.1:8000
的权重为 2,即 Nginx 会将两个请求发送至该服务器。 - 服务器
127.0.0.1:8001
的最大失败次数为 3,即在 3 次失败后将被暂时移除负载均衡。 - 服务器
127.0.0.1:8002
的默认权重为 1。
在 server
块中,通过 location
指定了请求转发的规则,并将请求分发至 upstream
块中定义的负载均衡集群 backend
中,同时也开启了文件缓存、定义了静态文件的目录路径,并配置了错误页面的处理方式。
转载自:https://juejin.cn/post/7238431406557052984