Interprétation des principes de mise en œuvre sous-jacents du mécanisme de développement et d'extension de modules de Nginx
Nginx est un serveur Web haute performance et un serveur proxy inverse très populaire. Son mécanisme de développement et d'extension de modules permet aux utilisateurs d'étendre facilement les fonctions de Nginx. Cet article analysera les principes de mise en œuvre sous-jacents du mécanisme de développement et d'extension de modules de Nginx et donnera quelques exemples de code.
#include <ngx_config.h> #include <ngx_core.h> #include <ngx_http.h> static ngx_int_t ngx_http_example_handler(ngx_http_request_t *r); static ngx_http_module_t ngx_http_example_module_ctx = { NULL, /* preconfiguration */ NULL, /* postconfiguration */ NULL, /* create main configuration */ NULL, /* init main configuration */ NULL, /* create server configuration */ NULL, /* merge server configuration */ NULL, /* create location configuration */ NULL /* merge location configuration */ }; ngx_module_t ngx_http_example_module = { NGX_MODULE_V1, &ngx_http_example_module_ctx, /* module context */ NULL, /* module directives */ NGX_HTTP_MODULE, /* module type */ NULL, /* init master */ NULL, /* init module */ NULL, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING }; static ngx_command_t ngx_http_example_commands[] = { { ngx_string("example"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, ngx_http_example_command, NGX_HTTP_LOC_CONF_OFFSET, 0, NULL }, ngx_null_command }; static ngx_http_module_t ngx_http_example_module_ctx = { NULL, /* preconfiguration */ NULL, /* postconfiguration */ NULL, /* create main configuration */ NULL, /* init main configuration */ NULL, /* create server configuration */ NULL, /* merge server configuration */ NULL, /* create location configuration */ NULL /* merge location configuration */ }; ngx_module_t ngx_http_example_module = { NGX_MODULE_V1, &ngx_http_example_module_ctx, /* module context */ ngx_http_example_commands, /* module directives */ NGX_HTTP_MODULE, /* module type */ NULL, /* init master */ NULL, /* init module */ NULL, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING };
Dans le code ci-dessus, nous pouvons voir que la structure ngx_module_t définit un module Nginx et spécifie le contexte du module et la fonction de rappel spécifiée. La structure ngx_http_module_t est utilisée pour la définition des modules HTTP.
static ngx_int_t ngx_http_example_handler(ngx_http_request_t *r) { ngx_int_t rc; ngx_buf_t *b; ngx_chain_t out; /* 创建一个输出缓冲区 */ b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); if (b == NULL) { return NGX_HTTP_INTERNAL_SERVER_ERROR; } out.buf = b; out.next = NULL; /* 设置输出缓冲区的内容 */ b->pos = (u_char *) "Hello, Nginx!"; b->last = b->pos + sizeof("Hello, Nginx!") - 1; b->memory = 1; b->last_buf = 1; /* 设置响应头部 */ r->headers_out.status = NGX_HTTP_OK; r->headers_out.content_length_n = sizeof("Hello, Nginx!") - 1; rc = ngx_http_send_header(r); /* 发送响应内容 */ if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { return rc; } return ngx_http_output_filter(r, &out); } static ngx_int_t ngx_http_example_init(ngx_conf_t *cf) { /* 获取http模块的ngx_http_core_module上下文 */ ngx_http_core_main_conf_t *cmcf; cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); /* 在ngx_http_core_module的处理请求的回调函数数组handlers中加入自定义回调函数 */ ngx_http_handler_pt *h; h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); if (h == NULL) { return NGX_ERROR; } *h = ngx_http_example_handler; return NGX_OK; }
Dans l'exemple de code ci-dessus, la fonction ngx_http_example_handler est la fonction qui gère réellement les requêtes HTTP. De plus, la fonction ngx_http_example_init est utilisée pour ajouter ngx_http_example_handler au tableau de fonctions de rappel de traitement des requêtes de Nginx.
Pour charger le module Nginx, vous pouvez utiliser la directive load_module dans le fichier de configuration Nginx pour spécifier le chemin du module. Par exemple :
load_module /path/to/module.so;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!