Nginx 是后端工程师和运维工程师,以及前端工程师必须要掌握的必备技能,尤其在分布式系统应用越来越广泛的今天,Nginx 已经占据了 Web 服务器的大壁江山,并且还在不断地增长,比如国内的 BATJ、网易、新浪等公司都可以看到它的身影。Nginx 的负载均衡模式有哪些?它的实现原理是什么?
什么是Nginx?
Nginx 是一款开源的高性能轻量级 Web 服务器(也叫 HTTP 服务器),它主要提供的功能是:反向代理、负载均衡和HTTP 缓存。它于 2004 年首次公开发布,2011 年成立同名公司以提供支持,2019 年 3 月被 F5 Networks 以 6.7 亿美元收购。
之所以需要使用负载均衡是因为,如果我们使用的是一台服务器,那么在高峰期时很多用户就需要排队等待系统响应,因为一台服务器能处理的并发数是固定的。例如,一个 Tomcat 在默认情况下只能开启 150 个线程(Tomcat 8.5.x 版本)来处理并发任务,如果并发数超过了最大线程数,那么新来的请求就只能排队等待处理了,如下图所示:
然而如果有负载均衡的话,我们就可以将所有的请求分配到不同的服务器上。假如 1 台服务器可以处理 2000 个请求,那么 5 台服务器就可以处理 10000 个请求了,这样就大大提高了系统处理业务的能力,如下图所示:
知道了负载均衡的好处之后,我们来看下 Nginx 负载均衡的功能。
Nginx 主要的负载均衡策略(内置的负载均衡)有以下四种:
- 轮询策略(默认负载均衡策略)
- 最少连接数负载均衡策略
- ip-hash 负载均衡策略
- 权重负载均衡策略
轮循策略
轮询负载策略是指每次将请求按顺序轮流发送至相应的服务器上,它的配置示例如下所示:
在以上实例中,当我们使用“ip:80/”访问时,请求就会轮询的发送至上面配置的三台服务器上。
Nginx 可以实现 HTTP、HTTPS、FastCGI、uwsgi、SCGI、memcached 和 gRPC 的负载均衡。
最少连接数负载均衡策略
此策略是指每次将请求分发到当前连接数最少的服务器上,也就是 Nginx 会将请求试图转发给相对空闲的服务器以实现负载平衡,它的配置示例如下:
ip-hash 负载均衡策略
以上三种负载均衡的配置策略都不能保证将每个客户端的请求固定的分配到一台服务器上。假如用户的登录信息是保存在单台服务器上的,而不是保存在类似于 Redis 这样的第三方中间件上时,如果不能将每个客户端的请求固定的分配到一台服务器上,就会导致用户的登录信息丢失。因此用户在每次请求服务器时都需要进行登录验证,这样显然是不合理的,也是不能被用户所接受的,所以在特殊情况下我们就需要使用 ip-hash 的负载均衡策略。
ip-hash 负载均衡策略可以根据客户端的 IP,将其固定的分配到相应的服务器上,它的配置示例如下:
Nginx 的实现原理是,首先客户端通过访问域名地址发出 HTTP 请求,访问的域名会被 DNS 服务器解析为 Nginx 的 IP 地址,然后将请求转发至 Nginx 服务器,Nginx 接收到请求之后会通过 URL 地址和负载均衡的配置,匹配到配置的代理服务器,然后将请求转发给代理服务器,代理服务器拿到请求之后将处理结果返回给 Nginx,Nginx 再将结果返回给客户端,这样就完成了一次正常的 HTTP 交互。
加权负载均衡
以上配置表示,5 次请求中有 3 次请求会分发给 srv1,1 次请求会分发给 srv2,另外 1 次请求会分发给 srv3。
Nginx 的四种内置负载均衡的执行策略:轮询策略(默认负载均衡策略)、最少连接数负载均衡策略、ip-hash 负载均衡策略和权重负载均衡策略,其中 ip-hash 的负载均衡策略会将客户端的请求固定分发到一台服务器上。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。