Maison >Opération et maintenance >Nginx >Interpréter les principes de mise en œuvre sous-jacents du mécanisme de développement et d'extension de modules de Nginx

Interpréter les principes de mise en œuvre sous-jacents du mécanisme de développement et d'extension de modules de Nginx

WBOY
WBOYoriginal
2023-08-05 08:24:21825parcourir

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.

  1. Structure du module Nginx
    Un module Nginx standard est une bibliothèque de liens dynamiques, qui contient une série de fonctions de rappel qui seront appelées à des moments correspondants pendant l'exécution de Nginx. Un exemple de structure d'un module Nginx est le suivant :
#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.

  1. Fonction de rappel principale du module Nginx
    La fonction de rappel principale du module Nginx pointe vers la fonction correspondante via le pointeur dans la structure ngx_http_module_t. Voici quelques fonctions de rappel de base et exemples de code couramment utilisés :
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.

  1. Compilation et chargement du module Nginx
    Lors de la compilation du module Nginx, vous devez ajouter le paramètre --add-module=/path/to/module/directory à la commande configure et transmettre le répertoire de code source du module à la commande configure scénario. Utilisez ensuite la commande make pour compiler 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;
  1. Résumé
    À travers cet article, nous comprenons les principes sous-jacents de mise en œuvre du développement de modules Nginx et du mécanisme d'extension, et donnons quelques exemples de code. J'espère que les lecteurs pourront avoir une compréhension plus approfondie du développement et de l'expansion des modules Nginx et ajouter plus de fonctions à leurs projets.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn