zhulinjie

V1

2022/05/26阅读:16主题:默认主题

Nginx负载均衡

Nginx负载均衡

主要均衡机制

round-robin:轮询。以轮询方式将请求分配到不同服务器上。 least-connected:最少连接数。将下一个请求分配到连接数最少的那台服务器上。 ip-hash:基于客户端的IP地址。散列函数被用于确定下一个请求分配到哪台服务器上。

负载均衡策略

nginx的负载均衡策略可以划分为两大类:内置策略和扩展策略,扩展策略为第三方提供。

内置策略

轮询(默认):Nginx根据请求次数,将每个请求均匀分配到每台服务器; weight:加权轮询,加权轮询则是在第一种轮询的基础上对后台的每台服务赋予权重,服务器的权重比例越大,被分发到的概率也就越大。 least_conn:最少连接,将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。 ip_hash:IP 哈希,绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。

扩展策略

fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。 url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

提示:默认轮询可能存在一个问题,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,其登录信息会丢失。因为在负载均衡系统中,每次请求都会重新定位到服务器集群中的某一个,那么就会导致已经登录某一个服务器的用户在重新定位到另一个服务器了,所以就会导致丢失登录信息。 因此针对如上问题,可以采用ip_hash方式解决,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。

负载均衡内置变量

nginx负载均衡器内置变量(Embedded Variables),nginx负载均衡模块ngx_http_upstream_module支持下列内置变量:

upstream_response_time:保存nginx负载均衡服务器响应时间,以毫秒计。多个响应也以逗号和冒号隔开。 upstream_http_:保存nginx负载均衡服务器响应头字段。例如,the “Server” response header field is made available through the $upstream_http_server variable.注意,只有最后一个服务器响应头字段被保存。

负载均衡健康检查

nginx反向代理包含内置的或第三方扩展来实现服务器健康检测的。如果后端某台服务器响应失败,nginx会标记该台服务器失效,在特定时间内,请求不分发到该台上。 fail_timeout:该指令定义了多长时间服务器将被标记为失败。在fail_timeout后,服务器还是failed,nginx将检测该服务器是否存活,如果探测成功,将标记为活的。 max_fails:该指令设置在fail_timeout期间内连续的失败尝试。默认情况下,max_fails为1。如果被设置为0,该服务器的健康检测将禁用。

负载均衡状态码

状态 概述
max_fails 允许请求失败的次数,默认为1。
max_conns 限制最大接受的连接数。
fail_timeout 在经历了max_fails次失败后,暂停服务的时间。
backup 预留的备份机器。
down 表示当前的server暂时不参与负载均衡。

负载均衡配置

默认轮询方式配置

vi slb.conf

upstream slb {
    server localhost:8001;
    server localhost:8002;
    server localhost:8003;
}

server {
    listen  8000;
    server_name  localhost;
    location / {
        proxy_pass http://slb;
    }
}

默认轮询参考配置

upstream mybalance01 {
    server 172.24.10.22:9090;
    server 172.24.10.23:9090;
    server 172.24.10.24:9090;
}

server {
    listen  80;
    server_name  balance.linuxds.com;
    access_log  /var/log/nginx/mybalance.access.log  main;
    error_log   /var/log/nginx/mybalance.error.log  warn;
    location / {
        proxy_pass http://mybalance01;
        index index.html;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        client_max_body_size       10m;  #允许客户端请求的最大单文件字节数
        client_body_buffer_size    128k; #缓冲区代理缓冲用户端请求的最大字节数
        proxy_connect_timeout      300;  #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout         300;  #后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout         300;  #连接成功后,后端服务器响应时间(代理接收超时)
        proxy_buffer_size          4k;  #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers              4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
        proxy_busy_buffers_size    64k;  #高负荷下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    }
}

加权轮询方式配置

vi slb.conf

upstream slb {
    server localhost:8001 weight=1 max_fails=1 fail_timeout=2;
    server localhost:8002 weight=8 max_fails=2 fail_timeout=2;
    server localhost:8003 backup; #配置为备份服务器
}

server {
    listen  8000;
    server_name  localhost;
    location / {
        proxy_pass http://slb;
    }
}

最小连接方式配置

vi slb.conf

upstream slb {
    least_conn;
    server localhost:8001;
    server localhost:8002;
    server localhost:8003;
}

server {
    listen  8000;
    server_name  localhost;
    location / {
        proxy_pass http://slb;
    }
}

ip hash方式配置

vi slb.conf

upstream slb {
    ip_hash;
    server localhost:8001;
    server localhost:8002;
    server localhost:8003;
}

server {
    listen  8000;
    server_name  localhost;
    location / {
        proxy_pass http://slb;
    }
}

参考资料

https://www.cnblogs.com/itzgr/p/13330613.html
https://juejin.cn/post/6844904106541203464

分类:

后端

标签:

运维部署

作者介绍

zhulinjie
V1

公众号: itidying