【Nginx】为什么要用nginx
什么是Nginx
“Nginx (engine x)是一个开源、高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP
服务”。
重点是开源、高性能。
什么是web服务器?
Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web
客户端提供文档,也可以放置网站文件,让全世界浏览。可以放置数据文件,让全世界下载。
常见的 Web 服务器有: Apache、Nginx、微软的 IIS 和 Tomcat。比如当我启动 Nginx 服务后,服务监听服务器上的端口,当从外面访问这个 ip+ 端口 的地址时,我们能对应访问服务器上的某些静态文件,或者动态服务响应,对相应的 http 请求进行处理并返回某个结果。
Nginx 是由俄罗斯的工程师 Igor Sysoev 在 Rambler 集团任职系统管理员时利用业余时间所开发高性能 web 服务,官方测试 Nginx 能够支撑 5 万并发链接,并且 cpu、内存等资源消耗却非常低,运行非常稳定,所以现在很多知名的公司都在使用 Nginx 或者在此基础上进行了二次开发,包括淘宝、新浪、百度等。对于中小型企业而言,开源免费而又性能强大的 Nginx 必然也是首选,后续我们将看到一组统计数据来说明 Nginx 的应用之广泛。
Nginx优势
高性能、高稳定、低资源消耗
Nginx 的进程模型采用了 Master/Workers 进程池的机制,即通常情况下,Nginx 会启动一个 Master 进程(当然,也可以无 master 进程)和多个 Worker 进程对外提供服务。Master 进程是监控进程,本身并不处理具体的 TCP 和 HTTP 请求,只负责接受 UNIX 信号,管理 Worker 进程,类似于工地的包工头。
Worker 进程是比较累的,负责处理客户端的连接请求,它充分利用了 Linux 系统中的 epoll、kqueue 等机制,高效处理 TCP 和 HTTP 请求,利用这些特点,Nginx 充分挖掘了服务器的潜能,让服务器更快响应用户请求。
一般情况下,10000 个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅仅消耗 2.5M 内存,这是 Nginx 支持高并发连接的基础,体现了 Nginx 高性能的特点。另外,由于官方提供的模块都非常稳定,每个 Worker 进程都相对独立,Woker 进程出错时,Master 进程会立马感知到并快速拉起新的 Worker 子进程不间断提供服务,保证服务的稳定性。
nginx的进程模型
高可扩展性
Nginx 的架构设计是非常优秀的,极具扩展性,它完全由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。
另外,我们还可以在官方提供的模块上进行二次开发,例如 HTTP 模块,其中设计了 HTTP 过滤器模块,这样我们开发一个新的 HTTP 模块时,除了使用诸如 HTTP 核心模块、events 模块、log 模块等不同层次的模块,还可以原封不动地复用大量已有的 HTTP 过滤器模块。
这种低耦合度的优秀设计,造就了 Nginx 庞大的第三方模块,而且 Nginx 的模块都是嵌入到二进制的文件中执行的,这样使得第三方模块同样具备极其优秀的性能,充分利用 Nginx 的高并发特性,因此许多高流量的网站都会在 Nginx 基础上开发符合自己业务特性的定制模块,而且开发成本低,效果好。
另外,对于中小型企业来说,Nginx 开箱即用,其本身的高并发能力能满足企业的大部分业务,因此 Nginx 在绝大部分互联网企业中应用非常广泛。
热部署
支持热部署功能是 Nginx 的一个特色,许多大型门户网站要求 24 小时不间断提供服务,一旦出现服务停止,容易造成用户投诉和用户流失。Nginx 由于其管理进程和 Worker 进程的分离设计,使得其能提供热部署功能,满足大型站点在 7x24 小时不间断服务的前提下升级 Nginx。
但要注意的是,Nginx 并不支持在不停止服务的情况下就更新配置、更换日志文件等功能。Nginx 的热部署实现原理是,在不停止老进程的前提下,终止其连接请求,并启动新的 Worker 进程处理新进来的连接请求,再慢慢终止老的 Worker 进程,实现新老交替。
开源和免费
Nginx 和老大哥 Apache 一样开源且免费。在如今的时代,开源才能有力地成长,免费才能让更多的企业和个人开发者使用。 当然 Nginx 也有它的商业版本 Nginx plus,它有着更为丰富的功能和应用场景。然而免费版本的功能已经足够强大,加上第三方层出不穷的插件模块,几乎能实现各种业务功能,再加上配合第三方的语言集成(perl、lua等),对于绝大多数企业和个人来说已经完全足够。
当然,Nginx 的优点绝对不止于此。它最核心地功能是:在支持高并发请求的同时保持高效的服务。而这一点正是广大开发者,也是各大企业迫切需要满足的需求,以应对日益庞大的国内互联网用户群体。
Nginx 使用场景
Nginx 的使用场景如下:
HTTP 服务器
Nginx 作为 Web 服务器能独立提供 Http 服务。另外,我们常常通过 Nginx 作为静态资源服务器来访问服务器上的静态资源,比如对于最新热门的前后端分离架构,前端打好包后直接放到某个地址,在 Nginx 配置后可以通过 Nginx 来访问主机上的前端页面。
反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。这样的好处是,将不暴露内部的服务地址,只统一使用一个公共出口,通过 URI 匹配转发到不同的内部服务处理请求。
负载均衡
负载均衡也是 Nginx 的一个高频使用场景,对于下游存在的多个相同服务,可以将请求采用某种策略(随机、轮询、权重)发到相应的服务处理。这样由于多个相同服务的存在,可以实现高可用功能,在一个服务不可用时,Nginx 会自动发现并将其剔出服务集群,将请求转发给正常的服务进行处理。
基于第三方插件
Nginx 可以完成各种各样复杂的功能,全方位满足程序员的想法。比如在 Nginx 中引入 lua 模块,可以实现对 Http 请求更细粒度的限制,包括限速、限流、校验认证等等。后续,在 Nginx 上发展出来的 OpenResty 已经应用到了微服务网关方向。
参考:
http://www.imooc.com/wiki/nginxlesson/choose.html
http://tengine.taobao.org/book/chapter_02.html