1. 首页 > 知识 > 基础

Nginx的介绍及简单原理说明

nginx的原理

一、nginx的简介

1、常用的静态web软件

Apache:

这是中小型Web服务的主流,Web服务器中的老大哥(现在国企、银行在使用)。

Nginx:

大型网站Web服务的主流,曾经Web服务器中的初生牛犊,现已长大。 Nginx的分支Tengine(http://tengine.taobao.org/)目前也在飞速发展。

Lighttpd:

这是一个不温不火的优秀Web软件,社区不活跃,静态解析效率很高。 在Nginx流行前,它是大并发静态业务的首选,国内百度贴吧、豆瓣等众多网站都有Lighttpd奋斗的身影。

2、常用来提供动态服务的软件

PHP(FastCGI): 大中小型网站都会使用,动态网页语言PHP程序的解析容器。它可配合Apache解析动态程序,不过,这里的PHP不是FastCGI守护进程模式,而是mod_php5.so(module)。也可配合Nginx解析动态程序,此时的PHP常用FastCGI守护进程模式提供服务。

Tomcat: 中小企业动态Web服务主流,互联网Java容器主流(如jsp、do)。

Resin: 大型动态Web服务主流,互联网Java容器主流(如jsp、do)。

3、 nginx软件服务介绍

如果你听说或使用过Apache软件,那么很快就会熟悉Nginx软件,与Apache软件类似,Nginx(“engine x”)是一个开源的,支持高性能、高并发的WWW服务器和代理服务软件。它是由俄罗斯人lgor Sysoev开发的,最初被应用在俄罗斯的大型网站www.rambler.ru上。后来作者将源代码以类BSD许可证的形式开源出来供全球使用。

Nginx可以运行在UNIX、Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系统中 。

Nginx官方网站:www.nginx.org

4、nginx软件特征介绍

支持高并发:能支持几万并发连接(特别是静态小文件业务环境)

资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB

支持异步网络I/O事件模型epoll(Linux 2.6+) apache(select)

5、nginx软件功能介绍

  • 1)作为Web服务软件(处理用户访问静态请求)

  • 2)反向代理或负载均衡服务

  • 3)前端业务数据缓存服务

6、nginx与apache的对比

1、apache与nginx软件对比说明

  • apache使用select模型

  • nginx使用epoll模型

  • 举例说明:宿舍管理员

  • select模型版管理员 会一个一个房间查询人员

  • epoll模型版管理员 会进行检索后,直接找到需要找的人

    2、举例说明:幼儿园阿姨

  • select模型版阿姨 会一个一个小朋友进行询问,确认哪个小朋友需要上厕所

  • epoll模型版阿姨 会告知想上厕所小朋友自觉站到响应位置

  • Select特点:select 选择句柄的时候,是遍历所有句柄,也就是说句柄有事件响应时,select需要遍历所有句柄才能获取到哪些句柄有事件通知,因此效率是非常低。

  • epoll的特点:epoll对于句柄事件的选择不是遍历的,是事件响应的,就是句柄上事件来就马上选择出来,不需要遍历整个句柄链表,因此效率非常高。

7、Nginx的优点

  • 1) 高并发响应性能非常好,官方Nginx给出处理静态文件并发5W/S

  • 2) 负载均衡及反向代理性能非常强

  • 3) 系统内存和CPU占用率低

  • 4) 可对后端服务经行健康检查

  • 5) 支持PHP CGI和FastCGI

  • 6) 可以作为缓存服务器、邮件代理服务器

  • 7) 配置代码简单

二、nginx的工作原理

在工作方式上,Nginx分为单工作进程和多工作进程两种模式。在单工作进程模式下,除主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作进程包含多个线程。Nginx默认为单工作进程模式(一个master进程和一个work进程)。

Nginx在启动后,会有一个master进程和多个worker进程。

Nginx的程序架构

master/worker结构 一个master进程: 负载加载和分析配置文件、管理worker进程、平滑升级 一个或多个worker进程 处理并响应用户请求 缓存相关的进程: cache loader:载入缓存对象 cache manager:管理缓存对象

master进程:

1、主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

2、master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

3、我们要控制nginx,只需要通过kill向master进程发送信号就行了。比如kill -HUP pid,则是告诉nginx,从容地重启nginx,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。

4、master进程在接收到HUP信号后是怎么做的呢?首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。当然,直接给master进程发送信号,这是比较老的操作方式,nginx在0.8版本之后,引入了一系列命令行参数,来方便我们管理。比如,./nginx -s reload,就是来重启nginx,./nginx -s stop,就是来停止nginx的运行。如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。

worker进程 :

1、基于的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。

2、worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

nginx的进程模型

 Nginx的介绍及简单原理说明(图1)

nginx的架构图

Nginx的介绍及简单原理说明(图2)

1、 nginx启动时,会生 不处理网络请求,主要负责调度工作进程(master),也就是图示的三项:加载配置、启动工作进程及非停升级。所以,nginx启动以后,查看操作系统的进程列表,我们就能看到至少有两个nginx进程。

2、 服务器实际处理网络请求及响应的是工作进程(worker),在类unix系统上,nginx可以配置多个worker,而每个worker进程都可以同时处理数以千计的网络请求。

3、 模块化设计。nginx的worker,包括核心和功能性模块,核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器。

4、 事件驱动、异步及非阻塞,可以说是nginx得以获得高并发、高性能的关键因素,同时也得益于对Linux、Solaris及类BSD等操作系统内核中事件通知及I/O性能增强功能的采用,如kqueue、epoll及event ports。


本文由傻鸟发布,不代表傻鸟立场,转载联系作者并注明出处:https://shaniao.net/jichu/178.html

加载中~

联系我们

在线咨询:点击这里给我发消息

微信号:

工作日:10:30-15:30,节假日休息