Nginx 负载均衡

负载均衡概述

负载均衡是将客户端请求分摊到多个服务器上执行,从而提高服务的可用性和响应速度,带给用户更好的体验。对于Web应用,通过配置负载均衡,可以将一台服务器的工作扩展到多台服务器中执行,提高整个网站的负载能力。其本质采用一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。

负载均衡的优点

  • 高并发连接
  • 内存消耗少
  • 配置文件非常简单
  • 成本低廉
  • 支持Rewrite重写规则
  • 内置的健康检查功能
  • 节省带宽
  • 稳定性高

负载均衡策略

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

内置策略

轮询(默认):Nginx根据请求次数,以轮询方式将将每个请求均匀分配到每台服务器;

weight:加权轮询,加权轮询则是在第一种轮询的基础上对后台的每台服务赋予权重,服务器的权重比例越大,被分发到的概率也就越大。

least_conn:最少连接,将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。

ip_hash:IP 哈希,绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。

扩展策略

fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。

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

提示:默认轮询可能存在一个问题,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,其登录信息会丢失。因为在负载均衡系统中,每次请求都会重新定位到服务器集群中的某一个,那么就会导致已经登录某一个服务器的用户在重新定位到另一个服务器了,所以就会导致丢失登录信息。

因此针对如上问题,可以采用ip_hash方式解决,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。

也可以采用 Redis 存储登录信息,来解决不同服务器信息共享的问题,典型的问题如:session 共享问题

负载均衡内置变量

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

  • $upstream_addr:保存一个服务器的IP地址和端口号或者UNIX-domain套接字文件的路径。如果在处理请求过程中使用了多个服务器,那么它们的地址将以逗号分割,例如 :“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。如果一个内置的从一个服务器组到另一个服务器组的重定向使用X-Accel-Redirect” or error_page ,那么那些服务器组以冒号隔开,例如“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。

  • $upstream_response_time:保存nginx负载均衡服务器响应时间,以毫秒计。多个响应也以逗号和冒号隔开。

  • $upstream_status:保存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暂时不参与负载均衡。

配置负载均衡

先准备好两到三台服务器,这里准备的是三台。分别是 172.24.10.21172.24.10.22172.24.10.23

172.24.10.21 作为反向代理服务器,其它两台作为后端服务器。

默认轮询方式
# 修改 Nginx 配置文件
vim /usr/local/nginx/nginx/conf/nginx.conf

upstream servers {
    server 172.24.10.22:9090;
    server 172.24.10.23:9090;
}

server {
    listen  80;
    server_name  www.server.com;
    access_log  /var/log/nginx/mybalance.access.log  main;
    error_log   /var/log/nginx/mybalance.error.log  warn;
    location / {
        proxy_pass http://servers;
        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服务器传
    }
}

# 修改完成后重启Nginx
service nginx restart
加权轮询方式
# 修改 Nginx 配置文件
vim /usr/local/nginx/nginx/conf/nginx.conf

upstream servers {
    server 172.24.10.22:9090 weight=1 max_fails=1 fail_timeout=2;
    server 172.24.10.23:9090 weight=2 max_fails=1 fail_timeout=2;
}

server {
    listen  80;
    server_name  www.server.com;
    access_log  /var/log/nginx/mybalance.access.log  main;
    error_log   /var/log/nginx/mybalance.error.log  warn;
    location / {
        proxy_pass http://servers;
        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服务器传
    }
}

# 修改完成后重启Nginx
service nginx restart
最小连接数方式
# 修改 Nginx 配置文件
vim /usr/local/nginx/nginx/conf/nginx.conf

upstream servers {
	least_conn; # 配置为最小连接数方式
    server 172.24.10.22:9090;
    server 172.24.10.23:9090;
}

server {
    listen  80;
    server_name  www.server.com;
    access_log  /var/log/nginx/mybalance.access.log  main;
    error_log   /var/log/nginx/mybalance.error.log  warn;
    location / {
        proxy_pass http://servers;
        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服务器传
    }
}

# 修改完成后重启Nginx
service nginx restart
IP hash 方式
# 修改 Nginx 配置文件
vim /usr/local/nginx/nginx/conf/nginx.conf

upstream servers {
	ip_hash; # 配置为 ip hash 方式
    server 172.24.10.22:9090;
    server 172.24.10.23:9090;
}

server {
    listen  80;
    server_name  www.server.com;
    access_log  /var/log/nginx/mybalance.access.log  main;
    error_log   /var/log/nginx/mybalance.error.log  warn;
    location / {
        proxy_pass http://servers;
        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服务器传
    }
}

# 修改完成后重启Nginx
service nginx restart
fair方式
# 修改 Nginx 配置文件
vim /usr/local/nginx/nginx/conf/nginx.conf

upstream servers {
	fair; # 配置为 fair 方式,相应时间最短
    server 172.24.10.22:9090;
    server 172.24.10.23:9090;
}

server {
    listen  80;
    server_name  www.server.com;
    access_log  /var/log/nginx/mybalance.access.log  main;
    error_log   /var/log/nginx/mybalance.error.log  warn;
    location / {
        proxy_pass http://servers;
        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服务器传
    }
}

# 修改完成后重启Nginx
service nginx restart
url hash 方式
# 修改 Nginx 配置文件
vim /usr/local/nginx/nginx/conf/nginx.conf

upstream servers {
	hash $request_uri; # 对请求的 url 做hash处理
    hash_method crc32; # 设置 hash 的算法
    server 172.24.10.22:9090;
    server 172.24.10.23:9090;
}

server {
    listen  80;
    server_name  www.server.com;
    access_log  /var/log/nginx/mybalance.access.log  main;
    error_log   /var/log/nginx/mybalance.error.log  warn;
    location / {
        proxy_pass http://servers;
        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服务器传
    }
}

# 修改完成后重启Nginx
service nginx restart
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值