干货 | Nginx负载均衡原理及配置实例
一个执着于技术的公众号
Nginx系列导读
前言
nginx
Nginx是一款高性能的http 服务器
/反向代理服务器
及电子邮件
(IMAP/POP3)代理服务器。官方测试nginx能够支撑5万
并发连接,并且cpu、内存等资源消耗却非常低,运行非常稳定。
负载均衡
什么是负载均衡,单从字面理解可以解释为N台服务器平均分担负载,不会因为某台服务器负载高宕机而出现某台服务器闲置的情况。那么负载均衡的前提就是要有多台服务器才能实现,目的是达到整个系统的高性能和高可用性。
1、Nginx负载均衡介绍
反向代理与负载均衡概念简介
严格地说,Nginx
仅仅是作为Nginx Proxy反向代理
使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果,所以本文称之为Nginx负载均衡。那么,反向代理和负载均衡有什么区别呢?
普通负载均衡软件,例如大名鼎鼎的LVS,其实功能只是对请求数据包的转发(也可能会改写数据包)、传递。其中DR模式明显的特征是:从负载均衡下面的节点服务器来看,接收到的请求还是来自访问负载均衡器的客户端的真实用户。
而反向代理就不一样了,反向代理接收访问用户的请求后,会代理用户重新发起请求代理下的节点服务器,最后把数据返回给客户端用户,在节点服务器看来,访问的节点服务器的客户端用户就是反向代理服务器了,而非真实的网站访问用户。
一句话,LVS等的负载均衡是转发用户请求的数据包,而Nginx反向代理是接收用户的请求后,会代理用户重新发起请求代理下的节点服务器。
2、Nginx负载均衡组件模块
实现Nginx负载均衡的组件主要有两个:
ngx_http_upstream_module
负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查
ngx_http_proxy_module
proxy代理模块,用于把请求转发给服务器节点或upstream服务器池
2.1、upstream模块
(1)upstream模块介绍
upstream模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应upstream组的名字上,具体写法为:
proxy_pass http://server_pools
其中server_pools就是一个upstream节点服务器组名字。
(2)upstream配置案例
范例1:基本的upstream配置案例:
upstream server_pools {
# upstream是关键字必须有,后面的server_pools是upstream集群组的名字,可自定义名称,调用时就用这个名字。
server 192.168.1.251:80 weight=5;
server 192.168.1.252:80 weight=10;
server 192.168.1.253:80 weight=15;
# server关键字是固定的,后面可以接域名或IP。如果不指定端口,默认是80端口。weight代表权重,数值越大被分配的请求越多。
}
范例2:较完整的upstream配置案例:
upstream blog__pools {
server 192.168.0.223; #这行标签和下行是等价的
server 192.168.0.224:80 weight=1 max_fails=1 fail_timeout=10s; #这行标签和上一行是等价的,此行多余的部分就是默认配置,不写也可以。
server 192.168.0.225:80 weight=1 max_fails=2 fail_timeout=20s backup;
# server最后面可以加很多参数,具体参数作用看下文
}
(3)upstream模块参数
server
负载后面的RS配置,可以是ip或者域名。
weight
请求服务器的权重。默认值为1,越大表示接受的请求比例越大。
max_fails
nginx 尝试连接后端主机失败的次数。
这个数值需配合proxy_net_upstream
,fastcgi_next_upstream
和memcached_next_upstream
这三个参数来使用的。
当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404,502,503
fail_timeout
在max_fails
定义的失败次数后,距离下次检查的时间间隔,默认10s
backup
热备配置,标志这台服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求
down
表示这个服务器永不可用,可配合ip_hash使用
范例:
upstream web_pools {
server linux.example.com weight=5;
server 127.0.0.1:8080 max_fail=5 fail_timeout=10s;
# 当5次连续检查失败后,间隔10s后重新检测。
server linux.example.com:8080 backup;
# 指定备份服务器。作用:等上面服务器全部不可访问时就向它转发请求。
}
2.2、http_proxy_module模块
(1)proxy_pass指令介绍
proxy_pass
指令属于ngx_http_proxy_module
模块,此模块可以将请求转发到另一台服务器上。在实际的反向代理工作中,会通过location
功能匹配指定的URI,然后把接收到的符合匹配URI
的请求通过proxy_pass
抛给定义好的upstream
节点池。
location内容,参考:一文彻底读懂nginx中的location指令
(2)proxy_pass的使用案例
location /web/ {
proxy_pass http://127.0.0.1/abc/;
}
将匹配URI为web的请求抛给http://127.0.0.1/abc/
(3)http proxy模块参数
proxy_set_header
设置http请求header项传给后端服务器节点。例如,可以实现让代理后端的服务器节点获取访问客户端用户真实的IP地址
client_body_buffer_size
用于指定客户端请求主题缓冲区大小
proxy_connect_timeout
表示反向代理与后端节点服务器连接的超时时间,即发起握手等候响应的超时时间
proxy_send_timeout
表示代理后端服务器的数据回传时间,即在规定时间之内,后端服务器必须传完所有的数据,否则,nginx将断开这个连接
proxy_read_timeout
设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的响应时间,其实是nginx在后端排队等候处理的时间
proxy_buffer_size
设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小
proxy_buffers
设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会放置在缓冲区
proxy_busy_buffers_size
用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_bufer*2
proxy_temp_file_write_size
指定proxy缓存临时文件的大小
3、Nginx负载均衡调度算法
(1)rr轮询(默认)
默认调度算法,按照客户端请求逐一分配到不同的后端服务器,宕机的服务器会自动从节点服务器池中剔除。
upstream server_pools {
server 192.168.1.251;
server 192.168.1.252;
}
注意:对于服务器
性能不同
的集群,该算法容易引发资源分配不合理
等问题。
(2)wrr加权轮询(weight)
在rr轮询算法的基础上加上权重,权重和用户访问成正比,权重值越大,被转发的请求也就越多
upstream server_pools {
server 192.168.1.251 weight=5;
server 192.168.1.252 weight=10;
}
加权轮询应用于服务器性能不等的集群中,使资源分配更加合理化。
(3)ip_hash(会话保持)
每个请求按访问 IP 的hash
结果分配,每个访客固定访问一个后端服务器,可解决session
不共享的问题。
upstream server_pools {
ip_hash;
server 192.168.1.251;
server 192.168.1.252;
}
Session 不共享是说,假设用户已经登录过,此时发出的请求被分配到了 A 服务器,但 A 服务器突然宕机,用户的请求则会被转发到 B 服务器。但由于 Session 不共享,B 无法直接读取用户的登录信息来继续执行其他操作。
(4)fair(动态调度算法)
根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pools {
server 192.168.1.251;
server 192.168.1.252;
fair;
}
这是更加智能的调度算法,但Nginx
本身不支持
fair调度算法。如果需要使用fair调度,必须下载Nginx相关模块upstream_fair
。
(5)url_hash算法(web缓存节点)
根据访问URL的hash结果来分配请求,让每个URL定向到同一个后端服务器。
upstream server_pools {
server qll:9001;
server qll:9002;
hash $request_uri;
hash_method crc32;
}
同样,Nginx本身是不支持url_hash,如果需要使用这种调度算法,必须安装Nginx的hash模块软件包。
4、Nginx负载均衡配置实例
(1)实现效果
在浏览器上输入地址http://www.qll.com
,实现负载均衡效果(平均访问到两台服务器)
(2)准备工作
a)准备3台nginx服务器,如下:
主机名 | IP地址 | 角色说明 |
---|---|---|
web01 | 10.43.187.251 | nginx web01服务器 |
web02 | 10.43.187.252 | nginx web01服务器 |
lb | 10.43.187.253 | nginx 负载均衡服务器 |
b)三台服务器均安装nginx
安装nginx,参考:Nginx编译安装及常用命令
c)配置用于测试的Web服务
注意:本小节是在
两台Nginx Web
服务器上操作
[root@web01 nginx]# cat conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_www.log main;
}
}
创建测试文件数据
[root@web01 ~]# cd /usr/local/nginx/html/
[root@web01 html]# mkdir www
[root@web01 www]# echo "`hostname -I` www" > index.html
查看创建的文件内容:
[root@qll251 www]# cat index.html
10.43.187.251 www
别忘记启动nginx服务哦
d)配置nginx 负载均衡服务器
[root@lb01 nginx]# cat conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream www_server_pools { #这里定义Web服务器池,包含了251,252两个Web节点
server 10.43.187.251:80 weight=1;
server 10.43.187.252:80 weight=1;
}
server { #这里定义代理的负载均衡域名虚拟主机
listen 80;
server_name www.qll.com;
location / {
proxy_pass http://www_server_pools; #访问www.qll.com,请求发送给www_server_pools里面的节点
}
}
}
e)域名解析
由于不是真实环境,域名使用www.qll.com
用作测试,所以www.qll.com的解析只能在hosts文件设置。
打开:
C:\Windows\System32\drivers\etc\hosts
在末尾添加:
10.43.187.253 www.qll.com
(3)测试验证
打开浏览器访问www.qll.com
,不断刷新会发现所有请求被负载均衡器(10.43.187.253)均分配到web01(10.43.187.251)和web02(10.43.187.252)上,实现了负载均衡的效果。
结语
如果您觉得看完本文后有所收获, 还希望您随手帮忙点个在看
、或者分享转发
。您的支持是我坚持分享的最大动力!
往期精彩
◆ LVM逻辑卷学习
干货 | Nginx负载均衡原理及配置实例的更多相关文章
- Nginx进阶使用-负载均衡原理及配置实例
介绍 跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术.可以将Nginx用作非常有效的HTTP负载平衡器,以将流量分配到多个应用程序服务器,并使用N ...
- Nginx 负载均衡原理简介与负载均衡配置详解
Nginx负载均衡原理简介与负载均衡配置详解 by:授客 QQ:1033553122 测试环境 nginx-1.10.0 负载均衡原理 客户端向反向代理发送请求,接着反向代理根据某种负载机制 ...
- 搞懂分布式技术9:Nginx负载均衡原理与实践
搞懂分布式技术9:Nginx负载均衡原理与实践 本篇摘自<亿级流量网站架构核心技术>第二章 Nginx负载均衡与反向代理 部分内容. 当我们的应用单实例不能支撑用户请求时,此时就需要扩容, ...
- nginx负载均衡之入门配置
先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况.那么负载均衡的前提就是要有多台服务器才能实现,也就是两台以上 ...
- Nginx记录-nginx 负载均衡5种配置方式(转载)
nginx 负载均衡5种配置方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成 ...
- nginx 负载均衡5种配置方式
nginx 负载均衡5种配置方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成正比, ...
- Nginx几种负载均衡算法及配置实例
本文装载自: https://yq.aliyun.com/articles/114683 Nginx负载均衡(工作在七层"应用层")功能主要是通过upstream模块实现,Ngin ...
- [转]Nginx负载均衡原理初解
什么是负载均衡 我们知道单台服务器的性能是有上限的,当流量很大时,就需要使用多台服务器来共同提供服务,这就是所谓的集群. 负载均衡服务器,就是用来把经过它的流量,按照某种方法,分配到集群中的各台服务器 ...
- nginx负载均衡tomcat和配置ssl
目录 tomcat 组件功能 engine host context connector service server valve logger realm UserDatabaseRealm 工作流 ...
随机推荐
- jvm-learning-运行时数据区-整体
在jdk8之后之前的方法区有叫做元数据. 每个JVM只有一个Runtime实例,即为运行时环境,相当于内存结构种的运行时数据区 线程 线程是一个程序里的运行单元,JVM允许一个应用有多个线程并行的执行 ...
- 学习Cobbler(二)
Server端: 第一步,启动Cobbler服务 第二步,进行Cobbler错误检查,执行cobbler check命令 第三步,进行配置同步,执行cobbler sync命令 第四步,复制相关启动文 ...
- .NET面试题整理
.NET..NET Framework..NET Core和C#的解释各是什么? ASP.NET MVC和ASP.NET Web API的区别是什么? C#中的委托是什么?事件是不是一种委托? 简述P ...
- vue H5 超简单的swiper制作抖音上拉切换视频播放
-----html部分------ <swiper vertical :style="{height: windowheight+'px',width:375+'px'}" ...
- Django ElasticSearch Ionic 打造 GIS 移动应用 —— 架构设计
搜索引擎是个好东西,GIS也是个好东西.当前还有Django和Ionic.最后效果图 构架设计 对我们的需求进行简要的思考后,设计出了下面的一些简单的架构. GIS架构说明 -- 服务端 简单说明: ...
- Issues with position fixed & scroll(移动端 fixed 和 scroll 问题)
转载请注明英文原文及译文出处 原文地址:Issues with position fixed & scrolling on iOS 原文作者:Remy Sharp译文地址:移动端 fixed ...
- npx和npm的区别
npx 是 npm 的高级版本,npx 具有更强大的功能. 用途: 在项目中直接运行指令,直接运行node_modules中的某个指令,不需要输入文件路径 node-modules/.bin/babe ...
- Input框搜索关键字高亮显示
ruleTitle(text, val) { if (!val) return text; const result = text.replace( new RegExp(val, "g&q ...
- python并发——生产者消费者信号量实现
介绍 写扫描器的时候,需要让资产扫描结果一出来(生产者),另外一边就会开个线程去运行漏洞扫描(消费者). 但是又不能让结果没出来,另外一边消费者就开始干活了. 代码 # *coding:UTF-8 * ...
- MySQL---什么是事务
什么是事务 一个数据库事务通常包含对数据库进行读或写的一个操作序列.它的存在包含有以下两个目的: 为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方 ...