码迷,mamicode.com
首页 > 其他好文 > 详细

Nignx

时间:2017-10-25 15:22:55      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:处理程序   加载   内核空间   机制   准备就绪   模式   epoll   ack   centos   

httpd MPM(多路处理模块):

  prefork:进程模型,两级结构,主进程master负责生成 子进程,每个子进程负责响应一个请求

  worker:线程模型,三级结构,主进程master负责生成子 进程,每个子进程负责生成多个线程,每个线程响应一个 请求

  event:主进程master负责生成子进程,每个子进程响应 多个请求

IO模型

I/O: 网络IO:本质是socket读取       磁盘IO: 磁盘的读写

每次IO,都要经由两个阶段: 第一步:将数据从文件先加载至内核内存空间(缓冲区) ,等待数据准备完成,时间较长

              第二步:将数据从内核缓冲区复制到用户空间的进程的内 存中,时间较短

同步/异步:关注的是消息通信机制

  • 同步:synchronous,调用者自已主动等待被调用者返回消 息,才能继续执行
  • 异步:asynchronous,被调用者通过状态、通知或回调机 制主动通知调用者被调用者的运行状态

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态

  • 阻塞:blocking,指IO操作需要彻底完成后才返回到用户 空间,调用结果返回之前,调用者被挂起
  • 非阻塞:nonblocking,指IO操作被调用后立即返回给用户 一个状态值,无需等到IO操作彻底完成,最终的调用结果 返回之前,调用者不会被挂起

I/O模型: 阻塞型、非阻塞型、复用型、信号驱动型、异步

同步阻塞IO模型

技术分享

同步阻塞IO模型是最简单的IO模型,用户线程在内核进行 IO操作时被阻塞。

用户线程通过系统调用read发起IO读操作,由用户空间转到 内核空间。内核等到数据包到达后,然后将接收的数据拷贝 到用户空间,完成read操作。

用户需要等待read将数据读取到buffer后,才继续处理接收 的数据。整个IO请求的过程中,用户线程是被阻塞的,这导 致用户在发起IO请求时,不

能做任何事情,对CPU的资源利 用率不够。

同步非阻塞IO模型

技术分享

用户线程发起IO请求时立即返回。但并未读取到任何数据, 用户线程需要不断地发起IO请求,直到数据到达后,才真正 读取到数据,继续执行。

即 “轮询”机制

整个IO请求的过程中,虽然用户线程每次发起IO请求后可以 立即返回,但是为了等到数据,仍需要不断地轮询、重复请 求,消耗了大量的CPU的资源 

是比较浪费CPU的方式,一般很少直接使用这种模型,而是在 其他IO模型中使用非阻塞IO这一特性

IO多路复用模型

技术分享

本模型会阻塞进程,但是进程是阻塞在select或者poll这两个系统调用上 ,而不是阻塞在真正的IO操作上

用户首先将需要进行IO操作添加到select中,继续执行做其他的工作(异 步),同时等待select系统调用返回。当数据到达时,IO被激活,

select 函数返回。用户线程正式发起read请求,读取数据并继续执行。

从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区 别,甚至还多了添加监视IO,以及调用select函数的额外操作,效率更差 。

并且阻塞了两次,但是第一次阻塞在select上时,select可以监控多个 IO上是否已有IO操作准备就绪,即可达到在同一个线程内同时处理多个 IO

请求的目的。而不像阻塞IO那种,一次只能监控一个IO

虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还 是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要 长。

如果用户线程只是注册自己需要的IO请求,然后去做自己的事情, 等到数据到来时再进行处理,则可以提高CPU的利用率

IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因 为它使用了会阻塞线程的select系统调用。因此IO多路复用只能称为异步 阻塞IO

模型,而非真正的异步IO

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备 读取,它就通知该进程

IO多路复用适用如下场合:  

当客户处理多个描述符时(一般是交互式输入和网络套接口), 必须使用I/O复用

当一个客户同时处理多个套接口时,这种情况是可能的,但很少 出现

当一个TCP服务器既要处理监听套接口,又要处理已连接套接口 ,一般也要用到I/O复用。

当一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用

当一个服务器要处理多个服务或多个协议,一般要使用I/O复用

信号驱动IO模型

技术分享

信号驱动IO:signal-driven I/O

就是说用户进程可以通过sigaction系统调用注册一个信号处 理程序,然后主程序可以继续向下执行,当有IO操作准备就 绪时,由内核通知

触发一个SIGIO信号处理程序执行,然后 将用户进程所需要的数据从内核空间拷贝到用户空间

此模型的优势在于等待数据报到达期间进程不被阻塞。用户 主程序可以继续执行,只要等待来自信号处理函数的通知 ;该模型并不常用

异步IO模型

技术分享

异步IO与信号驱动IO最主要的区别是信号驱动IO是由内核 通知何时可以进行IO操作,而异步IO则是由内核告诉我们 IO操作何时完成了。具体来说就是,

信号驱动IO当内核通知 触发信号处理程序时,信号处理程序还需要阻塞在从内核空 间缓冲区拷贝数据到用户空间缓冲区这个阶段,而异步IO直 接是在

第二个阶段完成后内核直接通知可以进行后续操作了

相比于IO多路复用模型,异步IO并不十分常用,不少高性能 并发服务程序使用IO多路复用模型+多线程任务处理的架构基 本可以满足需求。况且目前

操作系统对异步IO的支持并非特 别完善,更多的是采用IO多路复用模型模拟异步IO的方式( IO事件触发时不直接通知用户线程,而是将数据读写完毕后

放到用户指定的缓冲区中)

I/O模型的具体实现

Select:Linux实现对应,I/O复用模型

Poll:Linux实现,对应I/O复用模型

Epoll:Linux实现,对应I/O复用模型,具有信号驱动I/O模型 的某些特性

Kqueue:FreeBSD实现,对应I/O复用模型,具有信号驱动 I/O模型的某些特性

/dev/poll:SUN的Solaris实现,对应I/O复用模型,具有信号 驱动I/O模型的某些特性

Iocp Windows实现,对应第5种(异步I/O)模型

技术分享

Nigix默认epoll,性能及其优秀!

Nginx介绍

Nginx:engine X ,2002年,开源,商业版

http协议:web服务器(类似于httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxy,tcp

NGINX is a free, open-source, high-performance an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server

二次开发版:Tengine, OpenResty

官网:http://nginx.org

正向代理和反向代理

技术分享

特性:  模块化设计,较好的扩展性 ; 高可靠性  ; 支持热部署:不停机更新配置文件,升级版本,更换日志文件 ;低内存消耗:10000个keep-alive连接

模式下的非活动连接,仅 需要2.5M内存 ; event-driven,aio,mmap,sendfile

基本功能: ----静态资源的web服务器 ----http协议反向代理服务器 ----pop3/imap4协议反向代理服务器 ----FastCGI(lnmp),uWSGI(python)等协议

      ----模块化(非DSO),如zip,SSL模块 ----tcp,udp代理

nginx架构

技术分享

nginx的程序架构: master/worker结构

 一个master进程: 负载加载和分析配置文件、管理worker进程、平滑升级

一个或多个worker进程 处理并响应用户请求

缓存相关的进程: cache loader:  载入缓存对象 cache manager:管理缓存对象

nginx模块:模块分类: 核心模块:core module

           标准模块:  HTTP 模块: ngx_http_* HTTP Core modules( 默认功能) HTTP Optional modules (需编译时指定)

                  Mail 模块 ngx_mail_*

                  Stream模块 ngx_stream_*

           第三方模块

nginx的功用:静态的web资源服务器 html,图片,js,css,txt等静态资源

         结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求

       http/https协议的反向代理

       imap4/pop3协议的反向代理

       tcp/udp协议的请求转发(反向代理)

nginx的安装:官方: http://nginx.org/packages/centos/7/x86_64/RPMS

       Fedora-EPEL: https://mirrors.aliyun.com/epel/7/x86_64/

yum  -y install  nginx

技术分享

安装前脚本已经创建nginx用户

技术分享

启动nginx(注意用nginx启动,必须用nginx -s stop停,用systemctl start nginx 启动必须用systemctl stop nginx 停)

技术分享

技术分享

nginx -t  检测配置文件语法   -T 检测的同时输出配置文件

技术分享

Nginx:默认为启动nginx   -h 查看帮助选项   -t 测试nginx语法错误   -c filename 指定配置文件(default: /etc/nginx/nginx.conf)  

-s signal 发送信号给master进程,signal可为:stop, quit,reopen, reload(reload 很多时候不生效)

nginx配置

配置文件的组成部分: 主配置文件:nginx.conf   子配置文件 include conf.d/*.conf   

主配置文件的配置指令: directive    value    [value2 ...];

注意: (1) 指令必须以分号结尾

    (2) 支持使用配置变量 内建变量:由Nginx模块引入,可直接引用

             自定义变量:由用户使用set命令定义 set variable_name value;

             引用变量:$variable_name 

nginx配置文件:

 

Nignx

标签:处理程序   加载   内核空间   机制   准备就绪   模式   epoll   ack   centos   

原文地址:http://www.cnblogs.com/heiye123/p/7728568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!