1、Nginx的基础介绍


nginx简介 

一、经常使用来提供静态Web服务的软件有以下三种:

Apache: 
这是中小型Web服务的主流,Web服务器中的老大哥。

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

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

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

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

Resin:
大型动态Web服务主流,互联网Java容器主流(如jsp、do)。
    
三、 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软件特征介绍

- 1). 支持高并发:能支持几万并发链接(特别是静态小文件业务环境)
- 2). 资源消耗少:在3万并发链接下,开启10个Nginx线程消耗的内存不到200MB
- 3). 支持异步网络I/O事件模型epoll(Linux 2.6+) apache(select)
     
四、 nginx软件功能介绍

- 1)做为Web服务软件(处理用户访问静态请求)
- 2)反向代理或负载均衡服务
- 3)前端业务数据缓存服务
    
五、nginx软件模型特色说明

- apache与nginx软件对比说明
- apache使用select模型
- nginx使用epoll模型
- 举例说明:宿舍管理员
- select模型版管理员  会一个一个房间查询人员
- epoll模型版管理员   会进行检索后,直接找到须要找的人
- 举例说明:幼儿园阿姨
- select模型版阿姨    会一个一个小朋友进行询问,确认哪一个小朋友须要上厕所
- epoll模型版阿姨     会告知想上厕所小朋友自觉站到响应位置

- Select特色:select 选择句柄的时候,是遍历全部句柄,也就是说句柄有事件响应时,select须要遍历全部句柄才能获取到哪些句柄有事件通知,所以效率是很是低。
epoll的特色:epoll对于句柄事件的选择不是遍历的,是事件响应的,就是句柄上事件来就立刻选择出来,不须要
- 遍历整个句柄链表,所以效率很是高。


六、Nginx相对于Apache的优势

- 1)    高并发响应性能很是好,官方Nginx给出处理静态文件并发5W/S
- 2)    负载均衡及反向代理性能很是强
- 3)    系统内存和CPU占用率低
- 4)    可对后端服务经行健康检查
- 5)    支持PHP CGI和FastCGI
- 6)    能够做为缓存服务器、邮件代理服务器
- 7)    配置代码简单

2、Nginx的工做进程

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

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

master进程:

主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常状况下),会自动从新启动新的worker进程。
master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不须要处理网络事件,不负责业务的执行,只会经过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
咱们要控制nginx,只须要经过kill向master进程发送信号就好了。好比kill -HUP pid,则是告诉nginx,从容地重启nginx,咱们通常用这个信号来重启nginx,或从新加载配置,由于是从容地重启,所以服务是不中断的。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进程:

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

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

php

相关文章
相关标签/搜索