[Day4] Nginx Http模块二

一. POST_READ阶段

    1. 用户ip在http请求中的传递?

    前提:Tcp连接四元组(src ip,src port,dst ip,dst port)

              HTTP头部 X-Formarded-For 用于传递Ip

              HTTP头部X-Real-IP用于传递IP

              网络中存在许多反向代理

    客户端的请求往往不会直接到达客户端,而是会经过多个代理服务器 比如CDN、Nginx等。如果一个客户端请求经由Nginx与上游服务器通讯,建立Tcp连接,那么Tcp连接四元组中保存的src ip和src port都是Nginx代理服务器的。而我们要想做限流,就必须拿到用户的IP地址。在Http协议中,提供了两个请求头可以实现这个功能:X-Formarded-For、X-Real-IP。

     a)X-Formarded-For:保存每个节点的ip地址,形成一个链表

     b)X-Real-IP:保存第一个节点的ip地址

    

    2. Nginx如何拿到用户IP地址?realip模块。

    realip模块默认不会编译进Nginx,通过--with-http-realip-module启用功能

    realip模块提供了两个变量来获取ip地址:binary_remote_addr(二进制数据,size较小)、remote_addr

    指令:

        a)set_real_ip_from address|CIDR|unix:定义什么样的连接才替换变量

        b)real_ip_header field | X-Real-IP | X-Forward-For | proxy_protocol:定义变量从哪个header中取值

        c)real_ip_recursive on | off:定义是否使用环回地址。默认不启用。开启时,如果X-Forward-For的最后一个地址与客户端地址相同,会删去最后一个地址。

二. SERVER_REWRITE和REWRITE阶段

    这两个阶段所作的事情差不多,都是定制请求的后继行为,只不过配置的块不一样,作用域不一样。

    Rewrite模块

        提供了指令return、rewrite来改变客户端的行为,重定向或者直接返回状态码等。

        rewrite模块不可删除。

        1. return指令:向客户端返回信息

            a)return code [text]

            b)return code URL

            c)return URL

            思考:server与location下的return指令关系?

                      return与error_page指令的关系?

        2. rewrite指令:重写客户端请求

            a) rewrite regex replacement [flag]

                        1. 将regex指定的这个url替换成replacement这个新的url,可以使用正则表达式及变量提取

                        2. 当replacement以http://或者https://或者$schema开头,则直接返回302重定向

                        3. 替换后的url根据flag指定的方式进行处理

                            - last:用replacement这个URI进行新的location匹配

                            - break:break指令停止当前脚本指令的执行

                            - redirct:返回302重定向

                            - permanent:返回301重定向

                开启rewrite行为记入日志:rewrite_log on | off; 默认为off,所属块:http、server、location、if

                

    b)if(condition){ ... }:基于变量做重定向

                        1. 检查变量为空或者值是否为0,直接使用

                        2. 将变量与字符串做匹配,使用=或者!=

                        3. 将变量与正则表达式做匹配

                                大小写敏感,~或者!~

                                大小写不敏感,~*或者!~*

                        4. 检查文件是否存在,-f或者!-f

                        5. 检查目录是否存在,-d或者!-f

                        6. 检查是否为可执行文件,-x或者!-x

                        7. 检查文件、目录、软连接是否存在,使用-e或者!-e

三. FIND-CONFIG阶段

    寻找处理请求的location指令块。

    指令:location、merge_slashes

    1. location [ = | ~ | ~* | ^~] uri { ... }

    location指令规则:仅匹配URI,忽略参数    

    

猜你喜欢

转载自www.cnblogs.com/wang-yi-shan/p/11930328.html