概述
1.HTTP请求处理的11个阶段
阶段 | 功能 | 命令 | 注释 | 保留1 |
NGX_HTTP_POST_READ_PHASE | 读取请求内容阶段 | realip | post是指在读完header之后,realip是在刚读完头部之后,如果想要没有任何加工之前获取到一些原始值,这样的模块应该在此阶段 | |
NGX_HTTP_SERVER_REWRITE_PHASE | Server 请求地址重写阶段 | rewrite | ||
NGX_HTTP_FIND_CONFIG_PHASE | 配置查找阶段 | |||
NGX_HTTP_REWRITE_PHASE | Location 请求地址重写阶段 | rewrite | ||
NGX_HTTP_POST_REWRITE_PHASE | 请求地址重写提交阶段 | |||
NGX_HTTP_PREACCESS_PHASE | 访问权限检查准备阶段 | limit_conn,limit_req | 从系统层面看看释放能放这个访问进来,查看连接数和访问数是否超限 | |
NGX_HTTP_ACCESS_PHASE | 访问权限检查阶段 | auth_basic,access,auth_request | auth_basic针对用户名密码,access针对用户访问的IP,auth_request第三方服务返回是否可以访问 | |
NGX_HTTP_POST_ACCESS_PHASE | 访问权限检查提交阶段 | |||
NGX_HTTP_TRY_FILES_PHASE | 配置项 try_files 处理阶段 | try_file | mirror模块可以使得一个请求产生多个子请求 | |
NGX_HTTP_CONTENT_PHASE | 内容产生阶段 | index,autoindex,concat | static,反向代理等也都是在这个模块生效的,这个模块内容很多 | |
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] 。
最后
以上就是单纯小鸭子为你收集整理的【Nginx】http框架的执行流程的全部内容,希望文章能够帮你解决【Nginx】http框架的执行流程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复