0、负载均衡的策略
使用场景示例
# 定义要包含在负载均衡方案中的服务器。
# 最好使用服务器的私有IP以获得更好的性能和安全性。
http {upstream backend {server 10.1.0.101;server 10.1.0.102;server 10.1.0.103;}server{server_name game1.test.com;listen 80;location / {proxy_pass http://backend# 用户请求的时候HOST的值是game1.test.com, 那么代理服务会像后端传递请求的还是game1.test.comproxy_set_header Host $http_host;# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ipproxy_set_header X-Real-IP $remote_addr;# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# nginx代理与后端服务器连接超时时间(代理连接超时)proxy_connect_timeout 10s;# nginx代理等待后端服务器的响应时间proxy_read_timeout 10s;# 后端服务器数据回传给nginx代理超时时间proxy_send_timeout 10s;# nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传,不是全部接收完再传给客户proxy_buffering on;# 设置nginx代理保存用户头信息的缓冲区大小proxy_buffer_size 8k;# proxy_buffers 缓冲区proxy_buffers 8 8k;# 状态标记proxy_next_upstream http_404 http_500 http_502 http_503 http_504 http_403;}}
}
0.1、内置策略
0.1.1、轮询策略
- 该策略就是服务器将每个前端请求按顺序(时间顺序和排列次序)逐一分配到不同的后端服务器节点。如果后端服务器出现问题,即down掉,那么就会被自动剔除。
如下:
upstream backend {
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
0.1.2、加权轮询策略
- 该策略在基本的轮询策略基础上考虑各后端服务器节点接受请求的权重,指定各后端服务器节点被轮询到的机率,主要应用于后端服务器节点性能不均的情况。
- 例如:通过直接配置weight来设置访问机率,weight的大小和访问比率成正比。
下面三个服务器(如果不配置weight,则默认配置为weight=1),第一个的权重是1,第二个的权重是3,第三个的权重是5,那么这三个后端服务器被访问的比率是1:3:5,即server 10.1.0.103被访问的机率最高,server 10.1.0.102次之,server server 10.1.0.101访问的机率最小。
如下:
upstream backend {
server 10.1.0.101;
server 10.1.0.102 weight=3;
server 10.1.0.103 weight=5;
}
0.1.3、ip_hash策略
- 该策略是将前端的访问IP进行hash操作,然后根据hash结果将请求分配到不同的后端服务器节点。这样会使得每个前端访问IP会固定访问一个后端服务器节点,好处是前端用户的session只在一个后端服务器节点上,不必考虑一个session存在多台服务器节点出现session贡献问题。
例如:因为weight是内置,所以可以直接和其他策略配合使用。
upstream backend {
ip_hash;
server 10.1.0.101;
server 10.1.0.102 weight=3;
server 10.1.0.103 weight=5;
}
0.1.4、最少连接数
- 基于最少连接的负载平衡是另一种简单的方法。顾名思义,此方法将请求定向到当时具有最少活动连接的服务器。对于请求有时可能需要更长时间才能完成的应用程序,它比循环法更有效。
upstream backend {
least_conn;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
0.2、扩展策略
0.2.1、url_hash策略
- 该策略将前端请求的url地址进行hash操作,根据hash结果将请求定向到同一后端服务器节点上,后台服务器为缓存是比较有效。一般url_hash需要配合缓冲命中来使用。
upstream backend {server 10.1.0.101;server 10.1.0.102;server 10.1.0.103;hash $request_uri;hash_method crc32;
}
0.2.2、fair策略
- 该策略请求转发到负载最小的后端服务器节点上。Nginx通过后端服务器节点对响应时间来判断负载情况,响应时间最短的节点负载就相对较轻,Nginx就会将前端请求转发到此后端服务器节点上。
upstream backend {server 10.1.0.101;server 10.1.0.102;server 10.1.0.103;fair;
}
0.2.3、Sticky策略
- 该策略在多台服务器的环境下,为了确保一个客户端只和一台服务器通讯,它会保持长连接,并在结束会话后再次选择一个服务器,保证了压力均衡。
- 注意:如果浏览器不支持cookie,那么sticky不生效,毕竟整个模块是给予cookie实现。Sticky模块和ip_hash模块不能够同时使用。
upstream backend {sticky;server 10.1.0.101;server 10.1.0.102;server 10.1.0.103;
}
upstream 参数说明
追加在upstream中server的ip配置后的参数:
- 1.down:表示当前的server暂时不参与负载
- 2.weight:默认为1.weight越大,负载的权重就越大。
- 3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
- 4.fail_timeout:max_fails次失败后,暂停的时间。
- 5.backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
- 6.keepalive:连接数(keepalive的值)指定了每个工作进程中保留的持续连接到nginx负载均衡器缓存的最大值。如果超过这个设置值的闲置进程想链接到nginx负载均衡器组,最先连接的将被关闭。
- 7.location对URL进行匹配.可以进行重定向或者进行新的代理负载均衡
注:nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
1、负载均衡实践
- 1.1、Nginx要实现负载均衡需要用到proxy_pass代理模块配置
- 1.2、Nginx负载均衡与Nginx代理不同地方在于,Nginx的一个location仅能代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池.
2、负载均衡配置模块(proxy_pass)
# ngx_http_upstream_module#语法
Syntax: upstream name { ... }
Default: —
Context: http#例子
upstream [连接池的名称] {[存放的IP]server [ip1]:[端口] [分发策略];server [ip2]:[端口] [分发策略];
}server {... ...location / {proxy_pass http://[连接池的名称] ;}
}
3、proxy_pass代理模块配置常用参数
3.1、添加发往后端服务器的请求头信息
语法: proxy_set_header field value;
默认: proxy_set_header Host $http_host;
proxy_set_header Connection close;
位置: http, server, location# 用户请求的时候HOST的值是game1.test.com, 那么代理服务会像后端传递请求的还是game1.test.com
proxy_set_header Host $http_host;# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
3.2、代理到后端的TCP连接、响应、返回等超时时间
#nginx代理与后端服务器连接超时时间(代理连接超时)
语法: proxy_connect_timeout time;
默认: proxy_connect_timeout 60s;
位置: http, server, location#nginx代理等待后端服务器的响应时间
语法: proxy_read_timeout time;
默认: proxy_read_timeout 60s;
位置: http, server, location#后端服务器数据回传给nginx代理超时时间
语法: proxy_send_timeout time;
默认: proxy_send_timeout 60s;
位置: http, server, location
3.3、proxy_buffer代理缓冲区
#nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
语法: proxy_buffering on | off;
默认: proxy_buffering on;
位置: http, server, location#设置nginx代理保存用户头信息的缓冲区大小
语法: proxy_buffer_size size;
默认: proxy_buffer_size 4k|8k;
位置: http, server, location#proxy_buffers 缓冲区
语法: proxy_buffers number size;
默认: proxy_buffers 8 4k|8k;
位置: http, server, location
3.4、实际负载均衡项目项目的参数配置
upstream load {server 39.108.93.110:80;server 47.75.66.116:80;
}server {server_name load.ifanatic.cn;listen 80;location / {proxy_pass http://load;# 用户请求的时候HOST的值是game1.test.com, 那么代理服务会像后端传递请求的还是game1.test.comproxy_set_header Host $http_host;# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ipproxy_set_header X-Real-IP $remote_addr;# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# nginx代理与后端服务器连接超时时间(代理连接超时)proxy_connect_timeout 10s;# nginx代理等待后端服务器的响应时间proxy_read_timeout 10s;# 后端服务器数据回传给nginx代理超时时间proxy_send_timeout 10s;# nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传>给客户proxy_buffering on;# 设置nginx代理保存用户头信息的缓冲区大小proxy_buffer_size 8k;# proxy_buffers 缓冲区proxy_buffers 8 8k;# 状态标记proxy_next_upstream http_404 http_500 http_502 http_503 http_504 http_403 http_429;}
}
4、 查看常用配置参数
cat /etc/nginx/proxy_paramsproxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;