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
如何在centos上使用yum安装rabbitmq-server
Mar 31 Servers
Nginx进程管理和重载原理详解
Apr 22 Servers
配置nginx 重定向到系统维护页面
Jun 08 Servers
Tomcat用户管理的优化配置详解
Mar 31 Servers
OpenStack虚拟机快照和增量备份实现方法
Apr 04 Servers
阿里云k8s服务升级时502错误 springboot项目应用
Apr 09 Servers
Windows Server 2019 配置远程控制以及管理方法
Apr 28 Servers
Apache POI操作批量导入MySQL数据库
Jun 21 Servers
超越Nginx的Web服务器caddy优雅用法
Jun 21 Servers
vscode内网访问服务器的方法
Jun 28 Servers
修改Nginx配置返回指定content-type的方法
Sep 23 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中计算字符串相似度的函数代码
2012/12/29 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
详解vue-cli官方脚手架配置
2018/07/20 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
解析Python中的二进制位运算符
2015/05/13 Python
python生成器generator用法实例分析
2015/06/04 Python
Python的时间模块datetime详解
2017/04/17 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
中介业务员岗位职责
2014/04/09 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
分居协议书范本
2014/11/03 职场文书
导游词范文
2015/02/13 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python