搜索
首页后端开发php教程nginx HTTP模块组成

原文链接:http://cjhust.blog.163.com/blog/static/17582715720124544047608/

1、数据结构

ngx_conf_s

struct ngx_conf_s {

    char                 *name; 

    ngx_array_t          *args;             //指令参数,从文件读入并放入这个数组

 

    ngx_cycle_t          *cycle;            //指向系统参数

    ngx_pool_t           *pool;              //内存池

    ngx_pool_t           *temp_pool;

    ngx_conf_file_t      *conf_file;      //配置文件信息 “./conf/main.conf”

    ngx_log_t            *log;                 //日志

 

    void                 *ctx;                    //(void ****)cycle->conf_ctx,装的是所有模块的配置信息

    ngx_uint_t            module_type;  //处理当前指令的模块的类型

    ngx_uint_t            cmd_type;       //处理这个指令的命令的类型

 

    ngx_conf_handler_pt   handler;     //指令处理函数

    char                 *handler_conf;     //这个是配合上面的handler使用

};

备注:该结构体主要用于读取配置时候,从配置文件和系统参数之间,ngx_conf_s起着桥梁的作用。

ngx_http_conf_ctx_t

typedef struct {

    void        **main_conf;

    void        **srv_conf;

    void        **loc_conf;

} ngx_http_conf_ctx_t;

备注:HTTP block中的配置结构主要分为3中,mainserver{}location{}

ngx_http_module_t

typedef struct {

    ngx_int_t   (*preconfiguration)(ngx_conf_t *cf);

    ngx_int_t   (*postconfiguration)(ngx_conf_t *cf);

 

    void       *(*create_main_conf)(ngx_conf_t *cf);

    char       *(*init_main_conf)(ngx_conf_t *cf, void *conf);

 

    void       *(*create_srv_conf)(ngx_conf_t *cf);

    char       *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);

 

    void       *(*create_loc_conf)(ngx_conf_t *cf);

    char       *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);

} ngx_http_module_t;

备注:HTTP模块中的ctx主要有上面8个函数组成。

ngx_command_s

struct ngx_command_s {

    ngx_str_t             name;

    ngx_uint_t            type;

    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

    ngx_uint_t            conf;

    ngx_uint_t            offset;

    void                 *post;

};

 

#define ngx_null_command  { ngx_null_string, 0, NULL, 0, 0, NULL }

2HTTP ctx

2.1 create_main_conf(ngx_conf_t *cf)

参数:ngx_conf_t *cf,配置结构体;

返回值:void *

备注:返回值可以作为ngx_http_conf_get_module_main_confgx_http _get_module_ main _conf的结果;

示例:

static void * ngx_http_barrier_create_conf(ngx_conf_t *cf)

{

  ngx_http_barrier_conf_t  *conf;   //自定义的一个结构

  conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_barrier_conf_t));  //init by pcalloc

  if (conf == NULL) {

    return NULL;

  }

 

  conf->enable = NGX_CONF_UNSET;

  return conf;                                         //返回自定义的结构

}

2.2 create_srv_conf(ngx_conf_t *cf)

参数:ngx_conf_t *cf,配置结构体;

返回值:void *

备注:返回值可以作为ngx_http_conf_get_module_srv_confgx_http _get_module_ srv_conf的结果;

示例:

static void * ngx_http_barrier_create_conf(ngx_conf_t *cf)

{

  ngx_http_barrier_conf_t  *conf;   //自定义的一个结构

  conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_barrier_conf_t));  //init by pcalloc

  if (conf == NULL) {

    return NULL;

  }

 

  conf->enable = NGX_CONF_UNSET;

  return conf;                                        //返回自定义的结构

}

2.3 create_loc_conf(ngx_conf_t *cf)

参数:ngx_conf_t *cf,配置结构体;

返回值:void *

备注:返回值可以作为ngx_http_conf_get_module_loc_confgx_http _get_module_loc_conf的结果;

示例:

static void * ngx_http_barrier_create_conf(ngx_conf_t *cf)

{

  ngx_http_barrier_conf_t  *conf;   //自定义的一个结构

  conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_barrier_conf_t));  //init by pcalloc

  if (conf == NULL) {

    return NULL;

  }

 

  conf->enable = NGX_CONF_UNSET;

  return conf;                                        //返回自定义的结构

}

2.4 preconfiguration(ngx_conf_t *cf)

参数:ngx_conf_t *cf,配置结构体;

返回值:ngx_int_t

备注:返回值只是作为操作是否正确的一个判断;

示例:

static ngx_int_t

ngx_http_ssl_add_variables(ngx_conf_t *cf)

{

    ngx_http_variable_t  *var, *v;

 

    for (v = ngx_http_ssl_vars; v->name.len; v++) {

        var = ngx_http_add_variable(cf, &v->name, v->flags);

        if (var == NULL) {

            return NGX_ERROR;

        }

 

        var->get_handler = v->get_handler;

        var->data = v->data;

    }

 

    return NGX_OK;

}

2.5 init_main_conf(ngx_conf_t *cf, void *conf)

参数:ngx_conf_t *cfconfconfcreate_main时的返回值,在这里作为参数;

返回值:char *NGX_CONF_OK表示成功;

备注:返回值只是作为操作是否正确的一个判断;

示例:

static char *

ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf)

{

    ngx_http_core_main_conf_t *cmcf = conf;

//create_main时是未配置

if (cmcf->server_names_hash_max_size == NGX_CONF_UNSET_UINT) {

        cmcf->server_names_hash_max_size = 512;    //这里是init

    }

 

    if (cmcf->server_names_hash_bucket_size == NGX_CONF_UNSET_UINT) {

        cmcf->server_names_hash_bucket_size = ngx_cacheline_size;

    }

 

    cmcf->server_names_hash_bucket_size =

            ngx_align(cmcf->server_names_hash_bucket_size, ngx_cacheline_size);

 

 

    if (cmcf->variables_hash_max_size == NGX_CONF_UNSET_UINT) {

        cmcf->variables_hash_max_size = 512;

    }

 

    if (cmcf->variables_hash_bucket_size == NGX_CONF_UNSET_UINT) {

        cmcf->variables_hash_bucket_size = 64;

    }

 

    cmcf->variables_hash_bucket_size =

               ngx_align(cmcf->variables_hash_bucket_size, ngx_cacheline_size);

 

    if (cmcf->ncaptures) {

        cmcf->ncaptures = (cmcf->ncaptures + 1) * 3;

    }

 

    return NGX_CONF_OK;

}

2.6 merge_srv_conf(ngx_conf_t *cf, void *prev, void *conf)

参数:ngx_conf_t *cf,配置结构体,prevmain的配置结构体,confserver的配置结构体;prev=cf->ctx.srv_conf[ctx_index],c/span>

返回值:char *,正确返回值是NGX_CONF_OK

备注:返回值只是作为操作是否正确的一个判断;

示例:

static char * ngx_http_barrier_merge_conf(ngx_conf_t *cf, void *parent, void *child)

{

  ngx_http_barrier_conf_t *prev = parent;

  ngx_http_barrier_conf_t *conf = child;

 

  if (conf->shm_zone == NULL){

     *conf = *prev;

  }

 

  ngx_conf_merge_value(conf->enable, prev->enable, 0);  //default is 0

  return NGX_CONF_OK;

}

备注:merge server的主要功能是,如果main里配置了enable=1,而server{}enable= NGX_CONF_UNSET,则将serverenable=mainenable=1

2.7 merge_loc_conf(ngx_conf_t *cf, void *prev, void *conf)

原理同merge_srv_conf(ngx_conf_t *cf, void *prev, void *conf)

2.8 postconfiguration(ngx_conf_t *cf)

参数:ngx_conf_t *cf

返回值:ngx_int_t,正确返回值是NGX_OK

备注:返回值只是作为操作是否正确的一个判断;

示例:

static ngx_int_t ngx_http_tracker_init(ngx_conf_t *cf)

{

  ngx_tracker_flag = 0;

  return NGX_OK;

}

备注:将全局变量flag清零,用于判断是否有barrier模块。如果不清零,将会导致如果配置中没有添加barrier zone,在kill –HUP时,由于全局变量flag值不变,即不为0 用户在执行traker指令时,出现段错误。

3HTTP commands

4、常用变量

#define NGX_HTTP_MAIN_CONF        0x02000000      //指令存放位置

#define NGX_HTTP_SRV_CONF         0x04000000

#define NGX_HTTP_LOC_CONF         0x08000000

#define NGX_HTTP_UPS_CONF         0x10000000

#define NGX_HTTP_SIF_CONF         0x20000000

#define NGX_HTTP_LIF_CONF         0x40000000

#define NGX_HTTP_LMT_CONF         0x80000000

 

#define NGX_HTTP_MAIN_CONF_OFFSET  offsetof(ngx_http_conf_ctx_t, main_conf)

#define NGX_HTTP_SRV_CONF_OFFSET   offsetof(ngx_http_conf_ctx_t, srv_conf)

#define NGX_HTTP_LOC_CONF_OFFSET   offsetof(ngx_http_conf_ctx_t, loc_conf)

 

示例:

static ngx_command_t  ngx_http_print_commands[] = {

{

ngx_string("print"),

      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,    

      ngx_http_print_setup,       

      //set(),会转化读入指令传进来的参数,并将合适的值保存到配置结构体

      NGX_HTTP_LOC_CONF_OFFSET,

      offsetof(ngx_http_print_loc_conf_t, ed),

      NULL

},

 

      ngx_null_command

};

5、常用函数

5.1 处理Request

ngx_http_get_module_main_conf

函数功能:根据request请求和模块得到main配置。

#define ngx_http_get_module_main_conf(r, module)                             \

(r)->main_conf[module.ctx_index]

ngx_http_get_module_srv_conf

函数功能:根据request请求和模块得到server配置。

#define ngx_http_get_module_srv_conf(r, module)  (r)->srv_conf[module.ctx_index]

ngx_http_get_module_loc_conf

函数功能:根据request请求和模块得到location配置。

#define ngx_http_get_module_loc_conf(r, module)  (r)->loc_conf[module.ctx_index] 

5.2 解析conf

ngx_http_conf_get_module_main_conf

函数功能:根据conf结构和模块得到main配置。

#define ngx_http_conf_get_module_main_conf(cf, module)                        \

((ngx_http_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index]

ngx_http_conf_get_module_srv_conf

函数功能:根据conf结构和模块得到server配置。

#define ngx_http_conf_get_module_srv_conf(cf, module)                         \

((ngx_http_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index]

ngx_http_conf_get_module_loc_conf

函数功能:根据conf结构和模块得到location配置。

#define ngx_http_conf_get_module_loc_conf(cf, module)                         \

 ((ngx_http_conf_ctx_t *) cf->ctx)->loc_conf[module.ctx_index]

5.3 Cycle

ngx_http_cycle_get_module_main_conf

#define ngx_http_cycle_get_module_main_conf(cycle, module)                    \

    (cycle->conf_ctx[ngx_http_module.index] ?                                 \

        ((ngx_http_conf_ctx_t *) cycle->conf_ctx[ngx_http_module.index])      \

            ->main_conf[module.ctx_index]:                                    \

        NULL)

 


以上就介绍了nginx HTTP模块组成,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
高流量网站的PHP性能调整高流量网站的PHP性能调整May 14, 2025 am 12:13 AM

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

PHP中的依赖注入:初学者的代码示例PHP中的依赖注入:初学者的代码示例May 14, 2025 am 12:08 AM

你应该关心DependencyInjection(DI),因为它能让你的代码更清晰、更易维护。1)DI通过解耦类,使其更模块化,2)提高了测试的便捷性和代码的灵活性,3)使用DI容器可以管理复杂的依赖关系,但要注意性能影响和循环依赖问题,4)最佳实践是依赖于抽象接口,实现松散耦合。

PHP性能:是否可以优化应用程序?PHP性能:是否可以优化应用程序?May 14, 2025 am 12:04 AM

是的,优化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)优化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,并避免使用

PHP性能优化:最终指南PHP性能优化:最终指南May 14, 2025 am 12:02 AM

theKeyStrategiestosiminificallyBoostphpapplicationPermenCeare:1)useOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)优化AtabaseInteractionswithPreparedStateTemtStatementStatementSandProperIndexing,3)配置

PHP依赖注入容器:快速启动PHP依赖注入容器:快速启动May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依赖注入与服务定位器PHP中的依赖注入与服务定位器May 13, 2025 am 12:10 AM

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

PHP性能优化策略。PHP性能优化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP电子邮件验证:确保正确发送电子邮件PHP电子邮件验证:确保正确发送电子邮件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。