• 马老师 LNMP生产环境Web架构 笔记


    http协议和缓存原理、多路IO模型

    MIME机制,Multipurpose Internet Mail Extensions,多用户互联网邮件扩展。MIME使用一个简单的字符串组成,最初是为了标识邮件Email附件的类型,在html文件中可以使用content-type属性表示,描述了文件类型的互联网标准。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。

    MIME规定了用于表示各种各样的数据类型的符号化方法。浏览器接收到文件后,会进入插件系统进行查找,查找出哪种插件可以识别读取接收到的文件。如果浏览器不清楚调用哪种插件系统,它可能会告诉用户缺少某插件,或者直接选择某现有插件来试图读取接收到的文件,后者可能会导致系统的崩溃。

    MIME是内容类型的标示。

    Web对象,Web资源:取回本地去展示。

    http request

    1. method URL version 起始行
    2. headers首部
    3. Request body主体

    http response

    1. version status_code reason
    2. headers
    3. response body

    status_code:

    1. 1XX:简单信息
    2. 2XX:正确响应
    3. 3XX:重定向类的响应
    4. 4XX:客服端错误响应
    5. 5XX:服务器端错误响应

    Web服务器响应多个用户请求的模型:1、单进程模型,服务器只有一个,请求一个一个挨着来;2、多进程、多线程(服务器的线程)模型,客户和请求不是一一对应;3、一个进程处理多个请求,每个请求使用一个线程(进程的线程);4、多个进程处理多个请求。

    多路复用(复用机制不同)

    IO模型:同步阻塞模型。频率 Hz。
    电子电路中高电平是电压高的状态,一般记为1; 电子电路中低电平是电压低的状态,一般记为0;
    同步时钟频率,步调一致。
    异步,不需要同步时钟频率,有一套规则告诉你如何解析。
    阻塞。
    非阻塞。

    四种模型:

    1. 同步阻塞
    2. 同步非阻塞
    3. 异步阻塞(异步是不能阻塞的,只能阻塞异步信号)
    4. 异步非阻塞,基于函数回调机制。内核完成,用一个回调机制再传给他。内核主动执行回调函数

    多进程模型下套接字只有一个,监听一个套接字。

    select系统调用是用来让我们的程序监视多个文件描述符(file descrīptor)的状态变化的。程序会停在select这里等待,直到被监视的文件描述符有某一个或多个发生了状态改变。Select机制通知完成已否。每隔一定频率扫描一遍,向用户发送通知,无论完成与否。最早通知个数是1024个。并发请求1024个是不可能的。等同于不论完成都告诉客服,让没有完成的客户也接收到通知,不胜其烦。Select只是一个内核函数。

     epoll机制下每个用户的请求被制成一种状态,当请求完成后,状态发生改变,从未完成到完成。Epoll只是将已完成的请求的输出到用户组,只通知已完成。只通知一次的叫边缘触发;通知直到完成叫做水平触发。 epoll比select更负责,更高效。Epoll打开文件描述符的个数不受1024的限制,受操作系统的限制。

    Apache

    • prefork模型:多进程,每个请求用一个进程响应。select机制。并发数有限。
    • work模型:多进程(每个进程可以生成多个线程),每个请求用一个线程响应。不完全是Select机制。线程开销小,可以共享进程的资源。
    • Event模型:多进程,每个进程可同时响应多个用户请求。基于事件实现。 同步阻塞。用户请求,到缓存中找,没有的话去磁盘上找。等待内核将资源返回,磁盘IO。磁盘IO通过系统调用,所以跟内核打交道。完成了网路服用,将网络连接完成了复用。使用一个单独的进程来响应的。网络连接完成了复用。

    高并发实现模式:

    • 基于线程:多进程(每个进程可以生成独立线程),每个线程响应一个请求,比如work。线程开销小,可以共享进程的资源。有数目限制。在linux上,work没有优势可言。
    • 基于事件:Event。线程抖动(线程切换过快)。进程只有一个,或者进程内只有一个线程。一个进程响应多个用户请求,不停循环,run-loop机制(端口套接字复用,listen接受请求,然后交给其他处理,一直listening接受状态,然后磁盘IO。这样就实现网络复用)。如何知道接受处理情况-网络IO? 未完成的时候表示为未完成,完成的时候通过epoll通知完成。

    网络IO:网络IO、磁盘IO。

    文件的AIO(All In One一体机制)。读取文件,内核发起调用,从磁盘上到到内存buffer,从内核copy到用户的进程。这样会很慢。系统利用内核的MMap机制形成映射,进行内存映射机制,获得的是地址空间,而不再是数据。

    网络IO上Epoll是最好的,磁盘IO异步非阻塞(AIO)是最好的。

    Nginx:基于时间,支持边缘触发,mmap,AIO的一种轻量级Web服务器。   多个进程相应N个用户请求。并行计算能力。Nginx完全可以用SMP的优势。

    采用模块化设计: core + function(模块是管道穿墙,流水线式工作),接受创建模块连接,再接受,循环。

    Nginx Feature

    • static file serving
    • SSL/TLS support
    • Virtual hosts
    • Reverse proxying
    • Load balancing
    • Compressing
    • Access controls
    • URL rewriting
    • Custom logging
    • Server-side includes
    • WebDAV
    • Flv streaming
    • FastCGI

    核心模块,功能模块,组合模块

    web反向代理,mail服务器(pop,smtp,imap)

    squid反向代理是同步的。

    apache root, master process

    • 创建新进程
    • 回收进程

    Nginx也是两类进程:

    • master进程,根据配置需要启动slave进程或销毁slave进程;启用新的配置
    • slave进程,真正向用户请求的都是slave进程

    Nginx可以根据需要,无缝升级。先想mater升级,然后升级slave,等老的slave销毁了,再启用就使用新的slave进程。

    Nginx会按需同时运行多个进程:一个主进程master和几个工作进程worker,配置了缓存时还会有缓存加载器进程cache loader和缓存管理器进程cache manager等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信,主进程以root用户身份运行,而worker、cache loader和cache manager均以非特权用户身份运行。

    主进程主要完成以下工作:
    1、读取并验证配置信息;
    2、创建、绑定及关闭套接字;
    3、启动、终止及维护worker进程的个数;
    4、无须中止服务而重新配置工作特性;
    5、控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;
    6、重新打开日志文件;
    7、编译嵌入式perl脚本。

    worker进程主要完成的任务包括:
    1、接受、传入并处理来自客户端的连接;
    2、提供反向代理及过滤功能;
    3、Nginx任何能完成的其他任务。

    cache loader进程主要完成的任务包括:
    1、检查缓存存储中的缓存对象;
    2、使用缓存元数据简历内存数据库。

    cache manager进程的主要任务:
    缓存的失效及过期检验。

    Nginx的配置由着几个不同的上下文:main、http、server、upstream和location(还有实现邮件服务反向代理的mail)。配置语言的格式和定义方式遵循所谓的C风格,因此支持嵌套,还有这逻辑清晰并易于创建、阅读和维护等优势。

    Nginx的代码是由一个核心和一系列的模块组成,核心主要用于提供web server的基本功能,以及web和mial反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地运行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以成为事件模块、阶段性处理器、输出过滤器、协议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。事件模块主要用户提供os独立的(不同操作系统的事件机制有所不同)事件通知机制如kqueue或epoll等。协议模块则负责事件nginx通过http、tls/ssl、smtp、pp3以及imap与对应的客户端建立会话。

    在nginx内部,进程间的通信是通过模块的pipeline或chain实现的:换句话说,每个功能或操作都由一个模块来实现。例如,压缩、通过FastCGI或uwsgi协议与upstream服务器通信,以及与memcached建立会话等。

    work_connections首先用户用户连接数限制,ulimit -n

    work process

    • 如果是IO密集型,此个数是CPU的1.5或2倍.也有人将此个数设置为跟磁盘数一样。
    • 如果是CPU密集型,此个数是CPU个数

    Nginx的location匹配规则,Nginx的Location可以有以下几个匹配:

    • 〖=〗  严格匹配这个查询。如果找到,停止搜索。
    • 〖^~ 〗 匹配路径的前缀,如果找到,停止搜索。
    • 〖~ 〗 为区分大小写的正则匹配
    • 〖~*〗 表示不区分大小写的正则匹配
    • 〖@〗 指定一个命名的location,一般只用于内部重定向请求。

    首先对字符串进行匹配查询,最确切的匹配将被使用。然后,正则表达式的匹配查询开始,匹配第一个结果后会停止搜索,如果没有找到正则表达式,将使用字符串的搜索结果,如果字符串和正则都匹配,那么正则优先级较高。

    例子:

    location = /{
      # 只匹配对 / 目录的查询.
      [ config A ]
    }

    location /{
      # 匹配以 / 开始的查询,即所有查询都匹配。
      [ config B ]
    }

    location ^~ /images/{
      # 匹配以 /images/ 开始的查询,不再检查正则表达式。
      [ config C ]
    }

    location ~* .(gif|jpg|jpeg)$ {
      # 匹配以gif, jpg, or jpeg结尾的文件,但优先级低于config C。
      [ config D ]
    }

    如果要定义多个location,则可以有2种方式:
    使用/ :
    location / {
      client_max_body_size 200m;
      proxy_connect_timeout 30;
      proxy_set_header Host $http_host;
      proxy_set_header x-forwarded-for $remote_addr;
      proxy_pass http://127.0.0.1:8008;
    }

    location /tmp/{
      root /; internal;
    }

    采用这种方式,/tmp可以放在/的下面,因为“/是匹配任何查询,但是正则表达式规则和长的块规则将被优先和查询匹配”
    使用~ /* :
    location ~ /tmp/ {
      root /tmp; internal;
    }

    location ~ /* {
      client_max_body_size 20m;
      proxy_connect_timeout 30;
      fastcgi_pass fpass;
      include fastcgi_params;
    }

    采用这种方式,/tmp则必须放在~ /*这个前面,因为~是正则匹配的,正则匹配是有顺序的,只要匹配上就不会再往下匹配了。除非在conf中有定义=或者^~,也就是说=和^~的优先级最高,如果匹配上,就不会再去匹配其它的规则了。

     总之,引用Nginx的官方文档的匹配规则:
    Directives with the = prefix that match the query exactly. If found, searching stops.All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.Regular expressions, in order of definition in the configuration file.If #3 yielded a match, that result is used. Else the match from #2 is used.

    注意:正则表达式的匹配是有顺序的,按顺序匹配。其它的匹配理论上讲是只有优先级,而没有顺序的。

    总之:
    (location =) > (location 完整路径 >)>(location ^~ 路径) >(location ~* 正则)>(location 路径)
    只要匹配到,其它的都会忽略,然后返回到改匹配。
    如果都是正则,都能够匹配,以配置文件出现顺序来,谁在前谁优先。

    ELinks 是一个 Linux 系统下的纯文本的浏览器,安装后。使用命令elinks -dump URL,即可访问URL路径地址。

    启用基于用户的认证:

    server {
       server_name www.realure.com
       location /{
          auth_basic "Restricted"
          auth_basic_user_file /etc/nginx/.htpassws;
          ...
       }
       ...
    }

    看完第十一讲

  • 相关阅读:
    父级和 子集 controller 之间的通讯
    ui-router(三)controller与template
    ui-router详解(二)ngRoute工具区别
    关于MySql全文索引
    Yii提供的Htmler助手checkboxList可自定义Checkbox输出格式
    添加和删除索引以及如何给中间表添加两个主键
    设置数据库及表的默认字符集
    保存数据的时候报类型错误的原因和解决方案
    金融经济
    YII获取刚插入数据的id主键
  • 原文地址:https://www.cnblogs.com/zl0372/p/lnmp.html
Copyright © 2020-2023  润新知