Nginx入门

110 阅读11分钟

引入

当前Web系统大多采用B/S(浏览器--服务器)架构,浏览器端与服务器端采用HTTP协议进行通信。

image.png

随着业务增长,上述架构可能会存在的问题:

  • 单台服务器的性能有限 --> 服务器无法满足需求,可能会造成频繁宕机;
  • 后端的节点宕机后 --> 整个系统瘫痪。

针对于上述问题的解决方案:加机器(部署多个节点-->集群)

image.png

部署多个节点可能会造成的两个问题:

  • 用户无法确定自己要访问的是哪台机器 --> 【转发请求】
  • 期望能者多劳(性能高的服务器处理更多请求) / 太忙 or 太闲( 某个节点被频繁访问,但另外的节点持续空闲,造成 特别忙 或者 特别闲的情况) --> 【负载均衡】

解决方案:架构上加一层中间层完成上述两个功能。

image.png

Nginx能够同时满足这两个需求,并且还能实现其他功能满足开发过程中的更多需求,如:动静分离,网站安全,服务高可用等。

Nginx

1. Nginx概述

1.1 Nginx是什么?

Nginx是一个轻量级的高性能Web服务器,同时它也是一个通用类型的代理服务器,支持绝大部分协议,如TCP,UDP,HTTPs,SMTP等,能够用来负载均衡与请求分发(反向代理)

使用Nginx前:

image.png

使用Nginx后:

image.png

原本客户端直接请求目标服务器,由目标服务器直接完成请求处理工作。加入Nginx后,所有的请求会先经过Nginx,再由Nginx将请求分发到具体的服务器,服务器得出的结果返回给Nginx,最后由Nginx把最后结果返回给客户端。

1.2 Nginx安装目录及含义

image.png

1.3 nginx.conf文件

整个文件由一个个指令块组成,配置时在块内编辑

image.png

2. 为什么使用Nginx

  • 处理响应请求快(异步非阻塞IO,零拷贝,mmap,缓存机制)
  • 扩展性好(模块化设计)
  • 内存占用少(异步非阻塞,多阶段处理)
  • 可靠性高(头部公司用)
  • 热部署
  • 高并发能力强(事件驱动模型,多进程机制)
  • 开源

image.png

3. Nginx具体应用

3.1 负载均衡

3.1.1 为什么需要负载均衡?

集群部署存在的两个问题:

  • 某个节点被频繁访问,但另外的节点持续空闲,造成特别忙或者特别闲的情况;
  • 期望性能高的服务器能够处理更多请求。

因此需要引入负载均衡的技术,这样做的好处:

  • 高可用:某节点宕机后可以迅速将流量转移至其他节点
  • 高性能:多台服务器共同提供服务,整个系统吞吐的规模更大(处理的请求更多)
  • 拓展性:业务 增长/ 下降 --> 灵活增加 / 减少 节点(弹性)

image.png

3.1.2 负载均衡方案

主流负载均衡方案:

  • 硬件层面:采用硬件负载器 --> 贵
  • 软件层面:Nginx --> 开源从【成本】方面 以及 业务场景权衡,采用Nginx能够满足业务场景。

3.1.3 常见负载均衡算法

  • 轮询:服务器会被按照顺序选择。 image.png
  • 加权轮询:给服务器赋不同的权重,权重越高,被访问的概率越大。

image.png

  • IP hash:根据请求源的IP来决定分发给哪个服务器,这样能够保证特定的用户会一直访问相同的服务器,解决了session共享的问题。

image.png

  • 最小连接:选择当前连接最少的服务器。

其中轮询,加权轮询,IP hash为Nginx的内置策略。

3.1.4 如何使用Nginx实现负载均衡?

对于Nginx来说,负载均衡就是从upstream模块定义的后端服务器列表中按照配置的负载策略选取一台服务器接受用户的请求。

image.png

3.2 反向代理 (转发请求)

3.2.1 为什么需要反向代理?

用户访问服务,并不知道服务具体部署在哪几台服务器,所以需要一个“代理”角色,用户直接访问代理服务器就可以获得目标服务器的资源,代理服务器负责将请求转发给目标服务器,这样用户无需知道目标服务器的具体地址便可以直接访问。

3.2.2 正向代理与反向代理

  • 正向代理:服务器不知道客户端是谁,如:VPN

image.png

  • 反向代理:客户端不知道服务器是谁

image.png

3.2.3 如何使用Nginx实现反向代理?

image.png

3.2.4 Nginx反向代理处理流程

image.png

3.3 动静分离

3.3.1 静态资源与动态资源

服务器上的资源分为动态资源和静态资源。

  • 静态资源:html/css/javaSript,也就是对于每个用户来说,返回的内容都一样;
  • 动态资源:根据不同用户返回的资源不同,资源动态改变。

3.3.2 为什么需要动静分离?

Web系统中由大量的静态资源,而且静态资源访问比较频繁,如果都放到后端服务,后端服务压力比较大。

因此可以将不常修改的静态资源文件放到Nginx的静态资源目录中,这样在访问静态资源时直接读取Nginx服务器本地文件目录之后返回。这样做的两个好处:

  • 减少了后端服务压力;
  • 提升了静态资源的访问速度

动静分离指的是:将不常修改且访问频繁的静态文件放到Nginx本地静态目录,将变动频繁/实时性比较高的资源,如:后端接口,实施转发到对应的后台服务。

image.png

3.3.4 如何使用Nginx实现动静分离?

image.png

3.3.5 Nginx动静分离访问流程

image.png

3.4 资源压缩

3.4.1 为什么需要资源压缩?

建立在动静分离的基础上,如果一个静态资源的越小,传输速度更快,也会更节省带宽,因此部署项目时,可以通过Nginx对静态资源实现压缩传输,这样做的两个好处:

  • 节省带宽资源;
  • 加快响应速度并提升系统整体吞吐。

3.4.2 如何使用Nginx实现资源压缩?

image.png

压缩前后结果对比 image.png

3.5 缓冲区

3.5.1 为什么需要缓冲区?

接入Nginx项目的一般请求流程为:客户端-->Nginx-->服务端。这个过程中存在两个连接:

  • 客户端 --> Nginx
  • Nginx --> 服务端

如果说浏览器的加载速度跟不上服务端的响应速度,那么这两个不同的连接速度不一致就会影响用户的体验。因此为了解决两个连接之间速度不匹配造成的问题,Nginx提供了缓冲区机制。

有了缓冲后,Nginx代理可以暂存后端响应,按需给客户端提供数据。

3.5.2 如何使用Nginx实现缓冲区?

image.png

3.6 缓存机制

3.6.1 为什么需要缓存机制?

使用缓存机制,能够提升性能,有以下好处:

  • 减少了再次向后端或文件服务器请求资源的带宽消耗。
  • 降低了下游服务器的访问压力,提升系统整体吞吐。
  • 缩短了响应时间,提升了加载速度,打开页面的速度更快。

Nginx缓存属于代理缓存的一种。

3.6.2 如何使用Ngnix实现缓存机制?

image.png

3.7 IP黑白名单

  • allow:配置白名单
  • deny:配置黑名单

3.8 跨域配置

3.8.1 什么是跨域问题?

目前系统基本上采用前后端分离的方式,所以会导致前端工程与后端工程端口号不同,由于浏览器的同源策略会造成数据不显示,这就是跨域问题(CORS,Cross-Origin Resource Sharing)。

什么是同源策略呢?HTTP是无状态协议,因此通常会借助cookie来实现对当前状态的信息记录,如:用户的身份,密码等,一旦cookie被共享,可能会造成用户的信息被盗取。同源策略指的是:协议 + 域名 + 端口相同的两个请求,可以被看作是同源的,如果其中任意一点存在不同,则代表是两个不同源的请求,同源策略会限制不同源之间的资源交互。

3.8.2 解决跨域方案

  • 前端
  • 后端
  • 代理,如:Nginx

3.8.3 如何使用Nginx解决跨域问题?

image.png

3.9 重试机制

重试是在发生错误时一种不可缺少的手段,当一个服务或几个服务宕机时,如果有正常服务,那么将请求重试到正常服务的机器上。 image.png

4. Nginx与API网关

4.1 什么是API网关?

网关是系统的唯一对外的入口,介于客户端和服务端之间的中间层,用于处理非业务功能,实际上是对微服务的一种保护。两个核心功能:

  • 路由转发:接收外界请求,通过网关将相应请求转发到后端对应的微服务上;
  • 过滤器:实现鉴权、监控、缓存、限流等功能

4.2 为什么要使用API网关?

一个系统后端多个微服务根据业务进行划分,用户对后端微服务的划分是不清楚的,如果用户在使用某个功能时,需要明确自己要访问的微服务地址,显然是不合理的。总结来说,如果没有网关的架构存在以下问题:

  • 一个功能的完成可能涉及到多个微服务,如果涉及到的微服务都需要客户端手动访问,增加了客户端的复杂度;
  • 可能会存在跨域请求问题,处理比较复杂;
  • 涉及到微服务的认证问题,每个微服务都需要进行单独认证。

引入网关后,一方面,网关会根据实际请求去访问不同的微服务,用户只需要和网关交互即可;另一方面,所有的认证都在网关进行统一认证,解决了认证困难问题;最后,能够通过网关对所有微服务进行监控,实时掌握各个微服务的运行状况,便于管理。

4.3 API网关与Nginx的区别是什么?

Nginx与API网关都可以实现请求转发,在具体架构设计时Nginx做负载均衡时,考虑到API网关在系统中不止一个(以集群的方式做高可用),通常可以将Nginx至于API网关前,负责对API网关的负载均衡,然后再由网关决定进入根据判定到哪个真实的web 服务器。 让两者的分工更加明确,也就是:API网关聚合服务,Nginx请求转发

image.png

  • 业务网关(gateway) :对于具体的后端业务应用或者是服务和业务有一定关联性的策略网关。业务网关针对具体的业务需要提供特定的流控策略、缓存策略、鉴权认证策略。
  • 流量网关(Nginx) :与业务网关相反,定义全局性的、跟具体的后端业务应用和服务完全无关的策略网关。流量网关通常只专注于全局的Api管理策略,比如全局流量监控、日志记录、全局限流、黑白名单控制、接入请求到业务系统的负载均衡等。

业务网关一般部署在流量网关之后、业务系统之前,比流量网关更靠近业务系统。通常API网指的是业务网关。 有时候我们也会模糊流量网关和业务网关,让一个网关承担所有的工作,所以这两者之间并没有严格的界线。

image.png

补充知识点

负载均衡相关知识点

image.png

Web容器 / Web服务器

  • Web服务器(Web Server) / HTTP服务器一种对外提供 Web 服务的软件,它可以接收浏览器的 HTTP 请求,并将处理结果返回给浏览器。功能单一,只能提供 http(s) 服务,让用户访问静态资源(HTML 文档、图片、CSS 文件、JavaScript 文件等),它们不能执行任何编程语言,也不能访问数据库,更不能让用户注册和登录

如果只有 Web 服务器,只能部署静态网站,不能部署动态网站。

要想部署动态网站,必须要有编程语言运行环境(运行时,Runtime) 的和数据库管理系统的支持。

  • Web容器(Web Container):Tomcat / JBos* s*Web容器是一种服务器程序,在服务器端口就有一个提供相应服务的程序。这就是为什么Tomcat有默认的端口——8080。一个服务器可以有多个容器

Web容器 = Web服务器(静态) + Servlet容器(动态)

image.png

参考资料

juejin.cn/post/730604…【Nginx】

juejin.cn/post/711282…【Nginx】

zhuanlan.zhihu.com/p/34943332【Nginx】

juejin.cn/post/694260…【Nginx详细配置】

mp.weixin.qq.com/s/D-YnmePJs…【Nginx】

developer.aliyun.com/article/100…【网关与nginx】

cloud.tencent.com/developer/a…

【网关与nginx】

zhuanlan.zhihu.com/p/590087133【网关与Nginx】

juejin.cn/post/718758…【网关】

juejin.cn/post/684490…【负载均衡】

zhuanlan.zhihu.com/p/32841479【负载均衡】

developer.aliyun.com/article/117…【web容器,http服务器区别】