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
nginx里的rewrite跳转的实现
Mar 31 Servers
centos8安装nginx1.9.1的详细过程
Aug 02 Servers
Linux安装apache服务器的配置过程
Nov 27 Servers
nginx中封禁ip和允许内网ip访问的实现示例
Mar 17 Servers
iSCSI服务器CHAP双向认证配置
Apr 01 Servers
OpenStack虚拟机快照和增量备份实现方法
Apr 04 Servers
Linux中如何安装并部署Redis
Apr 18 Servers
nginx日志格式分析和修改
Apr 28 Servers
Nginx安装配置详解
Jun 25 Servers
nginx之queue的具体使用
Jun 28 Servers
Zabbix对Kafka topic积压数据监控的解决方案
Jul 07 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
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
js操作浏览器的参数方法
2017/01/21 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
python ansible服务及剧本编写
2017/12/29 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
Python 互换字典的键值对实例
2019/02/12 Python
python enumerate内置函数用法总结
2020/01/07 Python
python代码中怎么换行
2020/06/17 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
Python调用Redis的示例代码
2020/11/24 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
小学生感恩老师演讲稿
2014/08/28 职场文书
我的中国心演讲稿
2014/09/04 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记