目录
6.1.如何限制每个客户端的并发连接数?==》ngx_http_limit_conn_module模块
6.2.如何限制每个客户端的每秒请求数? ==》ngx_http_limit_req_module模块
6.3.limit_req和limit_conn配置同时生效,哪个有效?

Http请求处理的11个阶段(实际流程):
可以查看nginx_modules.c文件中的ngx_module_names,configure执行完之后,我们会使用with/--without/--modules来添加模块,这些模块添加完成后,就会在ngx_module_names数组里面。他们出现的位置和顺序很关键。从左图和右图可以看出,在ngx_module_namse中先出现的会后执行。
11个阶段顺序处理,也可能会出现不按照此顺序执行,比如说可以指定固定阶段,比如access阶段,满足access就不处理auth_basic以及access相关的,继而处理content阶段。

realIp模块:可以帮助我们发现客户端的真实IP地址,这个为我们后面的限速/限流打下基础。
如何拿到真实的用户IP地址?

添加realIP模块后,nginx中的变量binary_remote_addr/remote_addr 的变量就会被X-Forwardded-For/X-Real-IP这些头部字段获取到的值覆盖,从而拿到真实的用户IP地址,这样就可以做限速和限流了。(所以limit_con阶段必须在POST_READ之后)
realip模块默认不会编译进入nginx,

1.return指令:

2.return指令与error_page:
当收到返回码的时候,可以重定向为另一个url,或者一个指定页面。

3.rewrite指令:

【eg】

当我们访问first路径下的3.txt的时候,会重定向到/third/3.txt,最终返回的是3.txt中的内容。
当直接访问/third/3.txt的时候,返回的是200 'third!'
4.rewrite模块中if指令

if条件的表达式

location匹配规则:


【eg】


因为limit_req模块在limit_conn模块之前,所以limit_req模块先生效
ngx_http_access_module模块

图中加上子网掩码的标识允许一段地址的访问,比如192.168.1.0/24
基于HTTP Basic Authentication协议进行用户名密码的认证,默认编译进nginx。
指令:

基于RFC(2617):HTTP Basic Authentication
客户端正常发送一个请求的额时候,nginx回复401,这个在客户端不会感知到,客户端会看到一个输入用户名和密码的界面 。在nginx中应用层协议会添加WWW-Authenticate关键字。


satisfy all; 必须所有access阶段的模块全部执行成功,才会继续向下执行
satisfy any; access阶段模块只要有一个返回成功,就可以继续向下执行

satisfy是框架指令,一定会执行,deny是access模块的指令,被框架所控制。deny和satisfy同时存在的时候,deny的优先级低于satisfy。所以下图所示,satisfy any;肯定会访问成功,即使有deny all;的操作。
同样,如果配置了allow all;是没有机会输入密码的,因为allow也是access模块的,配置了satisfy后,会优先于allow执行。

8.1 按序访问资源的try_files模块
eg:访问first资源的时候,若本机没有maintenance.html文件的时候,会访问html/->html/index.html->html.html都没有的时候,会访问@lasturl

mirror可以做简单的流量拷贝,对多个环境需要处理用户流量非常有帮助。


eg:root会将完整url映射到文件路径中,而alias只会讲location后的URL映射到文件路径
第一个location:会在访问路径之前添加html变为html/root/index.html
第二个location:访问/alias会直接访问html文件夹下的index.html,变成/html/index.html
第三个location: 会在访问html/first之后再次添加/root/1.txt变为 /html/first/1.txt/root/1.txt
第四个location:访问/alias/1.txt变成/html/first/1.txt
