Nginx 负载均衡
1.1 什么是负载均衡
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行。 我们在日常生活中经常免不了要去一些比较拥挤的地方,比如地铁站、火车站、电影院、银行等。无论是买票,还是排队入场,这些场所一般都会设置多个服务点或者入口的。如果没有人引导的话,大多数情况下,最近的入口会挤满人。而哪些距离较远的服务点或者入口就宽松很多。这种情况下,就会大大浪费资源,因为如果可以把这些排队的人很好的分散到各个入口的话会大大缩短排队时间。其实,网站的建设也是一样的。为了提升网站的服务能力,很多网站采用集群部署,就像话剧院有多个入口一样。这时候,就需要一个协调者,来均衡的分配这些用户的请求,可以让用户的可以均匀的分派到不同的服务器上。
1.2 Nginx 实现负载均衡
Nginx 的负载均衡功能依赖于 ngx_http_upstream_module模块,upstream 模块应该放于 http 模块内。Nginx 负载均衡策略主要有 热备、轮询、加权轮询、最少连接数以及 IP Hash。我们先来看看 upstream 怎么用。
http {
upstream myserver {
server http://47.103.4.205:3333;
server http://47.103.4.206:3333;
}
server {
location / {
proxy_pass myserver;
}
}
}
1.2.1 热备
如果有 2 台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。即有 A、B 两台服务器,正常情况都是 A 在工作,当 A 猝死,B 开始工作。
upstream myserver {
server http://47.103.4.205:3333;
// 备用需要加 backup
server http://47.103.4.206:3333 backup;
}
1.2.2 轮询
Nginx 默认就是轮询其权重都默认为 1,服务器处理请求就转圈来。即有 A、B、C 三台服务器,轮询状态 ABCABCABC 转圈工作。
upstream myserver {
server http://47.103.4.205:3333;
server http://47.103.4.206:3333;
server http://47.103.4.207:3333;
}
1.2.3 加权轮询
跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置则变为轮询。即有 A、B 两台服务器,A 的权重是 1,B 的权重是 2,则 A 工作一次,B 工作两次,ABBABB。
upstream myserver {
server http://47.103.4.205:3333 weight=1;
server http://47.103.4.206:3333 weight=2;
}
1.2.4 ip_hash
Nginx 会对客户端请求的 ip 进行 hash 操作,然后根据 hash 结果将同一个客户端 ip 的请求分发给同一台服务器进行处理。采用这种方式的原因是,当你服务端的一个特定 url 路径被同一个用户连续访问时,如果负载均衡策略还是轮询的话,那该用户的多次访问会被打到各台服务器上,这显然并不高效(会建立多次http链接等问题)。甚至考虑一种极端情况,用户需要分片上传文件到服务器下,然后再由服务器将分片合并,这时如果用户的请求到达了不同的服务器,那么分片将存储于不同的服务器目录中,导致无法将分片合并。采用 Nginx 提供的 ip_hash 策略。既能满足每个用户请求到同一台服务器,又能满足不同用户之间负载均衡。
upstream myserver {
server http://47.103.4.205:3333;
server http://47.103.4.206:3333;
ip_hash;
}
1.2.5 参数
down
:表示当前的 server 暂时不参与负载均衡。
backup
:预留的备份机。当其他所有的非 backup 机出现故障或者忙的时,才会请求 backup 机,因此这台机器的压力最轻。
max_fails
:允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
fail_timeout
:在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。
- Linux一键安装Transmission电影下载到服务器
- centos安装ab工具给网站进行压力测试
- ubuntu16.04安装mongodb教程
- linux压缩解压命令使用
- linux使用wc命令查看文件行数、字母、字节数命令
- 程序员偷偷深爱的 9 个不良编程习惯
- 低级程序员和高级程序员的区别
- Silverlight学习(二)
- Silverlight学习(三)
- ArcGIS for Android学习(一)
- Arcgis for Silverlight学习(一)
- ImageButton与Button
- RadioButton、CheckBox与ToggleButton
- Silverlight学习(五)图形标绘
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法