文章目录
概述
一、nginx是一款轻量级的web服务器/反向代理服务器及电子邮件imap/pop3/smtp服务器,在bsd-like协议下发行。其特点是占有内存少,并发能力强。
二、核心应用场景:
- 高性能的静态web服务器:只能处理静态资源
静态资源:图片、样式、flash等不会随着用户的请求改变而改变的资源
动态资源:账户余额、商品剩余货源等,这些依赖于后端应用服务器在数据库查询、处理后返回的结果
- 反向代理:客户端点击一个网页后,本质上是向nginx发送了一个http/https请求,nginx可以将静态资源返回客户端,虽然nginx无法返回动态资源,但是他可以将请求代理的发送给后端的应用服务器,由应用服务器查询数据库并处理完数据后返回给nginx,nginx将动态资源、静态资源通过http/https返回给客户端,由客户端在浏览器展示。在这个过程中,对于动态资源来说,nginx就是一个反向代理,反向代理的过程中就有负载均衡,比如在应用服务器是多台的情况下,nginx能够将这些请求负载均衡的以此转发给每个应用服务器。后面讲到的限速、动静分离都是nginx的辅助能力
应用服务器:有很多种类型,如果后端是基于Java开发的,那么应用服务器可能是tomcat,还有些商用的应用服务器:weblogic
三、nginx为什么出现并流行:
主要应用场景
一、一个http请求的全流程
用户在浏览器上输入一个网站的地址,客户端会发送一个http请求到nginx,nginx会将动态资源请求转发给应用服务器,应用服务器与数据库交互进行业务逻辑处理,处理完后,将数据返回给nginx,nginx将动态资源和自身的静态资源进行封装后返回给客户端。
二、nginx处理请求的过程
说明:
- 红色箭头表示客户端发送到nginx的请求,静态资源放在本地文件系统(Linux系统下的某个目录),nginx对于静态资源的响应非常高,但是应用服务器对动态资源的响应急剧下降,数据库对请求的处理就更低了,为了缓解nginx、应用服务器、数据库之间的处理差异,我们需要部署一个缓存服务器(具体还是需要根据系统的规模决定要不要部署缓存服务器)。
- 反向代理代理中还有缓存加速、负载均衡:假如应用服务器有多台,反向代理就不能代理给某一台应用服务器了,而需要通过一些算法将请求进行分发,以达到负载均衡;nginx可以将应用服务器从数据库获取到的数据缓存起来,下次请求过来时,就不需要再去应用服务器获取结果,可以直接返回结果
- api服务:nginx诞生初期是没有这个能力的,随着nginx不断发展,有了openResty后才有的能力。openResty是nginx和弱脚本的结合,可以通过api服务自己开发一个高性能的web服务器
nginx核心优势
一、高并发、高性能:随着互联网数据和用户量的增长,之前使用的apache的web服务器已无法满足。高并发的场景下我们只用增加进程数就能解决,依赖于事件驱动模型、进程处理请求模型,他是用一个进程来处理多个请求;高性能依赖于良好的设计;
二、扩展性好:
- nginx自身是模块化设计的,模块化设计最强的优点就是解耦,所有功能的耦合性是很低的,意味着一个模块出现问题,是不会对其他模块造成影响的;
- nginx允许开发第三方模块,如openResty、阿里巴巴的tngine
- 生态圈发展好
三、异步非阻塞的事件驱动模型:比如餐厅点餐这一场景,在阻塞式场景中,第一个顾客点完餐,就在那里等,等厨师做完并交付给这个顾客后,顾客走了,老板才能接待下一个客户,对于异步来说,顾客点完餐后拿了个号牌,下一个顾客可以继续上前点单,对于老板来说,他可以接待的人更多了(处理的请求更多了),后续老板可以增加个叫号器,这就是编程开销,所以,对于异步非阻塞的事件驱动模型增加了编程难度、编程开销,但是处理更高效
四、高可靠性:nginx通常运行在系统的边缘节点,用于接收用户的请求,nginx连续运行几年可能都不需要重启服务,但是对于其他服务器(如apache),可能运行几周就需要重启服务器,为保证业务连续性,我们是不能接受这种情况的。
五、热部署、平滑升级:不需要关机就能对后端应用程序进行更换,同时不中断连接请求的处理
六、bsd许可:允许nginx使用者根据自己的需求对nginx进行二开,并将二开代码运用到nginx中,同时能运用到商业场景