nginx对http请求处理的各个阶段详析


Posted in Servers onMarch 31, 2021

在编写nginx的http的模块的时候,需要在各个阶段对http请求做相应的处理,以达到不同的目的,比如请求发起的时候是否有访问权限、内容生成的时候进行过滤或者其它处理等等。如果在编译nginx模块内注册的处理阶段不正确会导致达不到想要的结果,比如你想处理内容的时候内容实际上这个时候是没有的,如此等等。

在nginx内部定义了多个阶段的类型以满足不同的处理要求(ngx_http_core_module.h中,不同版本不一样):

typedef enum {
 NGX_HTTP_POST_READ_PHASE = 0,
 
 NGX_HTTP_SERVER_REWRITE_PHASE,
 
 NGX_HTTP_FIND_CONFIG_PHASE,
 NGX_HTTP_REWRITE_PHASE,
 NGX_HTTP_POST_REWRITE_PHASE,
 
 NGX_HTTP_PREACCESS_PHASE,
 
 NGX_HTTP_ACCESS_PHASE,
 NGX_HTTP_POST_ACCESS_PHASE,
 
 NGX_HTTP_TRY_FILES_PHASE,
 NGX_HTTP_CONTENT_PHASE,
 
 NGX_HTTP_LOG_PHASE
} ngx_http_phases;

各对应的意思分别为:

NGX_HTTP_POST_READ_PHASE = 0  //读取请求阶段
NGX_HTTP_SERVER_REWRITE_PHASE //URI转换阶段
NGX_HTTP_FIND_CONFIG_PHASE   //查找相应的配置来执行阶段
NGX_HTTP_REWRITE_PHASE    //URI转换阶段(不太清楚此处)
NGX_HTTP_POST_REWRITE_PHASE  //对转换后的URL结果进行处理的阶段
NGX_HTTP_PREACCESS_PHASE   //权限检查准备阶段
NGX_HTTP_ACCESS_PHASE    //权限检查阶段
NGX_HTTP_POST_ACCESS_PHASE  //对权限检查结果进行处理阶段
NGX_HTTP_TRY_FILES_PHASE   //处理配置中的try_files阶段
NGX_HTTP_CONTENT_PHASE    //处理生成返回数据阶段(此处认为不太细,当然有filter也可以忽略)
NGX_HTTP_LOG_PHASE     //记录日志处理阶段,具体说明应当是请求完成后,关闭请求时处理

从这个配置中可以分析出来nginx在处理请求的整个流程,流程是从头执行到尾的,可见LOG是放在最后面执行,对于内容段的处理一般都是在filter模块中去做,在NGX_HTTP_LOG_PHASE阶段注册的处理段也不能获取到返回的数据,返回数据在发送至客户端后就直接给释放了。因此,在各个阶段处理时应当清楚这个阶段的数据准备情况。

正常情况下,我们可以通过如下的方式来注册我们自己的处理模块:

static ngx_int_t
ngx_http_xxx_init(ngx_conf_t *cf)
{
 ngx_http_handler_pt  *h;
 ngx_http_core_main_conf_t *cmcf;
 
 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
 
 h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
 if (h == NULL) {
 return NGX_ERROR;
 }
 
 *h = ngx_http_xxx_handler;
 
 return NGX_OK;
}

且ngx_http_xxx_up_handler的返回值只能是如下几个:

NGX_OK        //处理成功,进入下一阶段
NGX_DECLINED      //放弃处理
NGX_AGAIN || NGX_DONE  //处理完成,返回该值会触发请求
NGX_ERROR || NGX_HTTP_.. //处理错误或者HTTP的其它状态值

另外对于NGX_HTTP_CONTENT_PHASE阶段,实际上还有另外一种注册方式,Just like this:

static char *
ngx_http_xxx_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
 ngx_str_t     *value;
 ngx_url_t     u;
 ngx_http_core_loc_conf_t *clcf;
 
 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
 
 clcf->handler = ngx_http_xxx_handler;
 
 if (clcf->name.data[clcf->name.len - 1] == '/') {
 clcf->auto_redirect = 1;
 }
 
 return NGX_CONF_OK;
}

不过这样子,你要做的东西就太多了,更多的情况下考虑下upstream结合或者对请求进行特殊处理,比如对于分布式存储的分发,需要对请求处理和文件系统关联时、比如请求的数据直接交给特殊的SERVER来拿内容时。呵呵.

到此这篇关于nginx对http请求处理的各个阶段详析的文章就介绍到这了,更多相关nginx对http请求处理详析内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
使用nginx动态转换图片大小生成缩略图
Mar 31 Servers
Nginx解决前端访问资源跨域问题的方法详解
Mar 31 Servers
centos8安装nginx1.9.1的详细过程
Aug 02 Servers
Nginx虚拟主机的搭建的实现步骤
Jan 18 Servers
Z-Order加速Hudi大规模数据集方案分析
Mar 31 Servers
配置Kubernetes外网访问集群
Mar 31 Servers
Docker 镜像介绍以及commit相关操作
Apr 13 Servers
netty 实现tomcat的示例代码
Jun 05 Servers
Zabbix对Kafka topic积压数据监控的解决方案
Jul 07 Servers
彻底卸载VMware虚拟机的超详细步骤记录
Jul 15 Servers
Nginx如何配置多个服务域名解析共用80端口详解
Sep 23 Servers
Shell中的单中括号和双中括号的用法详解
Dec 24 Servers
Nginx服务器添加Systemd自定义服务过程解析
Mar 31 #Servers
nginx处理http请求实现过程解析
Mar 31 #Servers
Nginx服务器添加Systemd自定义服务过程解析
Mar 31 #Servers
nginx处理http请求实现过程解析
Mar 31 #Servers
Nginx开启Brotli压缩算法实现过程详解
Nginx配置SSL证书出错解决方案
Mar 31 #Servers
Nginx配置并兼容HTTP实现代码解析
Mar 31 #Servers
You might like
解析php入库和出库
2013/06/25 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
2020/08/19 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
Python基础之getpass模块详细介绍
2017/08/10 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
活动总结的格式
2014/05/07 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
学位证书委托书
2014/09/30 职场文书
诚信高考倡议书
2019/06/24 职场文书
导游词之上海东方明珠塔
2019/09/25 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
Python MNIST手写体识别详解与试练
2021/11/07 Python
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫