【Nginx】http框架的执行流程

1.HTTP请求处理的11个阶段

阶段功能命令注释保留1
NGX_HTTP_POST_READ_PHASE读取请求内容阶段realippost是指在读完header之后,realip是在刚读完头部之后,如果想要没有任何加工之前获取到一些原始值,这样的模块应该在此阶段 
NGX_HTTP_SERVER_REWRITE_PHASEServer 请求地址重写阶段rewrite  
NGX_HTTP_FIND_CONFIG_PHASE配置查找阶段   
NGX_HTTP_REWRITE_PHASELocation 请求地址重写阶段rewrite  
NGX_HTTP_POST_REWRITE_PHASE请求地址重写提交阶段   
NGX_HTTP_PREACCESS_PHASE访问权限检查准备阶段limit_conn,limit_req从系统层面看看释放能放这个访问进来,查看连接数和访问数是否超限 
NGX_HTTP_ACCESS_PHASE访问权限检查阶段auth_basic,access,auth_requestauth_basic针对用户名密码,access针对用户访问的IP,auth_request第三方服务返回是否可以访问 
NGX_HTTP_POST_ACCESS_PHASE访问权限检查提交阶段   
NGX_HTTP_TRY_FILES_PHASE配置项 try_files 处理阶段try_filemirror模块可以使得一个请求产生多个子请求 
NGX_HTTP_CONTENT_PHASE内容产生阶段index,autoindex,concatstatic,反向代理等也都是在这个模块生效的,这个模块内容很多 
NGX_HTTP_LOG_PHASE日志模块处理阶段accesee_log  

2.11个阶段的处理顺序

灰色的rewrite->find_config->rewrite是Nginx的http框架执行,第三方模块没有机会
执行它们.

这个执行顺序不是绝对的,比如说:
(1)access阶段中有个指令satisfy可以指定当摸个指令满足直接
跳转到try_files,不会去执行auth_basic和auth_request.
(2)content阶段中如果index满足了,不会执行auto_index和static,直接
去执行access_log了.

3.realip

由于网络中存在许多反向代理,如果我们想要对真实的IP做限速和连接限制,必须要找到其真实的IP地址.
TCP连接四元组:SRC IP,SRC PORT,DST IP,DST PORT;


举例:
用户(局域网的IP:192.168.0.118)
ADSL(运营商公网IP:115.204.33.1)
CDN(IP地址:1.1.1.1)
某反向代理(IP地址:2.2.2.2)
Nginx想要知道的用户地址是115.204.33.1,但是remote_addr变量的地址是2.2.2.2

那么如何找到网络中真实的IP呢?
可以通过http协议中的X-Forwarded-For和X-Real-IP来做到.
在【某反向代理】那里,会受到来自CDN的新的请求连接,header中就包含着X-Forwarded-For和X-Real-
IP,里面记录着运营商的公网IP,这个是CDN添加的.
Nginx处的X-Forwarded-For和X-Real-IP:
X-Forwarded-For:115.204.33.1,1.1.1.1
X-Real-IP:115.204.33.1


Nginx中如何拿到真实用户IP?
经过realip模块以后,基于变量可到到真实的用户IP值(binary_remote_addr和remote_addr这样的变量值就是真实的IP).
在没有经过realip模块之前binary_remote_addr和remote_addr的IP是与Nginx直接连接的客户端的值;
拿到真实的用户IP后做连接限制(limit_conn模块)和限速才有意义.
这里我们也可以理解limit_conn一定要在preaccess阶段,而不能在postread阶段,它必须等待realip模块将真实的IP地址解析出来.


ngx_http_realip_module
http://nginx.org/en/docs/http/ngx_http_realip_module.html

Example Configuration
Directives
     set_real_ip_from
     real_ip_header
     real_ip_recursive
Embedded Variables
     $realip_remote_addr
     $realip_remote_port



Example Configuration
set_real_ip_from  192.168.1.0/24;
set_real_ip_from  192.168.2.1;
set_real_ip_from  2001:0db8::/32;
real_ip_header    X-Forwarded-For;
real_ip_recursive on;


set_real_ip_from
Syntax:set_real_ip_from address | CIDR | unix:;
Default:—
Context:http, server, location

CIDR
无类别域间路由(Classless Inter-Domain Routing CIDR)是一个用于给用户分配IP地址以及在互
联网上有效地路由IP数据包的对IP地址进行归类的方法.
unix:
unix地址


Syntax:	real_ip_header field | X-Real-IP | X-Forwarded-For | proxy_protocol;
Default:	
real_ip_header X-Real-IP;
Context:http, server, location


Syntax:	real_ip_recursive on | off;
Default:real_ip_recursive off;
Context:http, server, location
This directive appeared in versions 1.3.0 and 1.2.1.


 

 

 

 

名词解释

1.CIDR
无类别域间路由是基于可变长子网掩码(VLSM)来进行任意长度的前缀的分配的。在RFC 950(1985)中有
关于可变长子网掩码的说明。CIDR包括:指定任意长度的前缀的可变长子网掩码技术。遵从CIDR规则的地
址有一个后缀说明前缀的位数,例如 192.168.0.0/16。这使得对日益缺乏的IPv4地址的使用更加有效。
将多个连续的前缀聚合成超网,以及,在互联网中,只要有可能,就显示为一个聚合的网络,因此在总体
上可以减少路由表的表项数目。聚合使得互联网的路由表不用分为多级,又用VLSM reverses the 
process of "subnetting a subnet" 。 根据机构的实际需要和短期预期需要而不是分类网络中所限定的
过大或过小的地址块来管理IP地址的分配的过程。 因为在IPv6中也使用了IPv4的用后缀指示前缀长度的
CIDR,所以IPv4中的分类在IPv6中已不再使用 [1]  。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值