Nginx的upstream支持如下六种方式的分配算法,分别是:
是upstream模块负载均衡默认的策略。每个请求会按时间顺序逐个分配到不同的后端服务器。轮询不需要额外的配置。
upstream backend{ server 192.168.1.100:9001 weight=1; server 192.168.1.100:9002; server 192.168.1.100:9003; } server { listen 8083; server_name localhost; location /{ proxy_pass http://backend; } }weight加权[加权轮询]
weight=number:用来设置服务器的权重,默认为1,权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所有此策略比较适合服务器的硬件配置差别比较大的情况。
upstream backend{ server 192.168.1.100:9001 weight=10; server 192.168.1.100:9002 weight=5; server 192.168.1.100:9003 weight=3; } server { listen 8083; server_name localhost; location /{ proxy_pass http://backend; } }ip_hash
当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。这样,当来自某一个IP的用户在后端Web服务器A上登录后,在访问该站点的其他URL,能保证其访问的还是后端web服务器A。
upstream backend{ ip_hash; server 192.168.1.100:9001; server 192.168.1.100:9002; server 192.168.1.100:9003; } server { listen 8083; server_name localhost; location /{ proxy_pass http://backend; } }
需要额外多说一点的是使用ip_hash指令无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到的请求多,有些后端服务器接收的请求少,而且设置后端服务器权重等方法将不起作用。可以采用redis来存储session。
least_conn最少连接,把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
upstream backend{ least_conn; server 192.168.1.100:9001; server 192.168.1.100:9002; server 192.168.1.100:9003; } server { listen 8083; server_name localhost; location /{ proxy_pass http://backend; } }
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
url_hash按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。
upstream backend{ hash &request_uri; server 192.168.1.100:9001; server 192.168.1.100:9002; server 192.168.1.100:9003; } server { listen 8083; server_name localhost; location /{ proxy_pass http://backend; } }fair
fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。那么如何使用第三方模块的fair负载均衡策略。
upstream backend{ fair; server 192.168.1.100:9001; server 192.168.1.100:9002; server 192.168.1.100:9003; } server { listen 8083; server_name localhost; location /{ proxy_pass http://backend; } }
但是如何直接使用会报错,因为fair属于第三方模块实现的负载均衡。需要添加nginx-upstream-fair ,如何添加对应的模块:
1.下载nginx-upstream-fair模块
下载地址为: https://github.com/gnosek/nginx-upstream-fair
2.将下载的文件上传到服务器并进行解压缩
unzip nginx-upstream-fair-master.zip
3.重命名资源
mv nginx-upstream-fair-master fair
4.使用./configure命令将资源添加到Nginx模块中
./configure --add-module=/root/fair
5.编译
make
编译可能会出现如下错误,ngx_http_upstream_srv_conf_t结构中缺少default_port
解决方案:
在Nginx的源码中 src/http/ngx_http_upstream.h,找到ngx_http_upstream_srv_conf_s,在模块中添加添加default_port属性
in_port_t default_port
然后再进行make.
6.更新nginx
6.1将sbin目录下的nginx进行备份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
6.2将安装目录下的objs中的nginx拷贝到sbin目录
cd objs cp nginx /usr/local/nginx/sbin
6.3更新nginx
cd ../ make upgrade
7.编译测试使用Nginx
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)