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代理如何解决前端跨域问题详析
Apr 02 Servers
nginx部署多前端项目的几种方法
May 25 Servers
Nginx+Tomcat负载均衡集群的实现示例
Oct 24 Servers
Apache Pulsar结合Hudi构建Lakehouse方案分析
Mar 31 Servers
Nginx禁止ip访问或非法域名访问
Apr 07 Servers
Window server 2012 R2 AD域的组策略相关设置
Apr 28 Servers
服务器SVN搭建图文安装过程
Jun 21 Servers
Windows Server 2022 超融合部署(图文教程)
Jun 25 Servers
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
Jul 15 Servers
Centos7 Shell编程之正则表达式、文本处理工具详解
Aug 05 Servers
Docker容器harbor私有仓库部署和管理
Aug 05 Servers
Valheim服务器 Mod修改安装教程 【ValheimPlus】
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中目录,文件操作详谈
2007/03/19 PHP
如何让CI框架支持service层
2014/10/29 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
2017/02/23 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
微信小程序wepy框架笔记小结
2018/08/08 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
python基于Selenium的web自动化框架
2019/07/14 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
群众路线教育党课主持词
2014/04/01 职场文书
解除财产保全担保书
2014/05/20 职场文书
政风行风整改方案
2014/10/25 职场文书
2015年维修工作总结
2015/04/25 职场文书
公司董事任命书
2015/09/21 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript
Python编写nmap扫描工具
2021/07/21 Python
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL