《深入理解Nginx-模块开发与架构解析》

一、研究Nginx前的准备工作

1、常见负载均衡

         1)Apache:被设计成了一个重量级的、不支持高并发的Web服务器

         2)Lighttpd和Nginx都是轻量级、高性能的Web服务器;欧美前者用的多,国内Nginx用的多

 

2、Nginx特点:

         1)快

         2)高扩展性

         3)高可靠性

         4)低内存消耗

         5)单机支持10w+并发连接

         6)热部署

         7)自由的BSD许可协议

 

3、使用Nginx的必备软件:

         1)GCC编译器

         2)PCRE库

         3)zlib库

         4)OpenSSL开发库

 

4、修改内核参数:

         1)/etc/sysctl.conf

         2)使修改生效:sysctl–p

 

5、安装Nginx

         ./configure

         make

         makeinstall

 

6、Nginx平滑升级步骤

         1)通知正在运行的旧版本Nginx准备升级:Nginx会将pid文件重命名

         2)启动新版本的Nginx

         3)向旧版本master发送信号,使其优雅关闭

 

二、Nginx的配置

 1、一个master进程来管理多个worker进程,work进程提供互联网服务,master只负责监控管理work。

注:work进程的数量与服务器上的CPU核心数相等,最好绑定CPU,从而避免进程切换开销。

 

2、块配置项由一个块配置项名和一对大括号组成,块配置项可以嵌套,内层块直接继承外层块,内层屏蔽外层相同配置项值。

注:所有的事件类配置都要在events块中

 

3、配置项的语法格式:配置项名 配置值1 配置值2;

注:配置项值可以是数字或字符串(包括正则表达式)

 

4、变量使用的时候要在前面加上$符号,只有少数模块支持,并不通用。

 

5、用于调试进程和定位问题的配置项

1)是否以守护进程方式运行Nginx

         a、语法:daemonon|off

         b、默认:daemon on

注:守护进程是脱离终端并且在后台运行的进程

2)是否以master/worker方式工作

         a、语法:master_processon | off

         b、master_processon

3)error日志的设置

         a、语法:error_log/path/file level

         b、默认:error_loglogs/error.log error

注:a、/path/file是/dev/null,则不会输出任何日志,即关闭error日志

         b、/path/file是stderr,则会输出到标准错误文件中

         c、level是输出级别,有:debug、info、notice、warn、error、crit、alert、emerg

         d、若设置debug,必须在configure时加入 –with-debug配置项

4)是否处理几个特殊的调试点,语法:debug_points[stop|abort]

5)仅对指定的客户端输出debug级别的日志:debug_connection[IP| CIDR]

6)限制coredump核心转储文件的大小:worker_rlimit_coresize

注:核心转储:在Linux系统中,当进程发生错误或手袋信号而终止时,系统会将进程执行时的内存内容(核心映像)写入一个我文件(core文件),以作为调试之用

7)指定coredump文件生成目录:working_directorypath

 

6、正常运行的配置项

1)定义环境变量

         a、语法:env VAR |VAR=VALUE

2)嵌入其他配置文件

         a、语法:include/path/file

3)pid文件的路径

         a、语法:pidpath/file

         b、默认:pidlogs/nginx.pid

注:pid文件保存master进程ID

4)Nginx worker进程运行的用户及用户组

         a、语法:userusername[groupname];

         b、默认:usernobody nobody;

注:user用于work进程运行在哪个用户和用户组下

5)指定Nginx worker进程可以打开的最大句柄描述符个数

         a、语法:work_rlimit_nofilelimit;

6)限制信号队列

         a、语法:work_rlimit_sigpendinglimit;

 

7、优化性能的配置

1)Nginx worker进程个数

         a、语法:worker_processesnumber;

         b、默认:1

注:非阻塞式调用个数=CPU数,阻塞式调用>CPU数

2)绑定Nginx worker进程到指定的CPU内核

         a、语法:worker_cpu_affinitycpumask[cpumask…]

3)SSL硬件加速

         a、语法:ssl_enginedevice;

4)系统调用gettimeofday的执行频率

         a、语法:timer_resolutiont;

5)Nginx worker进程优先级设置

         a、语法:worker_prioritynice;

         b、默认 0

注:nice值是进程的静态优先级,取值范围是-20~+19,-20是最高优先级,不建议比内核进程的nice值(通常-5)还要小

 

8、事件类配置项

1)是否打开accept锁(负载均衡锁)

         a、语法:accept_mutex[on | off]

         b、默认 on

注:这把锁可以让多个worker进程轮流地、序列化地与新的客户端建立TCP连接

2)lock文件的路径

         a、语法:lock_filepath/file

         b、默认:logs/nginx.lock

3)使用accept锁后到真正建立连接之间的延迟时间

         a、语法:accept_mutex_delayNms

         b、默认:500ms

注:worker进程取accept锁没取到的话,至少要等accept_mutex_delay定义的时间间隔后才能再次试图取锁

4)批量建立新连接

         a、语法:multi_accept[on | off]

         b、默认:off

5)选择事件模型

         a、语法:user[kqueue| rtsig | epoll | /dev/poll | select | poll |eventport];

         b、默认:Nginx会自动使用最合适的事件类型

6)每个worker的最大连接数

         a、语法:worker_connectionsnumber;

 

9、静态Web服务器的主要功能由ngx_http_core_module模块实现,并包含多个server块和location块。

注:所有的HTTP配置项都必须直属于http块、server块、location块、upstream块或if块等

 

10、虚拟主机与请求的分发

server_name:对应用户请求中的主机域名,通过server块来定义虚拟主机,每个server块就是一个虚拟主机,只处理与之相对应的主机域名请求。

1)监听端口

         a、语法:listenaddress:port

         b、默认:80

         c、配置块:server

注:listen参数

         a、default:将所在的server块作为整个Web服务的默认server块。若不设置,则配置中第一个server块作为默认server块。(当一个请求无法匹配配置文件中的所有主机域名时,就会选用默认的虚拟主机)

         b、default_server:同上

         c、backlog=num:TCP中backlog队列的大小

         d、rcvbuf=size:监听句柄的SO_RCVBUF参数

         e、sndbuf=size:监听句柄的SO_SNDBUF参数

         f、accept_filter:accept过滤器

         g、deferred:用户真的发送请求数据时,内核才会唤醒worker进程处理这个连接

         h、bind:绑定当前端口/地址对

         i、ssl:在当前监听的端口上建立的连接必须基于SSL协议

2)主机名称

         a、语法:server_namename

         b、默认:””

         c、配置块:server

注:server_name后可以跟多个主机名称,与Host的匹配优先级为:

         a、首先选择所有字符串完全匹配的

         b、其次在选择通配符在前面的

         c、再次选择通配符在后面的

         d、最后选择使用正则表达式才匹配的

3)每个散列桶占用的内存大小

         a、语法:server_names_hash_bucket_sizesize

         b、默认:32|64|128

         c、配置块:http、server、location

4)每个散列桶占用内存的最大值

         a、语法:server_names_hash_max_size

         b、默认:512

         c、配置块:http、server、location

注:该值越大,消耗内存越多,key的冲突率越低。

5)重定向主机名称的处理

a、语法:server_name_in_redirecton | off

         b、默认:on

         c、配置块:http、server、location

注:on,重定向请求时会使用server_name里配置的第一个主机名代替原先请求中的Host头部;off,重定向请求时使用请求本身的Host头部

6)location

         a、语法:location[=|~|~*|^~|@] /uri/ {…}

         b、配置块:server

         根据用户请求中的URI来匹配上面的/uri表达式,可以匹配,则选择location{}块中的配置来处理用户请求,location先匹配上的先处理

注:a、=表示把URI作为字符串

         b、~表示匹配URI时是字母大小写敏感的

         c、~*表示匹配URI时忽略字母大小写问题

         d、^~表示匹配URI时只需要前半部分与uri参数匹配即可

         e、@表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求

 

11、文件路径的定义

1)以root方式设置资源路径

a、语法:root path

         b、默认:root html

         c、配置块:http、server、location、if

注:path加到原请求uri之前

2)以别名方式设置资源路径

         a、语法:aliaspath

         b、配置块:location

注:path+请求uri(删除location中uri参数)

3)访问首页

         a、语法:indexfile

         b、默认:indexindex.html

         c、配置块:http、server、location

注:index后可以跟多个文件参数,Nginx将会按照顺序来访问这些文件

4)根据HTTP返回码重定向页面

         a、语法:error_pagecode[code] [=|=answer-code] uri | @named_location

         b、配置块:http、server、location、if

注:重定向了URI,HTTP错误码还是与原来的相同,可以通过=来更改返回的错误码,不指定=后的错误码,则由实际结果来决定

5)是否允许递归使用error_page

         a、语法:recursive_error_pages[on | off]

         b、默认:off

         c、配置块:http、server、location

6)try_files

a、语法:try_filespath1 [path2] uri;

         b、配置块:server、location

注:尝试按照顺序访问每一个path,如果可以有效地读取,就直接向用户返回这个path对应的文件结束请求,否则继续向下访问。如果所有的path都找不到有效的文件,就重定向到最后的参数uri上

 

12、内存及磁盘资源的分配

1)HTTP包体只存储到磁盘文件中

a、语法:client_body_in_file_onlyon | clean | off

         b、默认:off

         c、配置块:http、server、location

注:off一律存储到磁盘文件中;请求结束时,on文件不会被删除,clean删除该文件

2)HTTP包体尽量写入到一个内存buffer中

         a、语法:client_body_in_single_bufferon | off

         b、默认:off

         c、配置块:http、server、location

3)存储HTTP头部的内存buffer大小

         a、语法:client_header_buffer_sizesize

         b、默认:1k

         c、配置块:http、server

4)存储超大HTTP头部的内存buffer大小

         a、语法:large_client_header_buffersnumber size;

         b、默认:48k;

         c、配置块:http、server

5)存储HTTP包体的内存buffer大小

         a、语法:client_body_buffer_sizesize;

         b、默认:8k/16k;

         c、配置块:http、server、location

注:HTTP头部Content-Length与自定义buffer size取小

6)HTTP包体的临时存放目录

         a、语法:client_body_temp_pathdir-path[level1[level2[level3]]]

         b、默认:client_body_temp

         c、配置块:http、server、location

7)TCP连接内存池

         a、语法:connection_pool_sizesize

         b、默认:256

         c、配置块:http、server

8)每个请求的内存池

         a、语法:request_pool_sizesize;

         b、默认:4k;

         c、配置块:http、server

 

13、网络连接的设置

1)读取HTTP头部的超时时间

         a、语法:client_header_timeouttime (默认单位:秒)

         b、默认:60;

         c、配置块:http、server、location

2)读取HTTP包体的超时时间

         a、语法:client_body_timeouttime

         b、默认:60

         c、配置块:http、server、location

3)发送响应的超时时间

         a、语法:send_timeouttime

         b、默认:60

         c、配置块:http、server、location

4)连接超时,不进行四次握手关闭TCP连接,而是直接发送RST重置包,不等用户响应,直接释放Nginx缓存

         a、语法:reset_timeout_connectionon | off

         b、默认:off

         c、配置块:http、server、location

5)控制Nginx关闭用户连接的方式

         a、语法:lingering_closeoff | on | always

         b、默认:on

         c、配置块:http、server、location

注:always关闭连接前必须无条件地处理连接上所有用户发送的数据;off关闭连接时完全不管是否已经有准备就绪的来自用户的数据;on一般情况下在关闭连接前都会处理连接上的用户发送的数据

6)lingering_time

         a、语法:lingering_timetime

         b、默认:30s

         c、配置块:http、server、location

经过该设置时间后,Nginx不管用户是否仍在上传,都会把连接关闭掉

7)lingering_timeout

a、语法:lingering_timeouttime

         b、默认:5s

         c、配置块:http、server、location

lingering_close生效后,在关闭连接前,检测是否有用户发送的数据到达服务器,若超过lingering_timeout还没数据,则关闭连接;否则在读取完连接缓冲区上的数据并丢弃掉后才会关闭连接

8)对某些浏览器禁用keepalive功能

         a、语法:keepalive_disable[msie6| safari | none…]

         b、默认:msie6safari

         c、配置块:http、server、location

9)keepalive超时时间

         a、语法:keepalive_timeouttime(秒)

         b、默认:75

         c、配置块:http、server、location

10)一个keepalive长连接上允许承载的请求最大数

         a、语法:keepalive_requestsn;

         b、默认:100

         c、配置块:http、server、location

11)keepalive连接是否使用TCP_NODELAY选项

a、语法:tcp_nodelayon | off

         b、默认:om

         c、配置块:http、server、location

12)是否在发送响应时把整个响应包头放在一个TCP包中发送

         a、语法:tcp_nopushon | off

         b、默认:off

         c、配置块:http、server、location

 

14、MIME类型的设置

1)MIME type与文件扩展的映射

         a、语法:type{…};

         b、配置块:http、server、location

2)默认MIME type

         a、语法:default_typeMIME-type

         b、默认:text/plain

         c、配置块:http、server、location

3)types_hash_bucket_size

         a、语法:types_hash_bucket_sizesize

         b、默认:32 | 64 |128

         c、配置块:http、server、location

4)types_hash_max_size

         a、语法:types_hash_max_sizesize

         b、默认:1024

         c、配置块:http、server、location

注:该值越大,消耗更多内存,散列key冲突降低,检索速度更快

 

15、对客户端请求的限制

1)按HTTP方法名限制用户请求

         a、语法:limit_exceptmethod …{…}

         b、配置块:location

2)HTTP请求包体的最大值

         a、语法:client_max_body_sizesize

         b、默认:1m

         c、配置块:http、server、location

3)队请求的限速

         a、语法:limit_ratespeed

         b、默认:0

         c、配置块:http、server、location、if

对客户端请求限制每秒传输的字节数,0表示不限速

4)limit_rate_after

         a、语法:limit_rate_aftertime;

         b、默认:1m

         c、配置块:http、server、location、if

响应长度超过该值后才开始限速

 

16、文件操作的优化

1)sendfile系统调用

         a、语法:sendfileon | off

         b、默认:off

         c、配置块:http、server、location

启用sendfile系统调用来发送文件,减少了内核态与用户态之间的两次内存复制,这样就会从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的效率

2)AIO系统调用

         a、语法:aio on |off

         b、默认:off

         c、配置块:http、server、location

启用内核级别的异步文件I/O功能,与sendfile功能互斥

3)directio

         a、语法:directiosize | off

         b、默认:off

         c、配置块:http、server、location

使用O_DIRECT选项去读取文件,缓冲区大小为size,对大文件的读取速度有优化作用,与sendfile互斥

4)指定以directio方式读取文件时的对齐方式

         a、语法:directio_alignmentsize

         b、默认:512

         c、配置块:http、server、location

5)打开文件缓存

         a、语法:open_file_cachemax = N[inactive = time] | off;

         b、默认:off

         c、配置块:http、server、location

注:max内存中存储元素的最大个数,inactive指定时间段内没有被访问过的元素将会被淘汰,默认60秒;off关闭缓存功能

6)是否缓存打开文件错误的信息

         a、语法:open_file_cache_erroron | off

         b、默认:off

         c、配置块:http、server、location

7)不被淘汰的最小访问次数

         a、语法:open_file_cache_min_usesnumber

         b、默认:1

         c、配置块:http、server、location

在inactive指定的时间段内,访问次数超过了该值,则不会被淘汰出缓存

8)检验缓存中元素有效性的频率

         a、语法:open_file_cache_validtime

         b、默认:60s

         c、配置块:http、server、location

 

17、对客户端请求的特殊处理

1)  忽略不合法的HTTP头部

a、语法:ignore_invalid_headerson | off

         b、默认:on

         c、配置块:http、server

2)HTTP头部是否允许下划线

         a、语法:underscores_in_headerson | off

         b、默认:off

         c、配置块:http、server

3)对If-Modified-Since头部的处理策略

         a、语法:if_modified_since[off | exact | before]

         b、默认:exact

         c、配置块:http、server、location

off表示忽略用户请求中的If-Modified-Since头部;exact将If-Modified-Since头部包含的时间与将要返回的文件上次修改的时间做精确比较;before等于或者早于

4)文件未找到时是否记录到error日志

         a、语法:log_not_foundon | off;

         b、默认:on

         c、配置块:http、server、location

5)merge_slashes

         a、语法:merge_slasheson | off

         b、默认:on

         c、配置块:http、server、location

是否合并相邻的“/”

6)DNS解析地址

         a、语法:resolveraddress…;

         b、配置块:http、server、location

7)DNS解析的超时时间

         a、语法:resolver_timeouttime

         b、默认:30s

         c、配置块:http、server、location

8)返回错误页面时是否在Server中注明Nginx版本

         a、语法:server_tokenson | off

         b、默认:on

         c、配置块:http、server、location

 

18、ngx_http_core_module模块提供的变量

1)$arg_PARAMETER HTTP 请求中某个参数的值,如/index.php?site=www.ttlsa.com,可以用2)$arg_site取得www.ttlsa.com这个值. 

3)$args HTTP 请求中的完整参数。例如,在请求/index.php?width=400&height=200 中,$args表示字符串width=400&height=200. 

4)$binary_remote_addr 二进制格式的客户端地址。例如:\x0A\xE0B\x0E 

5)$body_bytes_sent 表示在向客户端发送的http响应中,包体部分的字节数 

6)$content_length 表示客户端请求头部中的Content-Length字段 

7)$content_type 表示客户端请求头部中的Content-Type字段 

8)$cookie_COOKIE 表示在客户端请求头部中的cookie字段 

9)$document_root 表示当前请求所使用的root配置项的值 

10)$uri 表示当前请求的URI,不带任何参数 

11)$document_uri 与$uri 含义相同 

12)$request_uri 表示客户端发来的原始请求URI,带完整的参数。$uri和$document_uri未必是用户的原始请求,在内部重定向后可能是重定向后的URI,而$request_uri 永远不会改变,始终是客户端的原始URI. 

13)$host 表示客户端请求头部中的Host字段。如果Host字段不存在,则以实际处理的server(虚拟主机)名称代替。如果Host字段中带有端口,如IP:PORT,那么$host是去掉端口的,它的值为IP。$host 是全小写的。这些特性与http_HEADER中的http_host不同,http_host只取出Host头部对应的值。  

14)$hostname 表示 Nginx所在机器的名称,与gethostbyname调用返回的值相同  

15)$http_HEADER 表示当前 HTTP请求中相应头部的值。HEADER名称全小写。例如,示请求中Host头部对应的值用 $http_host表  

16)$sent_http_HEADER 表示返回客户端的 HTTP响应中相应头部的值。HEADER名称全小写。例如,用$sent_ http_content_type表示响应中 Content-Type头部对应的值  

17)$is_args 表示请求中的 URI是否带参数,如果带参数,$is_args值为 ?,如果不带参数,则是空字符串  

18)$limit_rate 表示当前连接的限速是多少,0表示无限速  

19)$nginx_version 表示当前 Nginx的版本号  

20)$query_string 请求 URI中的参数,与 $args相同,然而$query_string是只读的不会改变  

21)$remote_addr 表示客户端的地址  

22)$remote_port 表示客户端连接使用的端口  

23)$remote_user 表示使用 AuthBasic Module时定义的用户名  

24)$request_filename 表示用户请求中的 URI经过 root或 alias转换后的文件路径  

25)$request_body 表示 HTTP请求中的包体,该参数只在proxy_pass或 fastcgi_pass中有意义  

26)$request_body_file 表示 HTTP请求中的包体存储的临时文件名  

27)$request_completion 当请求已经全部完成时,其值为 “ok”。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用 HTTP range访问的并不是文件的最后一块,那么其值也是空字符串。 

28)$request_method 表示 HTTP请求的方法名,如 GET、PUT、POST等  

29)$scheme 表示 HTTPscheme,如在请求 https://nginx.com/中表示 https  

30)$server_addr 表示服务器地址  

31)$server_name 表示服务器名称  

32)$server_port 表示服务器端口  

33)$server_protocol 表示服务器向客户端发送响应的协议,如 HTTP/1.1或 HTTP/1.0 

 

19、反向代理方式:指用代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外的表现就是一个web服务器

 

20、nginx和squid比较

比较项

特点

优点

缺点

nginx

先缓存请求,再发到业务服务器

内网速度快,降低业务服务器压力

增加一份内网请求时间

squid

边接收请求,边发业务服务器

整体响应速度慢

业务服务器压力大

 

21、负载均衡是指选择一种策略,尽量把请求平均地分布到每一台上游服务器上。

1)upstream块

         a、语法:upstreamname

         b、配置块:http

upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用。

2)server

         a、语法:servername[parameters];

         b、配置块:upstream

server配置项指定了一台上游服务器的名字,这个名字可以是域名、IP地址端口、UNIX句柄

参数:

         a、weight=number:转发的权重,默认1

         b、max_fails=number:默认1,设为0表示不检查失败次数

         c、fail_timeout=time:指定时间段内失败max_fails次就认为不可用,默认10秒

         d、down:表示上游服务器永久下线,只在使用ip_hash配置项时才有用

         e、backup:上游服务器是备份服务器,使用ip_hash配置项时它无效

3)ip_hash

         a、语法:ip_hash;

         b、配置块:upstream

ip_hash与weight不可同时使用,不可用服务器不可直接删除要使用down标记

4)记录日志时支持的变量:将负载均衡的一些信息记录到access_log日志中

         a、$upstream_addr:处理请求的上游服务器地址

         b、$upstream_cache_status:表示是否命中缓存

         c、$upstream_status:上游服务器返回的响应中的HTTP响应码

         d、$upstream_response_time:上游服务器的响应时间,精度毫秒

         e、$upstream_http_$HEADER:HTTP的头部

 

22、反向代理的基本配置

1)proxy_pass

         a、语法:proxy_passURL;

         b、配置块:location、if

将当前请求反向代理到URL参数指定的服务器上

注:默认情况下反向代理是不会转发请求中的Host头部,若要转发需加proxy_set_header $host;

2)proxy_method:转发时的协议方法名

         a、语法:proxy_methodmethod;

         b、配置块:http、server、location

3)proxy_hide_header

         a、语法:proxy_hide_headerthe_header

         b、配置块:http、server、location

指定哪些头部字段不能转发

4)proxy_pass_header

         a、语法:proxy_pass_headerthe_header

         b、配置块:http、server、location

将原来禁止转发的header设置为允许转发

5)是否向上游服务器发送HTTP包体的部分

a、语法:proxy_pass_request_bodyon | off

b、默认:on

c、配置块:http、server、location

6)是否转发HTTP头部

a、语法:proxy_pass_request_headerson | off

b、默认:on

c、配置块:http、server、location

7)proxy_redirect

a、语法:proxy_redirect[default|off|redirect replacement];

b、默认:default;

c、配置块:http、server、location

响应是重定向或刷新请求,可以重设HTTP头部的location或refresh字段

8)proxy_next_upstream

         a、语法:proxy_next_upstream

[error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];

         b、默认:errortimeout;

c、配置块:http、server、location

当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求

三、开发一个简单的HTTP模块

1、数据类型

         1)ngx_int_t:有符号整型

         2)ngx_uint_t:无符号整型

         3)ngx_str_t:字符串

         4)ngx_list_t:链表容器(二维数组)

         5)ngx_list_part_t:链表的一个元素(一维数组)

         6)ngx_table_elt_t:哈希键值对

         7)ngx_buf_t:缓冲区(处理大数据的关键数据结构,既应用与内存数据也应用于磁盘数据)

         8)ngx_chain_t:与ngx_buf_t配合使用的链表数据结构

 

2、将第三方模块编译到Nginx中:1)把源代码文件全部放到一个目录下;2)在该目录中编写一个文件用于通知Nginx如何编译本模块

注:这个文件名必须为config

 

3、处理用户请求

1)处理方法的返回值:正常的HTTP返回码,Nginx就会按照规范构造合法的响应包发送给用户

2)获取URI和参数:方法名、URI、URI参数、协议版本

3)获取HTTP头部

4)获取HTTP包体:异步地接收包体

 

4、发送响应:响应行、响应头部、包体

注:发送HTTP头部时也会发送响应行

四、配置、error日志和请求上下文

1、-s reload命令:在不重启服务的情况下可使配置生效

 

2、每一个http块、server块或location块下,都会生成独立的数据结构来存放配置项

注:可根据upstream中的设置,通过回调选取自己感兴趣的配置项保存在结构体中

五、访问第三方服务

1、Nginx提供两种全异步访问第三方服务的方式:upstream和subrequest。

 

2、upstream:在与第三方服务器交互时,不会阻塞Nginx进程处理其他请求,被定义为访问上游服务器。

 

3、subrequest:是分解复杂请求的一种设计模式,底层也是基于upstream实现的,将一个复杂的请求分解为多个子请求,每个子请求负责一种功能,而最初的原始请求负责构成并发送响应给客户端。

六、开发一个简单的HTTP过滤模块

1、HTTP模块两种介入方法:

1)任一个HTTP模块会对多有的用户请求产生作用

2)只对请求的URI匹配了nginx.conf中某些location表达式下的HTTP模块起作用

七、Nginx提供的高级数据结构

1、Nginx提供的6个基本容器:

1)双向链表:把已经分配好内存的元素用双向链表连接起来

2)动态数组:连续的内存存放着大小相同的元素,支持随机访问

3)单向链表:负责容器内元素内存的分配

4)红黑树:快速检索的容器

5)基数树:必须以整型数据作为关键字,与红黑树都是二叉查找树,插入、删除效率比红黑树高

6)支持通配符的散列表

 

2、红黑树:一种每个节点都带有颜色的自平衡二叉查找树,特性:

1)节点时红色或黑色

2)根节点是黑色

3)所有叶子节点都是黑色

4)每个红色节点的两个子节点都是黑色(每个叶子节点到根节点的所有路径上不能有两个连续的红色节点)

5)从任一节点到其每个叶子节点的所有简单路径都包含相同数目的黑色节点

注:自平衡二叉查找树:指在不断地向二叉查找树中添加、删除节点时,二叉查找树自身通过形态的变换,始终保持这一定程度上的平衡。

 

3、基数树:要求存储的每个节点都必须以32位整型作为区别任意两个节点的唯一标识,每一个节点的key已经决定了这个节点处于数中的位置,先将这个节点的整型关键字转化为二进制,从左向右数这32个位,遇到0时进入左子树,遇到1时进入右子树。最大深度是32。

注:1)为了减少树的高度,加入了掩码的概念,掩码中为1的位节点关键字中有效的位数同时也决定了树的有效高度。

2)不关心树的形态是否平衡,插入、删除节点的速度比红黑树要快得多

 

4、支持通配符的散列表:前置通配符和后置通配符,将非通配符的字符串作为key,根据通配符的位置,去前置或后置通配符中查找。

 

5、散列碰撞解决方法:

1)分离链接法:链表的形式

2)开放寻址法:不命中,则遍历找

注:Nginx使用连续非空槽存储碰撞元素的方法。

八、Nginx基础架构

1、Web服务器设计中的关键约束

1)性能:

         a、网络性能:指在不同负载下,Web服务器在网络通信上的吞吐量

         b、延迟性:指服务器初次接收到一个用户请求直至返回响应之间持续的时间

         c、网络效率

2)可伸缩性:指架构可以通过添加组件来提升服务,或者允许组件之间具有交互功能。

3)简单性:组件的简单程度

4)可修改性:在当前架构下对于系统功能做出修改的难易程度

5)可见性:指一些关键组件的运行情况可以被监控的程度

6)可移植性:服务可以跨平台运行

7)可靠性:出现部分故障时,一个架构容易受到系统层面故障影响的程度。

注:通常增加可靠性可以:避免单点故障、增加冗余、允许监视、可恢复动作

 

2、Nginx的架构基础是高度模块化设计,特点:

1)高度抽象的模块接口

2)模块接口非常简单,具有很高的灵活性

3)配置模块的设计

4)核心模块接口的简单化

5)多层次、多类别的模块设计

 

3、事件驱动架构:指由一些事件发生源来产生事件,由一个或者多个事件收集器来收集、分发事件,然后许多事件处理器会注册自己感兴趣的事件,同时会消费这些事件。

注:事件消费者是某个模块

九、事件模块

 

未完待续。。。。。。


你可能感兴趣的:(读书笔记)