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 相关文章推荐
如何利用map实现Nginx允许多个域名跨域
Mar 31 Servers
Nginx服务器如何设置url链接
Mar 31 Servers
zabbix自定义监控nginx状态实现过程
Nov 01 Servers
Nginx 路由转发和反向代理location配置实现
Nov 11 Servers
使用 Apache 反向代理的设置技巧
Jan 18 Servers
Nginx防盗链与服务优化配置的全过程
Jan 18 Servers
深入解析Apache Hudi内核文件标记机制
Mar 31 Servers
为Centos安装指定版本的Docker
Apr 01 Servers
OpenStack虚拟机快照和增量备份实现方法
Apr 04 Servers
nginx日志格式分析和修改
Apr 28 Servers
在容器中使用nginx搭建上传下载服务器
May 11 Servers
Linux下搭建SFTP服务器的命令详解
Jun 25 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批量生成缩略图的代码
2008/07/19 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
PHP编程一定要改掉的5个不良习惯
2020/09/18 PHP
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
原生JS和jQuery操作DOM对比总结
2017/01/19 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
Python中type的构造函数参数含义说明
2015/06/21 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
在Python中定义一个常量的方法
2018/11/10 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
美国老牌主机服务商:iPage
2016/07/22 全球购物
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
Linux的文件类型
2016/07/05 面试题
法语专业求职信
2014/07/20 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
2016银行求职自荐信
2016/01/28 职场文书
python requests模块的使用示例
2021/04/07 Python
Python并发编程实例教程之线程的玩法
2021/06/20 Python
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android