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配置之实现多台服务器负载均衡
Aug 02 Servers
Nginx反向代理至go-fastdfs案例讲解
Aug 02 Servers
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
Sep 25 Servers
Nginx实现负载均衡的项目实践
Mar 18 Servers
Nginx设置HTTPS的方法步骤 443证书配置方法
Mar 21 Servers
Windows Server 2012 修改远程默认端口3389的方法
Apr 28 Servers
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
Apr 29 Servers
在容器中使用nginx搭建上传下载服务器
May 11 Servers
Linux中文件的基本属性介绍
Jun 01 Servers
Python安装及建立虚拟环境的完整步骤
Jun 25 Servers
vscode远程免密登入Linux服务器的配置方法
Jun 28 Servers
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
Jul 15 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 MsSql server时遇到的中文编码问题
2009/06/11 PHP
高质量PHP代码的50个实用技巧必备(上)
2016/01/22 PHP
功能强大的php文件上传类
2016/08/29 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
JavaScript中null与undefined分析
2009/07/25 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
微信小程序 两种为对象属性赋值的方式详解
2017/02/23 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
python缩进区别分析
2014/02/15 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
Python如何实现机器人聊天
2020/09/10 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
办公室年终个人自我评价
2013/10/28 职场文书
年会搞笑主持词
2014/03/27 职场文书
初中信息技术教学计划
2015/01/22 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电