nginx负载均衡实现过程?

1,768 阅读3分钟

Nginx 负载均衡是通过 upstream 模块实现的,其负载均衡实现过程如下:

  1. 解析请求

客户端发送请求到 Nginx,Nginx 会解析请求头和请求内容,并根据配置的 upstream 模块确定如何进行负载均衡。

  1. 选择后端服务器

选择后端服务器通常有以下几种方式:

  • 轮询(default):Nginx 默认情况下采用轮询的方式依次将请求分配到不同的服务器上,保证请求负载均衡。

  • 最少连接数(least_conn):当后端服务器的连接数不同,Nginx 采用最少连接数的方式将请求分配到与连接数最少的服务器上,保证负载均衡的同时,还能减少服务器的负载。

  • IP 哈希(ip_hash):Nginx 采用 IP 哈希的方式根据客户端的 IP 地址分配请求,保证相同 IP 地址的客户端请求都会分配到同一台服务器上,提高服务的可用性和稳定性。

  • 加权轮询(weight):Nginx 可以通过配置文件中给不同的后端服务器赋予不同的权重,由此实现加权轮询的负载均衡方式,在高负载的情况下更好地保障某些服务器的服务。

  1. 转发请求

一旦 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 中,同时也开启了文件缓存、定义了静态文件的目录路径,并配置了错误页面的处理方式。