Nginx:处理HTTP请求

参考资料<深入理解Nginx>(陶辉)

处理HTTP请求

接着上一次的内容,本次将说明HTTP框架是如何召集负责具体功能的各HTTP模块合作处理请求的。

在http://www.cnblogs.com/runnyu/p/4918135.html的最后是通过ngx_http_process_request方法开始处理请求的,该方法流程如下图

2.设置读、写事件的回调方法为ngx_http_request_handler方法,请求的后续处理都是通过ngx_http_request_handler方法进行的。

6.设置ngx_http_request_t结构体的write_event_handler成员为ngx_http_core_run_phases方法。该方法可能会被多次调度来完成HTTP请求的处理。

7.调用ngx_http_core_run_phases回调方法,该方法执行流程如下

ngx_http_request_t结构体中的phase_handler成员(处理流程的核心)将决定执行到哪一阶段,关于该成员跟其相关的数据结构可以查看http://www.cnblogs.com/runnyu/p/4910952.html。

该回调方法的源码如下

void ngx_http_core_run_phases(ngx_http_request_t *r)
{
    ngx_int_t rc;
    ngx_http_phase_handler_t *ph;

    cmcf=ngx_http_get_module_man_conf(r,ngx_http_core_module);
    ph=cmcf->phase_engine.handlers;

    while(ph[phase_handler].checker){
        rc=ph[r->phase_handler].checker(r,&ph[r->phase_hanlder]);
        if(rc==NGX_OK){
            return;
        }
    }
}

只有当相应的checker方法返回NGX_OK时才将控制权交还给Nginx的事件模块,否则将继续执行(checker方法中会修改phase_handler成员以向下执行)。

当这个请求上对应的事件再次触发时,HTTP框架将回调ngx_http_request_handler方法开始处理请求(上面已经设置了该方法为其读、写事件的回调方法)。

下图是ngx_http_request_handler方法的流程

2.如果当前事件可写,将调用ngx_http_reqeust_t结构体中的write_event_handler方法。该方法在上面已经设置为ngx_http_core_run_phases,可见该方法会被多次调用。

Checker方法

checker方法是HTTP框架定义的,每一个HTTP处理阶段对应着相应着一个checker方法(有的阶段的checker方法一样),handler方法只有在checker方法中调用。

checker方法的主要任务在于,根据phase_handler执行某个HTTP模块实现的回调方法,并根据方法的返回值决定:

1.当前阶段是否已经结束

2.下次要执行的回调方法是哪一个

3.是立刻执行下一个回调方法还是先把控制权交还给epoll

下面介绍HTTP框架中其中两个checker方法的介绍

ngx_http_core_generic_phase

在前面的http://www.cnblogs.com/runnyu/p/4910952.html下面有该方法的介绍,下面只给出该方法的流程图

可见,checker方法主要是根据handler方法的返回值来改变phase_handler的值以用来控制handler方法的执行顺序的。

ngx_http_core_content_phase

ngx_http_core_content_phase是NGX_HTTP_CONTENT_PHASE阶段的checker方法。是我们开发HTTP模块时最常用的一个阶段。

其余10个阶段中各HTTP模块的handler方法都是放在全局ngx_http_core_main_conf_t结构体中,而该阶段的handler方法则可以放在ngx_http_core_conf_t结构体中,这就是按需挂载的基础

typedef struct ngx_http_core_loc_conf_s ngx_http_core_loc_conf_tstruct ngx_http_core_loc_conf_s {
    ...
    ngx_http_handler_pt handler;
    ...
}

在我们最初的开发的HTTP模块中:http://www.cnblogs.com/runnyu/p/4871866.html

当检测到mytest配置项后,调用ngx_http_mytest方法将上面ngx_http_core_loc_conf_t的handler成员设置为自己的handler函数,实现了按需挂载。

事实上,在NGX_HTTP_FIND_CONFIG_PHASE阶段就会把ngx_http_request_t结构体的content_handler成员设置为匹配请求URI的location下的ngx_http_core_loc_conf_t结构体的handler成员。

下面是该checker方法的流程图,可以看出是如何实现按需挂载的

时间: 2024-07-29 06:36:34

Nginx:处理HTTP请求的相关文章

【Nginx】HTTP请求的11个处理阶段

Nginx将一个HTTP请求分成多个阶段,以模块为单位进行处理.这样做的好处是使处理过程更加灵活.降低耦合度.HTTP框架将处理分成了11个阶段,各个阶段以流水线的方式处理请求.这11个HTTP阶段如下所示: typedef enum { NGX_HTTP_POST_READ_PHASE = 0, // 接收到完整的HTTP头部后处理的阶段 NGX_HTTP_SERVER_REWRITE_PHASE, // URI与location匹配前,修改URI的阶段,用于重定向 NGX_HTTP_FIND

Nginx如何处理一个请求

看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始: 1 server { 2 listen 80; 3 server_name example.org www.example.org; 4 ... 5 } 6 7 server { 8 listen 80; 9 server_name example.net www.example.net;

Nginx流量带宽请求状态统计(ngx_req_status)

介绍 ngx_req_status 用来展示 nginx 请求状态信息,类似于 apache 的 status, nginx 自带的模块只能显示连接数等等 信息,我们并不能知道到底有哪些请求.以及各 url 域名所消耗的带宽是多少. ngx_req_status 提供了这些功能 按域名. url. ip 等等统计信息 统计总流量 统计当前带宽\峰值带宽 统计总请求数量 安装   # cd /usr/local/src/ # wget "http://nginx.org/download/ngin

nginx限制客户端请求频率,防止恶意攻击

模块: ngx_http_limit_req_module 作用: 限制客户端请求频率,防止恶意攻击 配置示例: http { limit_req_zone $binary_remote_addr zone=req_perip:50m rate=10r/s; ... server { ... location /api/ { limit_req zone=req_perip burst=50 nodelay; limit_req_status 503; } } } 说明: 区域名称为req_pe

通过配置nginx 抵御不合法请求

ngx_http_limit_conn_module模块 使用此模块主要用来限制每秒请求数量,至于依据什么条件限制是由我们来自定义的.官方文档 Module ngx_http_limit_req_module中文翻译的 nginx限制请求数ngx_http_limit_req_module模块 文档讲的很详细了,大致说下:limit_req_zone $variable zone=name:size rate=rate;命令的意思是,以$variable变量为条件,起名为name,设置的存储空间

nginx处理web请求分析

一.基于域名的虚拟服务器 nginx首先确定使用哪一个server域来处理请求,下面的例子中有3个虚拟服务器监听*:80端口. server { listen 80; server_name nginx.org www.nginx.org; ... } server { listen 80; server_name nginx.net www.nginx.net; ... } server { listen 80; server_name nginx.com www.nginx.com; ...

Nginx 多进程连接请求/事件分发流程分析

Nginx使用多进程的方法进行任务处理,每个worker进程只有一个线程,单线程循环处理全部监听的事件.本文重点分析一下多进程间的负载均衡问题以及Nginx多进程事件处理流程,方便大家自己写程序的时候借鉴. 一.监听建立流程 整个建立监听socket到accept的过程如下图: 说明: 1.main里面调用ngx_init_cycle(src/core/ngx_cycle.c),ngx_init_cycle里面完成很多基本的配置,如文件,共享内存,socket等. 2.上图左上角是ngx_ini

nginx+tomcat重复请求

好久不写技术文章了,越发的觉得单纯的讲技术没啥意思.怪不得知乎越来越火,因为大家都喜欢看故事,不喜欢硬生生的技术文章.笔者今天就来就给大家讲故事:) 最近网站压力突然增大,把带宽都占满了,访问网页发现非常的慢,打开页面的速度也奇慢大概要十几秒.这种情况还是第一次遇到,感觉不是被攻击了就是被攻击了!下面是网站的流量截图,一共1M的带宽在15点左右的时候瞬间慢了,然后就是持续的在峰值左右徘徊. 当时的想法是莫非网站的访问量到达了一定程度要增加带宽了?可是通过看网站的统计数据,访问的人数并没有明显的增

nginx解析php请求为404

刚搭建了lnmp环境,发现如果讲我的程序放在某个文件夹的时候,然后nginx进行代理的时候竟然会是404: nginx配置如下: # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root /home/morequ/morequ-wordpress; fastcgi_pass 127.0.0.1:9000; fastcgi_index info.php; fastc