马老师 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;
      ...
   }
   ...
}

看完第十一讲

原文地址:https://www.cnblogs.com/zl0372/p/lnmp.html