Módulo de registro unificado API

NGINX evoluciona hacia la nube nativa, todo en  OpenNJet 


1.Demanda

Configuración del plano de control Con el aumento de los módulos dinámicos, cada módulo dinámico (la API declarativa usa /config) originalmente proporcionaba un método de configuración de ubicación. Con cada vez más elementos de configuración, es necesario proporcionar una entrada de módulo API unificada, que es controlada por cada uno. Módulo dinámico. El módulo se registra con el módulo API y, en tiempo de ejecución, llama al controlador registrado para procesarlo de acuerdo con la solicitud de función real.

2. Módulo API dinámico existente

2.1 Módulos separados de API existentes

njet-config-api-module
njet-http-sendmsg-module
njet-http-cache-quick-module
njet-health-check-helper
njet-http-dyn-server-api-module
njet-http-location-api-module
njet-http-range-api-module
njet-http-ssl-api-module
njet-http-upstream-api-module

2.2 Configuración del módulo dinámico existente (API declarativa y API imperativa):

server {
        listen       8081;
        
         //声明式api入口
        location /config {
            config_api;
        }       

        location /hc {
            health_check_api;
        }

        //upstream api
        location /api {
             api write=on;
        }

        location /kv {
            dyn_sendmsg_kv;
        }

        location /ssl {
            dyn_ssl_api;
        }

        location /range {
            dyn_range_api;
        }

        location /cache {
            cache_quick_api;
        }

        location /dyn_loc {
           dyn_location_api;
        }

        location /dyn_srv {
           dyn_server_api;
        }
  }

3. Solución de módulo de registro unificado

3.1 Entrada de configuración unificada (usando /api)


    server {
        listen       8081;
        
         #api 统一入口
        location /api {
            dyn_module_api;         #用于解析设置clcf->handler为统一入口handler
            
            #权限校验
            api_limit_except  /v1/dyn_loc {method};
            api_limit_except  /v1/range {method};
        }
        
        location /doc {
            doc_api;
        }
    }

3.2 El módulo api proporciona una interfaz de registro

•El módulo API se compila utilizando módulos estáticos y se inicializa en el proceso auxiliar Ctrl.

•api_module proporciona una interfaz de registro similar al módulo kv y guarda la clave y el controlador de cada módulo.

• Cada módulo registra el controlador de cada módulo según /v{versión}/{module_name} como clave. La primera versión es la versión 1. La clave de registro de cada módulo de API es la siguiente:

njet-config-api-module
    /v1/config

njet-http-sendmsg-module
    /v1/kv

njet-http-cache-quick-module
    /v1/cache

njet-health-check-helper
    /v1/hc

njet-http-dyn-server-api-module
    /v1/dyn_srv

njet-http-location-api-module
    /v1/dyn_loc

njet-http-range-api-module
   /v1/range

njet-http-ssl-api-module
   /v1/ssl

njet-http-upstream-api-module
   /v1/upstream_api

3.3 Proceso de la etapa de procesamiento del contenido del módulo API

• Cuando llega la solicitud http, la clave (/v{versión}/{module_name}) se analiza según la URL: /api/v{version}/{module_name}/{other}

•Compruebe si hay un controlador registrado según la clave, sin devolver el 404 directamente si lo encuentra, llame al controlador para su procesamiento;

4. esquema api_limit_except

4.1 Introducción a la directiva limit_except

   
Sintaxis: método limit_except…{…}
Por defecto -
Contexto: ubicación

Límites permitidos a los métodos HTTP dentro de una ubicación. El parámetro del método puede ser uno de los siguientes: GET, HEAD, POST, PUT, DELETE, MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK o PATCH. Permitir el método GET hace que también se permita el método HEAD. El acceso a otros métodos se puede limitar utilizando las directivas de los módulos ngx_http_access_module, ngx_http_auth_basic_module y ngx_http_auth_jwt_module (1.13.10):

limit_except GET {
    allow 192.168.1.0/32;
    deny  all;
}

Tenga en cuenta que esto limitará el acceso a todos los métodos excepto GET y HEAD.

4.2 esquema de instrucciones api_limit_except

4.2.1 Requisitos

Objetivo:

•Para el módulo api, agregue la directiva api_limit_except (se pueden configurar varios para establecer restricciones para diferentes módulos api)

características limit_except:

•La directiva limit_except puede controlar los permisos para la ubicación configurada. Cada función de ubicación está configurada con un limit_except. Esta directiva registrará un controlador para la verificación de permisos en la fase de acceso. Sólo después de pasar la verificación se puede llevar a cabo la fase de procesamiento de contenido posterior. .

•La directiva limit_except también generará una estructura de ubicación sin nombre en la memoria.

Por lo tanto, es necesario implementar una nueva directiva api_limit_except para lograr dos objetivos:

•Se pueden configurar varios elementos y se puede configurar un limit_except para las URL del módulo con diferentes configuraciones

•La ubicación de la API debe poder generar estructuras de ubicación que admitan múltiples nombres sin nombre en la memoria al mismo tiempo y poder llamar al control de acceso de permisos configurado limit_except correcto en función de la URL real cuando hay una solicitud http.

NOTAS:

Si se configura limit_except, se realizará la verificación de doble capa. Las reglas son las siguientes:

•la verificación limit_except tiene prioridad

•limit_except Si se requiere autenticación, utilice la autenticación de contraseña con limit_except

•limit_except Si está permitido, ingresará a la verificación de permisos de la configuración api_limit_except

4.2.2 Introducción a la directiva api_limit_except

   
Sintaxis: método api_limit_except module_key…{…}
Por defecto -
Contexto: ubicación

Agregue un parámetro module_key para limit_except. Este parámetro es el formato de prefijo de URL de cada módulo de API: comenzando con /api/v{versión}/{module_name}.

声明式api 模块前缀: /api/v1/config

kv模块: /api/v1/kv

cache加速:/api/v1/cache

健康检查: /api/v1/hc

动态VS: /api/v1/dyn_srv

动态location: /api/v1/dyn_loc

动态range: /api/v1/range

动态ssl: /api/v1/ssl

动态upstream: /api/v1/upstream_api

4.2.3 Ejemplo de configuración

•Cómo utilizar el comando htpasswd:

centos:
yum install -y httpd

ubuntu:
apt install -y apache2-utils

密码文件/root/bug/njet1.0/htpasswd 新增用户test 密码是123456
htpasswd -bc /root/bug/njet1.0/htpasswd test 123456

密码文件/root/bug/njet1.0/htpasswd_ssl 新增用户test2 密码是test2
htpasswd -bc /root/bug/njet1.0/htpasswd_ssl test2 test2
 server {
       listen       8081;
       
        #api 统一入口
       location /api {
           dyn_module_api;
           
           #dyn_loc 权限校验, 非GET请求需要校验
           api_limit_except  /v1/ssl GET {
              auth_basic "OpenNJet SSL API";
              auth_basic_user_file /root/bug/njet1.0/htpasswd_ssl;
           }
           
           #range 权限校验, 非PUT请求需要校验
           api_limit_except  /v1/range PUT {
              auth_basic "OpenNJet RANGE API";
              auth_basic_user_file /root/bug/njet1.0/htpasswd;
           }
           
           #其他url请求,不做权限校验
       }
       
       location /doc {
           doc_api;
       }

       location /metrics {
           vhost_traffic_status_display;
           vhost_traffic_status_display_format html;
       }

       location /adc {
           #return 200 "ok";
           content_by_lua_file scripts/http_register.lua;
       }
   }

5. Prueba

Los prefijos de interfaz de todas las API declarativas y API imperativas están unificados

5.1 archivo de configuración Ctrl

server {
    listen       8081;
    #api 统一入口
    location /api {
        dyn_module_api;
    }
    
    location /doc {
        doc_api;
    }
}

5.2 Prueba del módulo (la función permanece sin cambios, el único cambio es el cambio de URL de todos los módulos de API)

El prefijo de interfaz de todas las API declarativas y API imperativas se cambia para comenzar con /api/v{versión}/{module_name}

声明式api 模块前缀: /api/v1/config
kv模块: /api/v1/kv
cache加速:/api/v1/cache
健康检查: /api/v1/hc
动态VS: /api/v1/dyn_srv
动态location: /api/v1/dyn_loc
动态range: /api/v1/range
动态ssl: /api/v1/ssl
动态upstream|: /api/v1/upstream_api

5.2.1 Certificado SSL dinámico:/api/v1/ssl

imagen

5.2.2 Comprobación de estado: /api/v1/hc

imagen

5.2.3 Rango dinámico: /api/v1/range

imagen

5.2.4 aceleración de caché: /api/v1/cache

imagen

5.2.5 cuadrados: /api/v1/sq

imagen

5.2.6 API de configuración: /api/v1/config

5.3 prueba de verificación de permisos api_limit_except

5.3.1 Ejemplo de generación de un archivo de contraseña de verificación:

centos:
yum install -y httpd

ubuntu:
apt install -y apache2-utils

密码文件/root/bug/njet1.0/htpasswd 新增用户test 密码是123456
htpasswd -bc /root/bug/njet1.0/htpasswd test 123456

密码文件/root/bug/njet1.0/htpasswd_ssl 新增用户test2 密码是test2
htpasswd -bc /root/bug/njet1.0/htpasswd_ssl test2 test2

5.3.2 Configuración (tomando como ejemplo la prueba de ssl y range):

server {
        listen       8081;

        location /api {
            dyn_module_api;

            #针对 ssl 添加校验,用户名密码使用test2/test2
            api_limit_except  /v1/ssl GET {
               auth_basic "OpenNJet API";
               auth_basic_user_file /root/bug/njet1.0/htpasswd_ssl;
            }

            #针对 range 添加校验,用户名密码使用test/123456
            api_limit_except  /v1/range PUT {
               auth_basic "OpenNJet API";
               auth_basic_user_file /root/bug/njet1.0/htpasswd;
            }
            
            #如果同时配置了limit_except, 则优先判断limit_except权限配置,
            #如果limit_except 不检查,则会进入到api_limit_except 权限配置检查
            #limit_except GET{
            #   auth_basic "OpenNJet API";
            #   auth_basic_user_file /root/bug/njet1.0/htpasswd;
            #}
        }
   }     

5.3.3 Prueba:

5.3.3.1 Prueba de verificación SSL

Para SSL, el método GET no verifica, otros métodos verifican, por lo que llamar a la interfaz get no le permitirá ingresar la contraseña, llamar a la interfaz put le permitirá ingresar la contraseña. Solo pasará test2/test2 con la contraseña correcta. .

5.3.3.1.1 Obtener prueba: devolver el resultado directamente

imagen

5.3.3.1.2 Prueba PUT: debe ingresar una contraseña. El resultado se devolverá después de que la contraseña sea correcta.

Ingrese la contraseña correcta e ingrese a la etapa de procesamiento de contenido.

5.3.3.2 prueba de verificación de alcance

Para el rango, el método PUT no verifica, otros métodos verifican, por lo que llamar a la interfaz put no permitirá ingresar la contraseña, llamar a la interfaz get requerirá que se ingrese la contraseña. Solo se aprobará test/123456 con la contraseña correcta. .

5.3.3.2.1 Prueba GET: se requiere contraseña

GET requiere la contraseña test/123456

imagen

Ingrese la contraseña correcta y devuelva el resultado

imagen

5.3.3.2.2 Prueba PUT: no es necesario ingresar una contraseña, vaya directamente a la etapa de procesamiento de contenido

imagen

El motor de aplicaciones NJet  logra capacidades únicas de carga de configuración dinámica en tiempo de ejecución a través de la reconstrucción del kernel y es una nueva generación de motores de aplicaciones web de alto rendimiento . NJet tiene capacidades de procesamiento de planos de datos de alto rendimiento y programa múltiples funciones auxiliares, como agrupación en clústeres, alta disponibilidad, comprobaciones de estado activas y API declarativas a través del marco de servicio CoPilot exclusivo de NJet para facilitar la expansión de funciones y aislar los pares de funciones de gestión/control. Además del impacto en el plano de datos, el rendimiento del motor de aplicaciones NJet supera tres veces el del motor de aplicaciones Envoy recomendado por CNCF. Sitio web oficial del grupo de correo.   

¿Cuántos ingresos puede generar un proyecto desconocido de código abierto? El equipo chino de inteligencia artificial de Microsoft empacó colectivamente y se fue a los Estados Unidos, involucrando a cientos de personas. Huawei anunció oficialmente que los cambios de trabajo de Yu Chengdong estaban clavados en el "Pilar de la vergüenza de FFmpeg" durante 15 años. Hace, pero hoy tiene que agradecernos—— ¿Tencent QQ Video venga su humillación pasada? El sitio espejo de código abierto de la Universidad de Ciencia y Tecnología de Huazhong está oficialmente abierto para acceso externo : Django sigue siendo la primera opción para el 74% de los desarrolladores. El editor Zed ha logrado avances en el soporte de Linux. Un ex empleado de una conocida empresa de código abierto . dio la noticia: después de ser desafiada por un subordinado, la líder técnica se puso furiosa y grosera, fue despedida y quedó embarazada. La empleada Alibaba Cloud lanza oficialmente Tongyi Qianwen 2.5 Microsoft dona 1 millón de dólares a la Fundación Rust.
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/6606114/blog/11104034
Recomendado
Clasificación