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 相关文章推荐
使用Apache的rewrite
Mar 09 Servers
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
Mar 31 Servers
详解Nginx启动失败的几种错误处理
Apr 01 Servers
Apache Calcite 实现方言转换的代码
Apr 24 Servers
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
May 27 Servers
CKAD认证中部署k8s并配置Calico插件
Mar 31 Servers
Mac电脑OS系统下安装Nginx的详细教程
Apr 14 Servers
nginx实现多geoserver服务的负载均衡
May 15 Servers
ubuntu下常用apt命令介绍
Jun 05 Servers
Docker与K8s关系介绍不会Docker也可以使用K8s
Jun 25 Servers
使用 DataAnt 监控 Apache APISIX的原理解析
Jul 07 Servers
zabbix如何添加监控主机和自定义监控项
Aug 14 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
极典R601SW收音机
2021/03/02 无线电
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
python私有属性和方法实例分析
2015/01/15 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
python数值基础知识浅析
2019/11/19 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
摄影助理岗位职责
2014/02/07 职场文书
《英英学古诗》教学反思
2014/04/11 职场文书
产品推广策划方案
2014/05/10 职场文书
特教教师先进事迹
2014/05/21 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android