负载均衡多种策略,主要是以下几种策略:

  • 轮询:默认的负载均衡方法。客户端请求按顺序依次分配给每个后端服务器。
  • 最少连接数:将客户端请求分配给当前活动连接数最少的服务器。
  • IP哈希:根据客户端的 IP 地址计算哈希值,将请求分配到特定的后端服务器。同一IP地址的请求将被分配到同一个后端服务器上。可能导致负载不均衡。
  • 加权轮询:管理员给每个后端服务器设置一个权重,请求按照权重进行分配。
  • 加权最少连接数:类似于加权轮询,但分配请求时考虑每台服务器的连接数和权重。
  • 随机:随机选择一台后端服务器来处理请求。可能出现不均衡的负载分配。

1.Nginx配置

设置反向代理与负载均衡的简单示例:

http {
    upstream backend {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }
    
    proxy_connect_timeout  600;
    server {
        listen 80;

        location / {
            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;
        }
    }
}

配置说明:

  • proxy_pass:反向代理核心指令,这个指令用于将请求转发到指定的服务器,例如转发到本地8081端口服务,这样配置"proxy_pass http://127.0.0.1:8081;"。
  • upstream:负载均衡核心指令,用于定义服务器组,包含多个后端服务器,这里定义的服务器组的名称为backend。
  • proxy_set_header:用于设置代理请求头的指令,反向代理时,设置转发请求的HTTP请求头。
  • least_conn:用于设置负载均衡的服务器组,使用最少连接数配置。
  • proxy_connect_timeout:nginx代理参数,用于指定反向代理跟后端服务器连接超时的时间。

2 完整配置示例

完成配置包含负载均衡几种算法的配置、反向代理请求头配置、Nginx代理参数配置。

2.1、负载均衡算法

2.1.1 轮询

默认设置,直接配置 upstream,Nginx 会使用轮询算法。


http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

2.1.2 最少连接数

使用 least_conn 指令来指定最少连接算法。

ttp {
    upstream backend {
        least_conn; # 使用最少连接算法
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

2.1.3 IP 哈希

使用 ip_hash 指令确保来自同一 IP 的请求被转发到同一台服务器。


http {
    upstream backend {
        ip_hash; # 使用 IP 哈希算法
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

2.1.4 加权轮询

为每个服务器设置权重,权重超高,分配到这台服务器的概率就越高。


http {
    upstream backend {
        server backend1.example.com weight=3 fail_timeout=30s; # 权重为3,30秒超时即算失败
        server backend2.example.com weight=2; # 权重为2
        server backend3.example.com;           # 默认权重为1
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

2.1.5 加权最少连接

结合权重和最少连接。


http {
    upstream backend {
        least_conn; # 使用最少连接算法
        server backend1.example.com weight=3; 
        server backend2.example.com weight=2; 
        server backend3.example.com;           
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

2.1.6 随机

此功能需要使用第三方模块,例如 ngx_http_random_module ,标准Nginx 不支持随机选择。如果已安装此模块,可以这样配置。


http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
        
        # 启用随机选择
        random;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

3、反向代理参数配置

反向代理参数可以配置到http块、server块、location块,配置到http块将对此http下的所有server生效,配置到server只能当前server生效,如若配置到location块,将接收到此location块的请求生效。

http {
    # 定义 upstream 块,用于管理后端服务器
    upstream backend {
        server backend1.example.com;  # 后端服务器 1
        server backend2.example.com;  # 后端服务器 2
    }

    # 配置服务器块
    server {
        listen 80;  # 监听 80 端口
        server_name example.com;  # 设置服务器域名

        # 设置客户端请求体大小限制
        client_max_body_size 10M;  # 最大请求体为 10MB

        # 表示客户端请求头部的缓冲区大小。绝大多数情况下一个请求头不会大于1k,不过如果有来自于wap客户端的较大的cookie它可能会大于 1k,Nginx将分配给它一个更大的缓冲区,这个值可以在large_client_header_buffers里面设置
        client_header_buffer_size 32k;

        # 表示一些比较大的请求头使用的缓冲区数量和大小,默认一个缓冲区大小为操作系统中分页文件大小,通常是4k或8k,请求字段不能大于一个缓冲区大小,如果客户端发送一个比较大的头,nginx将返回"Request URI too large" (414),请求的头部最长字段不能大于一个缓冲区,否则服务器将返回"Bad request" (400)
        large_client_header_buffers 4 32k;

        # 长连接超时时间,单位是秒
        keepalive_timeout 65;

        # 启用 TCP_NODELAY 选项,优化小数据包的发送。这意味着在发送小数据包时,不会等待可以合并的更多数据包,从而避免延迟
        tcp_nodelay on;

        # 默认off,是否开启gzip
        gzip on; 
        # 指定需要进行 Gzip 压缩的 MIME 类型。列表包括:
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        # 开启静态文件的 Gzip 支持。如果请求的文件已经有 Gzip 压缩版本(通常以 .gz 结尾),Nginx 将直接返回该压缩文件,而不是动态生成。
        gzip_static on;
        # 允许对代理请求进行压缩。可以接受任何状态码的响应。
        gzip_proxied any;
        # 设置 Vary 响应头为 "Accept-Encoding"。这告诉缓存服务器(如 CDN)根据请求的编码格式来缓存不同版本的资源。
        gzip_vary on;
        # 设置 Gzip 压缩级别,范围是 1 到 9,数字越大压缩率越高,但 CPU 使用率也随之增加。6 是一个比较平衡的选择。
        gzip_comp_level 6;
        # 设置用于 Gzip 压缩的缓冲区数量和大小。在这个例子中,有 16 个 8KB 的缓冲区可用于处理请求。
        gzip_buffers 16 8k;
        # gzip_min_length 1k;
        # 指定启用 Gzip 压缩所需的最低 HTTP 版本,这里设置为 1.1。
        gzip_http_version 1.1;

        # 处理根路径的请求
        location / {
            proxy_pass http://backend;  # 将请求转发到 upstream 定义的后端服务器

            # 设置代理超时
            proxy_connect_timeout 60s;  # 连接后端服务器的超时时间
            proxy_read_timeout 90s;  # 客户端读取响应的超时时间
            proxy_send_timeout 60s;  # 向后端服务器发送请求的超时时间
            #代理请求缓存区,这个缓存区间会保存用户的头信息以供Nginx进行规则处理 一般只要能保存下头信息即可
            proxy_buffer_size 16k;
            proxy_buffers 4 32k;
            # 如果系统很忙的时候可以申请更大的proxy_buffers
            proxy_busy_buffers_size 64;
            # proxy缓存临时文件的大小
            proxy_temp_file_write_size 64;
            proxy_redirect default;

            # 隐藏Nginx后端服务X-Powered-By头
            proxy_hide_header X-Powered-By;
            proxy_hide_header Server;

            # 设置缓存(可选)
            proxy_cache my_cache;  # 指定缓存区域
            proxy_cache_valid 200 1h;  # 对 200 响应进行 1 小时缓存
            # 配置缓存区域(可选)
            proxy_cache_path /var/cache/nginx/my_cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
        }
    }
}

3.1反向代理请求头配置


location / {
    proxy_pass http://backend_server;  # 替换为您的后端服务器地址

    # 设置代理请求头
    proxy_set_header Host $host;  # 原始请求的主机名
    proxy_set_header X-Real-IP $remote_addr;  # 客户端真实 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 转发链中的客户端 IP
    proxy_set_header X-Forwarded-Proto $scheme;  # 请求的协议(http/https)
    proxy_set_header X-Forwarded-Host $host;  # 转发请求的 Host
    proxy_set_header X-Forwarded-Port $server_port;  # 转发请求的端口
    proxy_set_header User-Agent $http_user_agent; # 客户端软件的信息,通常包含浏览器类型和版本号。
    # 指示请求来源的 URL。
    proxy_set_header Referer $http_referer;
    # 告知服务器客户端能够处理的内容类型
    proxy_set_header Accept $http_accept;

    # 可以根据需要添加自定义请求头
    proxy_set_header Custom-Header "CustomValue";  # 自定义请求头示例
}

4、ssl配置(HTTPS)

需要安装 with-http_ssl_module 模块

http{
 
    server{
        listen 443 ssl;
        #对应你的域名
        server_name test.com;
        ssl_certificate /usr/local/nginx/cert/ssl.crt;
        ssl_certificate_key /usr/local/nginx/cert/ssl.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        #如果是静态文件,直接指向目录,如果是动态应用,用proxy_pass转发一下
        location / {
                root /usr/local/service/ROOT;
                index index.html;
        }
    }
    #监听80端口,并重定向到443
    server{
        listen 80;
        server_name test.com;
        rewrite ^/(.*)$ https://test.com:443/$1 permanent;
    }
}

5、vue配置


server {
    listen 80;  # 监听 HTTP 请求的 80 端口
    server_name your_domain.com;  # 替换为你的域名或 IP 地址

    location / {
        root /path/to/your/vue/dist;  # Vue 应用构建后的目录
        index index.html;  # 默认首页
        try_files $uri $uri/ /index.html;  # 处理前端路由,用于适配history模式
    }

    # 可选:设置 gzip 压缩
    gzip on;
    gzip_types text/plain application/json application/javascript text/css;
    gzip_min_length 256;
}