1. 概述
Nginx 是一种 web 服务器,基于 rest 架构风格,以统一资源描述符 URI 或统一资源定位符 URL 作为沟通依据,通过 HTTP 协议提供各种网络服务。
优秀的设计给 Nginx 带来极大的稳定性:
- Nginx 由 C 语言开发,是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上
- Nginx 的使用基于事件驱动架构,使得其可以支持数以百万级别的 TCP 连接
- 高度的模块化和自由如那件许可证使得第三方模块层出不穷
2. Nginx 的用途
Nginx 的有许多方面的用途:
- Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器,它可以作为一个 HTTP 服务器进行网站的发布处理,也可以作为反向代理进行负载均衡的实现。
- Nginx 也是一个 IMAP、POP3、SMTP 代理服务器
2.1 代理
代理:一个代表、一个渠道。
代理过程:被代理角色通过代理访问目标角色完成一些任务的过程。比如客人到 adidas 专卖店购买商品,则厂家就是被代理角色、专卖店是代理、客人是目标角色,任务便是售卖商品。
2.2 正向代理
正向代理:
- 客户端非常明确要访问的服务器地址
- 服务器只知道请求来自哪个代理服务器,而不清楚来自哪个具体的客户端
- 正向代理屏蔽或隐藏了真实客户端的信息
正向代理的过程:
- 正向代理,“它代理的是客户端,代客户端发出请求”,是一个位于客户端和原始服务器之间的服务器
- 为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端
- 客户端必须设置正向代理服务器,才能使用正向代理,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口
正向代理的用途:
- 访问原来无法访问的资源,如 Google
- 可以做缓存,加速访问资源
- 对客户端访问授权,上网进行认证
- 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
2.3 反向代理
反向代理:
- 反向代理可以实现分布式的集群操作
- 客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因此客户端不需要任何配置就可以访问。
反向代理的过程:
- 反向代理,“它代理的是服务端,代服务端接收请求”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
- 多个客户端给服务器发送的请求,Nginx 服务器接收到之后,按照一定的规则分发给后端的业务处理服务器进行处理
反向代理的用途:
- 保证内网的安全,通常将反向代理作为公网访问地址,web 服务器是内网
- 负载均衡,通过反向代理服务器来优化网站的负载
2.4 项目场景
在真实的项目中,正向代理和反向代理可能会出现在同一个应用场景中:
- 正向代理服务器代理客户端发出请求去访问目标服务器
- 目标服务器是一个反向代理服务器,负责将任务分发给多台业务处理服务器
2.5 负载均衡
了解概念:
- 负载量:客户端发送的、Nginx 反向代理服务器接收到的请求数量
- 均衡规则:请求数量按照一定的规则进行分发到不同的服务器处理的规则
- 负载均衡:将服务器接收到的请求按照规则分发的过程
- 硬件负载均衡:成本高但数据的稳定性和安全性较好
- 软件负载均衡:利用现有的技术结合主机硬件实现的一种消息队列分发机制
Nginx 支持的负载均衡调度算法:
- weight轮询(默认,常用,具有HA功效!):接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
- ip_hash(常用):每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,这也在一定程度上解决了集群部署环境下 session 共享的问题(什么问题,不了解)。
- fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是 Nginx 默认不支持 fair 算法,如果要使用这种调度算法,请安装 upstream_fair 模块。
- url_hash:每个请求按访问的 url 的 hash 结果分配,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意 Nginx 默认不支持这种调度算法,要使用的话需要安装 Nginx 的 hash 软件包。
参考:Nginx 相关介绍