Compartir tecnología

Proxy inverso de siete capas (capa de aplicación) de Nginx: proxy SCGI scgi_pass

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Proxy inverso de siete capas (capa de aplicación) de Nginx
Agente SCGI scgi_pass

- Información del artículo -
Autor: Li Juncai (jcLee95)
Visítame en CSDN: https://jclee95.blog.csdn.net
Mi sitio webhttp://estapagina.tech/
Correo electrónico: [email protected].
Shenzhen, China
Dirección de este artículo:https://blog.csdn.net/qq_28550263/article/details/140253307
Huawei:https://bbs.huaweicloud.com/blogs/XXXXXXXXX

[Introducción]: Nginx proporciona una variedad de soporte de proxy inverso de capa de aplicación, incluidos proxy_pass, uwsgi_pass, fastcgi_pass y scgi_pass, etc. Entre ellos, la directiva proxy_pass puede aceptar un parámetro URL para implementar un proxy inverso para el protocolo HTTP/HTTPS; uwsgi_pass se usa para proxy al servidor de aplicaciones uWSGI; fastcgi_pass se usa para proxy al servidor FastCGI; a la aplicación SCGI (Simple Common Gateway Interface). Estas directivas permiten a Nginx manejar de manera flexible diferentes tipos de servicios y aplicaciones de backend. El tema central de este artículo es scgi_pass.


Artículos relacionados:
Proxy inverso de siete capas de Nginx: proxy_pass inverso HTTP

Proxy inverso de siete capas de Nginx: proxy UWSGI uwsgi_pass
Proxy inverso de siete capas de Nginx: proxy SCGI scgi_pass
Proxy inverso de siete capas de Nginx: proxy FastCGI fastcgi_pass

Insertar descripción de la imagen aquí


1. Información general

1.1 ¿Qué es SCGI?

sggi(Interfaz de puerta de enlace común simple) el proxy esNginx Uno de los métodos de proxy inverso importantes admitidos. en,sggies una versión simplificadaCGI(Common Gateway Interface), diseñado para proporcionar una forma más eficiente de conectarseWeb Servidores y aplicaciones.con tradicionalCGIen comparación con,sggiAl utilizar conexiones persistentes y un formato de protocolo simplificado, la sobrecarga por solicitud se reduce significativamente.

sggiEl protocolo define una forma estandarizada deWeb Pasar información de solicitud y recibir respuestas entre el servidor y la aplicación. Utiliza un formato de texto simple para transmitir la información del encabezado de la solicitud, seguido del cuerpo de la solicitud (si corresponde).Este diseño hacesggiEs fácil de implementar y proporciona un buen rendimiento.

1.2 Escenarios de aplicación de SCGI

existirWebEn la arquitectura de la aplicación,sggiActuado comoWebservidor (comoNginx ) y aplicaciones de back-end.cuandoNginxrecibido del clienteHTTPCuando se solicita, puede convertir estas solicitudes ensggiformatear y luego pasarsggiEl protocolo se envía al servidor de aplicaciones backend.

Este enfoque es particularmente adecuado para aquellos que soportan de forma nativasggiLenguajes y marcos de programación de protocolos comoPitónalgunos deWebmarcos (por ej.Flupp)oRubíAlgunos servidores de aplicaciones (comoUnicornio ).mediante el usosggi, estas aplicaciones pueden evitarHTTPLa sobrecarga del análisis, procesamiento directo desdeWebsolicitudes al servidor, mejorando así el rendimiento general.

En aplicaciones prácticas,sggiLos escenarios de uso incluyen, entre otros:

  1. alto rendimientoWebAplicación: para aplicaciones que necesitan manejar una gran cantidad de solicitudes simultáneas,sggiPuede proporcionar mejor que el tradicional.CGIMejor interpretación.

  2. Procesos de larga duración: ciertas aplicaciones que necesitan mantener el estado o son de larga duración puedensggiyWebEl servidor mantiene una conexión persistente.

  3. Optimizaciones específicas del lenguaje: Es posible que se estén utilizando ciertos lenguajes o marcos de programaciónsggimostrar un mejor rendimiento o una implementación más sencilla.

por enNginxutilizada enscgi_passcomando, los administradores pueden colocar fácilmenteHTTPReenviar solicitud a soportesggi servidor de aplicaciones backend.Esto no solo simplifica el proceso de configuración sino que también brinda oportunidades de optimización.WebEl rendimiento de la aplicación proporciona flexibilidad.

2. Introducción al protocolo SCGI

2.1 Características del protocolo SCGI

sggi(Simple Common Gateway Interface) es un protocolo simplificadoCGIprotocolo, diseñado específicamente paraWeb Comunicación entre servidor y aplicación. Tiene las siguientes características destacadas:

Sencillez:sggi El protocolo utiliza un formato de texto simple para transmitir la información del encabezado de la solicitud, lo que hace que la implementación y depuración del protocolo sea relativamente sencilla. La filosofía de diseño del protocolo es mantenerlo simple y al mismo tiempo proporcionar suficiente funcionalidad.

Conexiones persistentes: frente a las tradicionalesCGIdiferente,sggi Admite conexiones persistentes.esto significa unsggi El servidor puede manejar múltiples solicitudes sin crear un nuevo proceso o hilo para cada solicitud. Esto reduce en gran medida la sobrecarga de recursos del sistema y mejora el rendimiento general.

Bajos gastos generales: debido asggi El diseño del protocolo es simple y genera poca sobrecarga adicional durante el procesamiento de solicitudes.Esto hacesggiEspecialmente adecuado para manejar alta concurrencia.WebEscenarios de aplicación.

flexibilidad:sggi El protocolo permite la transmisión de información de encabezado arbitraria, lo que proporciona a los desarrolladores una gran flexibilidad. Los desarrolladores pueden personalizar la información del encabezado según sea necesario para cumplir con los requisitos de aplicaciones específicas.

Independencia lingüística:sggi El diseño del protocolo es independiente del lenguaje de programación.Esto significa que se puede implementar en cualquier lenguaje de programación, permitiendo a los desarrolladores elegir el lenguaje que mejor se adapte a las necesidades de su proyecto.sggiservidor.

2.2 Protocolo SCGI frente a HTTP

A pesar desggiyHTTPse utilizan paraWebProtocolos de comunicación, pero tienen diferencias significativas en propósitos de diseño y escenarios de uso:

Usuarios objetivo:HTTPEl protocolo es utilizado principalmente por clientes (como navegadores) yWebcomunicación entre servidores, mientrassggiEl acuerdo se centra enWebComunicación entre el servidor y las aplicaciones backend.

Complejidad del protocolo:HTTPEl protocolo es relativamente complejo y contiene una gran cantidad de información de encabezado y métodos para admitir variosWeb Escena interactiva. A diferencia de,sggiEl protocolo es más simple y contiene solo la información necesaria para entregar solicitudes y respuestas.

Consideraciones de rendimiento: enWebUtilizado entre el servidor y la aplicación.sggien lugar deHTTPLa sobrecarga del análisis de protocolos se puede reducir porquesggi El formato es más sencillo y directo. Esto puede aportar importantes mejoras de rendimiento en escenarios de alta concurrencia.

Gestión de conexión:HTTP/1.1Se introdujo el concepto de conexiones persistentes, pero enWebUtilizado entre el servidor y la aplicación.HTTPEs posible que aún sea necesaria una gestión de conexión adicional.sggiEl soporte integrado para conexiones persistentes simplifica este proceso.

escenas a utilizar:HTTPEs el protocolo básico de Internet y es aplicable a variosWebescenario de comunicación.sggise utiliza principalmente paraWebComunicación interna entre servidores y aplicaciones back-end, especialmente en escenarios donde se requiere procesamiento de alto rendimiento.

2.3 Comparación entre SCGI y FastCGI

sggiyCGI rápidoTodoCGIUna versión mejorada deWeb Rendimiento de la aplicación. Tienen algunas similitudes, pero también algunas diferencias clave:

Complejidad del protocolo:sggiratio de acuerdoCGI rápidomás simple.sggiUtiliza un formato de texto simple para transmitir información del encabezado, mientrasCGI rápido Utilice formato binario.Esto hacesggiMás fácil de implementar y depurar, pero puede ser ligeramente inferior aCGI rápidoactuación.

  1. Multiplexación:CGI rápidoAdmite el manejo de múltiples solicitudes en una sola conexión (multiplexación), mientras quesggi Normalmente sólo se procesa una solicitud por conexión. Esto significa que en ciertos escenarios de alta concurrencia,CGI rápidoPodría funcionar mejor.

  2. Tipo de registro:CGI rápidoSe definen varios tipos de registros (p. ej.Entrada estándarSALIDA ESTÁNDARESTÉREOetc.), permitiendo un control más detallado.sggiSe adopta un enfoque más simple, centrándose principalmente en la transmisión de solicitudes y respuestas.

  3. Soporte de idiomas: debido aCGI rápido Cuanto más tiempo exista, más extendido será probablemente su soporte en varios lenguajes y marcos de programación. Sin embargo,sggiSu simplicidad hace que su implementación en algunos lenguajes sea potencialmente más sencilla.

  4. Rendimiento: en la mayoría de los casos,sggiyCGI rápido La diferencia de rendimiento no es significativa. La elección de qué protocolo utilizar a menudo depende de las necesidades específicas de la aplicación, el soporte del lenguaje de desarrollo y las preferencias personales.

3. directiva scgi_pass en Nginx

3.1 Sintaxis básica de la instrucción scgi_pass

existirNginxConfigurando,scgi_passLa directiva se utiliza para pasar la solicitud asggi Directivas clave para el servidor.se defineNginxal que se debe remitir la solicitudsggiServidor o grupo de servidores.

scgi_passLa sintaxis básica del comando es la siguiente:

scgi_pass address;
  • 1

en,addressPuede ser en las siguientes formas:

  1. nombre de dominio oPropiedad intelectualDirección más número de puerto:

Por ejemplo:scgi_pass localhost:9000;

en este caso,NginxLa solicitud se reenviará al servidor que se ejecuta en el host local y escucha en el puerto 9000.sggiservidor.

  1. UnixRuta del socket de dominio:

Por ejemplo:scgi_pass unix:/tmp/scgi.socket;

aquí,Nginxpasará lo especificadoUnixsocket de dominio consggi Comunicación del servidor.Este método se suele utilizarsggiservidor conNginxEjecutarlo en la misma máquina puede proporcionar un mejor rendimiento.

  1. Nombre del grupo de servidores ascendentes:

Por ejemplo:scgi_pass scgi_backend;

En este uso,scgi_backendes uno enNginx Un grupo de servidores ascendentes predefinido en el archivo de configuración. Esto le permite implementar funciones avanzadas como equilibrio de carga y conmutación por error.

scgi_passLas instrucciones suelen estar enlocationutilizado en bloques para manejar específicosURL camino. Por ejemplo:

location /scgi/ {
    scgi_pass localhost:9000;
    include scgi_params;
}
  • 1
  • 2
  • 3
  • 4

En este ejemplo, todos/scgi/Las solicitudes al principio se reenviarán al puerto local 9000.sggiservidor.

include scgi_params;La declaración contiene un archivo de configuración predefinido, que establece una serie desggi parámetro.Estos parámetros definenNginxcómoHTTPLa información de la solicitud se convierte ensggipreguntar.

Cabe resaltar quescgi_passLas directivas pueden combinarse con otrasNginx Las directivas se utilizan en combinación para lograr configuraciones más complejas.Por ejemplo, puedes usarifDeclaraciones condicionales para seleccionar diferentes opciones basadas en diferentes condicionessggiservidor:

location / {
    if ($request_method = POST) {
        scgi_pass localhost:9001;
    }
    scgi_pass localhost:9000;
    include scgi_params;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

En este ejemplo,CORREOLas solicitudes se reenvían al puerto 9001, mientras que todas las demás solicitudes se reenvían al puerto 9000.

3.2 Comparación entre scgi_pass y proxy_pass

scgi_passyproxy_passTodas son instrucciones de proxy inverso de uso común y todas reenvían solicitudes al servidor backend.

en,scgi_passDiseñado para usar con soportesggiProtocolo para la comunicación del servidor backend.sggies un simplificadoCGIprotocolo, diseñado paraWeb Comunicación eficiente entre servidores y aplicaciones. A diferencia de,proxy_passes una directiva más general que se puede utilizar para representar una variedad de protocolos, incluidosHTTPHTTPSCGI rápidoesperar.

En usoscgi_passhora,NginxrecibiráHTTPLa solicitud se convierte ensggiformatear y luego enviar al backendsggi servidor. Durante este proceso,Nginx Manejará la conversión del protocolo para garantizar que el servidor back-end pueda comprender y procesar correctamente la solicitud.yproxy_passPor lo general, se utiliza para reenviar la solicitud al servidor backend intacta sin conversión de protocolo.

Otra diferencia importante es cómo está configurado.scgi_passGeneralmente requiere cooperaciónscgi_paramdirectiva a utilizar para establecersggi Parámetros requeridos por el protocolo. Por ejemplo:

location /app/ {
    scgi_pass localhost:9000;
    include scgi_params;
    scgi_param SCRIPT_FILENAME /path/to/app$fastcgi_script_name;
}
  • 1
  • 2
  • 3
  • 4
  • 5

En este ejemplo,include scgi_paramsintroducido predefinidosggiparámetros, mientrasscgi_paramLas directivas se utilizan para establecer parámetros adicionales.

A diferencia de,proxy_passLa configuración suele ser más sencilla y directa:

location /api/ {
    proxy_pass http://backend_server;
}
  • 1
  • 2
  • 3

En términos de rendimiento,scgi_passyproxy_pass Cada uno tiene sus propias ventajas.Para uso específicamente diseñadosggiaplicación de protocolo,scgi_passpuede proporcionar un mejor rendimiento porque evitaHTTP sobrecarga del protocolo. Sin embargo,proxy_passSu versatilidad lo hace más flexible y puede adaptarse a varios servidores y protocolos backend.

La seguridad también es un aspecto a considerar.porquescgi_passdedicado asggi protocolo, que puede proporcionar una mejor seguridad en algunos casos porque limita la forma en que se comunica con el servidor backend.yproxy_passDebido a su versatilidad, es posible que se requiera una configuración adicional para garantizar la seguridad, especialmente cuando se manejan datos confidenciales.

En aplicaciones prácticas, opte por utilizarscgi_passaúnproxy_pass Depende principalmente de las características y requisitos de la aplicación backend.Si la aplicación backend está diseñada específicamente para usarsggiacuerdo, entoncesscgi_pass Podría ser una mejor opción.Si el backend es un estándarWebServidor o aplicación, no compatible ni requeridosggi,Entoncesproxy_passpuede ser más apropiado.

3.3 Cómo funciona scgi_pass

scgi_passLa instrucción esNginxutilizado en el procesamientosggi (Interfaz de puerta de enlace común simple) se solicitan instrucciones básicas. Su funcionamiento implica varios pasos, desde recibir la solicitud de un cliente hasta devolverle una respuesta procesada.

En primer lugar, cuandoNginxRecibido de un clienteHTTP Cuando se realiza una solicitud, decidirá cómo manejarla según las reglas del archivo de configuración.Si la solicitud coincide, usescgi_passel bloque de ubicación de la instrucción,Nginxcomenzarásggiflujo de procesamiento.

existirsggiDurante el proceso de procesamiento,NginxPrimero, crearemos elsggi Conexión del servidor.Esta conexión puede serProtocolo de control de tráficoenchufe oUnixSocket de dominio, dependiendo descgi_pass La dirección especificada en la instrucción. Si se utiliza un grupo de servidores ascendentes,NginxTambién se selecciona un servidor específico según el algoritmo de equilibrio de carga configurado.

Una vez establecida la conexión,NginxvoluntadHTTPLa solicitud se convierte ensggi Formato.Este proceso incluye la creaciónsggiEncabezado de solicitud y cuerpo de solicitud.sggiEl encabezado de la solicitud contiene una serie de pares clave-valor que proporcionan metadatos sobre la solicitud, como el método de solicitud, la ruta, la cadena de consulta y el cliente.Propiedad intelectual Dirección, etc.La mayor parte de esta información proviene del original.HTTPencabezados de solicitud, pero también puede incluirscgi_paramParámetros adicionales establecidos por el comando.

sggi El formato del encabezado de la solicitud es específico: comienza con un número que indica la longitud de todo el encabezado, seguido de dos puntos, luego una serie de pares clave-valor terminados con un carácter nulo y finalmente terminados con una coma.Por ejemplo, una simplificadasggiEl encabezado de la solicitud podría verse así:

70:CONTENT_LENGTH27SCGI1REQUEST_METHODGETquery_string,
  • 1

En este ejemplo, "70" representa la longitud total del encabezado, seguido de tres pares clave-valor:CONTENT_LENGTHSCGIyREQUEST_METHOD

Después de enviar el encabezado de la solicitud,Nginx Se envía el cuerpo de la solicitud (si lo hubiera).paraCONSEGUIRLas solicitudes generalmente no tienen cuerpo de solicitud, pero paraCORREOoPONERSolicitud, el cuerpo de la solicitud puede contener datos de formulario u otro tipo de contenido.

sggi Una vez que el servidor recibe la solicitud, la procesa y genera una respuesta.La respuesta se envía de vuelta a través de la misma conexión.NginxsggiEl formato de la respuesta es relativamente simple. Incluye encabezados y cuerpo de respuesta, separados por una línea en blanco.

NginxrecibiósggiDespués de la respuesta del servidor, se vuelve a convertir aHTTP Formato de respuesta.Este proceso incluye el análisissggiEncabezados de respuesta, configurados adecuadamenteHTTPencabezados de respuesta y luego pasar el cuerpo de la respuesta intacto al cliente.

en todo el proceso,Nginx Responsable también de gestionar el ciclo de vida de la conexión.Esto incluye el manejo de tiempos de espera de conexión, la administración de agrupaciones de conexiones (si está habilitado).keepalive ), manejar errores de red, etc. Si ocurre un error durante el procesamiento,NginxSe devolverá una respuesta de error adecuada al cliente según la configuración.

además,scgi_pass El proceso de trabajo no es bloqueante.esto significaNginxPuede procesar múltiplessggi solicitudes sin crear un nuevo proceso o hilo para cada solicitud.Este diseño haceNginxCapacidad para manejar eficientemente una gran cantidad de conexiones simultáneas.

4. Configure Nginx para usar scgi_pass

4.1 Ejemplo de configuración básica

existirNginxConfiguración mediascgi_pass El ejemplo básico es relativamente simple.Esta configuración permitiráNginxReenviar solicitudes de una ruta específica asggi servidor. A continuación se muestra un ejemplo de configuración básica:

Primero, abreNginxEl archivo de configuración principal, normalmente ubicado en/etc/nginx/nginx.confo/usr/local/nginx/conf/nginx.conf .En este archivo necesitamoshttpAgregar o modificar dentro de un bloqueserverpedazo.

existirserverbloque, agregaremos unlocationdirectiva para definir qué solicitudes deben remitirse asggi servidor.Por ejemplo, si queremos sumar todos/scgi/La solicitud inicial se reenvía al servidor que se ejecuta en el puerto local 9000.sggiServidor, puede utilizar la siguiente configuración:

http {
    server {
        listen 80;
        server_name example.com;

        location /scgi/ {
            scgi_pass localhost:9000;
            include scgi_params;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

En esta configuración,listen 80las instrucciones dicenNginxEscuche en el puerto 80 (estándarHTTPpuerto).server_nameLa directiva define el nombre de dominio al que debe responder este bloque de servidor.

location /scgi/bloque define todo/scgi/comienzoURL Todas las solicitudes deben procesarse.Dentro de este bloque usamosscgi_passcomando para especificarsggi La dirección y el puerto del servidor. En este ejemplo,sggiEl servidor se está ejecutando en la misma máquina (localhost) del puerto 9000.

include scgi_params;La declaración contiene un archivo de configuración predefinido, que establece una serie desggi parámetro.Estos parámetros definenNginxcómoHTTPLa información de la solicitud se convierte ensggi preguntar.Normalmente, este archivo se encuentra/etc/nginx/scgi_paramso/usr/local/nginx/conf/scgi_params

Si tusggiEl servidor requiere parámetros adicionales, que se pueden utilizarscgi_param comando para configurar.Por ejemplo, si necesita configurarSCRIPT_FILENAMELos parámetros se pueden configurar así:

location /scgi/ {
    scgi_pass localhost:9000;
    include scgi_params;
    scgi_param SCRIPT_FILENAME /path/to/your/scripts$fastcgi_script_name;
}
  • 1
  • 2
  • 3
  • 4
  • 5

aquí,SCRIPT_FILENAMEEl parámetro se establece en la ruta real al script.$fastcgi_script_nameEs unNginxVariable que representa el nombre del script solicitado.

Si tusggiUso del servidorUnixsocket de dominio en su lugarProtocolo de control de tráficoEl puerto se puede configurar así:

location /scgi/ {
    scgi_pass unix:/tmp/scgi.socket;
    include scgi_params;
}
  • 1
  • 2
  • 3
  • 4

En este ejemplo,Nginxse ubicará a través de/tmp/scgi.socketdeUnixsocket de dominio consggiComunicación del servidor.

Una vez completada la configuración, debe recargar o reiniciarNginx para que los cambios surtan efecto. Se pueden utilizar los siguientes comandos:

sudo nginx -s reload
  • 1

o

sudo systemctl restart nginx
  • 1

Esta configuración básica es para usarscgi_pass Proporciona un buen punto de partida. Dependiendo de sus necesidades específicas, es posible que se requieran más ajustes y optimizaciones. Por ejemplo, es posible que necesite configurar el almacenamiento en búfer, los tiempos de espera o configurar grupos de servidores ascendentes para el equilibrio de carga. Estas opciones de configuración se analizan en detalle en los capítulos siguientes.

4.2 Uso del módulo ascendente

existirNginx , el módulo ascendente nos permite definir un conjunto de servidores que se pueden usar para equilibrio de carga y conmutación por error.cuando conscgi_passEl módulo ascendente se puede mejorar enormemente cuando se usa junto con directivas.sggiFlexibilidad y confiabilidad del agente.

La sintaxis básica del módulo ascendente es la siguiente:

upstream backend_name {
    server address1;
    server address2;
    # 更多服务器...
}
  • 1
  • 2
  • 3
  • 4
  • 5

En esta configuración,backend_namees el nombre que especificó para este grupo de servidores, que puede usarse más adelantescgi_pass citado en la directiva.cadaserverLa directiva define la dirección de un servidor backend, que puede serPropiedad intelectualDirección más número de puerto, que también puede serUnixRuta del socket de dominio.

Por ejemplo, podemos definir un archivo llamadoscgi_serversgrupo aguas arriba:

upstream scgi_servers {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
    server unix:/tmp/scgi.socket;
}
  • 1
  • 2
  • 3
  • 4
  • 5

Después de definir aguas arriba, podemosscgi_passÚselo en la directiva:

location /app/ {
    scgi_pass scgi_servers;
    include scgi_params;
}
  • 1
  • 2
  • 3
  • 4

entonces,NginxLa solicitud será distribuida ascgi_serversservidores del grupo.

El módulo ascendente proporciona una variedad de algoritmos de equilibrio de carga, que se pueden configurar agregando parámetros después de la directiva del servidor:

  1. Round-robin (predeterminado): distribuye las solicitudes a cada servidor de forma secuencial.

  2. Sondeo ponderado: puede especificar un peso para cada servidor. Los servidores con pesos más altos reciben más solicitudes. Por ejemplo:

upstream scgi_servers {
    server 127.0.0.1:9000 weight=3;
    server 127.0.0.1:9001 weight=1;
}
  • 1
  • 2
  • 3
  • 4
  1. Menos conexiones: envíe la solicitud al servidor con la menor cantidad de conexiones activas actualmente.usarleast_conninstrucción:
upstream scgi_servers {
    least_conn;
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  1. Propiedad intelectualHash: según clientePropiedad intelectualEl valor hash de la dirección para seleccionar el servidor puede garantizar que proviene del mismoPropiedad intelectual Las solicitudes siempre se envían al mismo servidor (a menos que ese servidor no esté disponible).usarip_hashinstrucción:
upstream scgi_servers {
    ip_hash;
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}
  • 1
  • 2
  • 3
  • 4
  • 5

El módulo ascendente también proporciona funcionalidad de conmutación por error y comprobación del estado del servidor.Por ejemplo, podemos utilizarmax_failsyfail_timeoutParámetros para configurar la detección de fallas:

upstream scgi_servers {
    server 127.0.0.1:9000 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:9001 max_fails=3 fail_timeout=30s;
}
  • 1
  • 2
  • 3
  • 4

En esta configuración, si un servidor falla tres veces seguidas en 30 segundos,NginxSe marcará como no disponible y no se le enviarán más solicitudes durante los próximos 30 segundos.

Además, podemos utilizarbackupParámetros para especificar un servidor de respaldo, que se usará solo cuando todos los servidores primarios no estén disponibles:

upstream scgi_servers {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
    server 127.0.0.1:9002 backup;
}
  • 1
  • 2
  • 3
  • 4
  • 5

Al utilizar correctamente el módulo ascendente, podemos crear un sistema de alta disponibilidad y alto rendimiento.sggi Clúster de agentes. Esto no sólo mejora el rendimiento general de la aplicación, sino que también mejora la confiabilidad y la tolerancia a fallas del sistema. En aplicaciones prácticas, debemos elegir estrategias de equilibrio de carga y mecanismos de conmutación por error adecuados en función de necesidades y escenarios específicos para obtener el mejor rendimiento del sistema.

4.3 Socket Unix vs. socket TCP

En configuraciónNginxdescgi_passdirectiva, tenemos dos opciones principales para especificarsggiDirección del servidor:Unixsocket de dominio yProtocolo de control de tráfico enchufe. Ambos métodos tienen sus propias ventajas y desventajas, y qué método elegir depende de las necesidades y escenarios de aplicación específicos.

UnixLos sockets de dominio son un tipo de comunicación entre procesos (CPI ) mecanismo que permite que los procesos en la misma máquina se comuniquen de manera eficiente.existirNginxConfigurando,Unix La dirección de un socket de dominio generalmente se representa como una ruta de archivo. Por ejemplo:

scgi_pass unix:/tmp/scgi.socket;
  • 1

usarUnix La principal ventaja de los sockets de dominio es su rendimiento.Dado que la comunicación se produce en la misma máquina y no necesita pasar por la pila de protocolos de red, por lo tantoUnixLos sockets de dominio suelen ser más pequeños queProtocolo de control de tráfico Los enchufes son más rápidos.ellos evitanProtocolo TCP/IP La sobrecarga causada por el protocolo, como encapsulación y desencapsulación de paquetes de datos, control de congestión de la red, etc.Esto haceUnixLos sockets de dominio son particularmente adecuados paraNginxysggiEl servidor se ejecuta en la misma máquina.

Otro usaUnix La ventaja de los sockets de dominio es la seguridad. Dado que la comunicación se limita a la máquina local, es naturalmente inmune a los ataques provenientes de toda la red. Además, los permisos del sistema de archivos se pueden utilizar para controlar el acceso a los archivos de socket, lo que proporciona una capa adicional de seguridad.

Sin embargo,Unix Los sockets de dominio también tienen sus limitaciones. Lo más obvio es que sólo se pueden utilizar para la comunicación entre procesos en la misma máquina.siNginxysggiEl servidor debe ejecutarse en una máquina diferente, por lo que no se puede utilizar.Unixconector de dominio.

A diferencia de,Protocolo de control de tráficoUso del zócaloPropiedad intelectual dirección y número de puerto para especificar la dirección del servidor. Por ejemplo:

scgi_pass 127.0.0.1:9000;
  • 1

Protocolo de control de tráfico La principal ventaja de los enchufes es la flexibilidad.ellos permitenNginxysggi Los servidores se ejecutan en diferentes máquinas, lo cual es necesario para sistemas distribuidos o aplicaciones que requieren escalabilidad horizontal.usarProtocolo de control de tráficosockets, podemos implementar fácilmente el equilibrio de carga, distribuyendo solicitudes a múltiplessggiservidor.

Otra ventaja es queProtocolo de control de tráfico Los sockets facilitan la supervisión y la depuración a nivel de red. Utilizando herramientas de red estándar, podemos verificar fácilmente el estado de la comunicación y diagnosticar problemas.

Sin embargo,Protocolo de control de tráficoLa principal desventaja de los sockets es que el rendimiento es ligeramente inferior alUnix conector de dominio. Incluso si se comunica en la misma máquina, los datos deben pasar por toda la pila de protocolos de red, lo que generará una sobrecarga adicional.Además, utiliceProtocolo de control de tráficoLos sockets pueden requerir consideraciones de seguridad adicionales, como establecer reglas de firewall, usarSSL/TLSCifrado, etc.

Al elegir utilizarUnixSocket de dominio todavíaProtocolo de control de tráficoAl utilizar enchufes, se deben considerar los siguientes factores:

  1. Requisitos de desempeño: si busca el más alto desempeño, yNginxysggiEl servidor está en la misma máquina y debe seleccionarseUnixconector de dominio.

  2. Arquitectura de implementación: siNginxysggiSi el servidor necesita ejecutarse en diferentes máquinas o necesita lograr un equilibrio de carga, debe usarProtocolo de control de tráficoenchufe.

  3. Requisitos de seguridad: si la seguridad es la principal preocupación y no se requiere comunicación entre máquinas,UnixLos sockets de dominio pueden ser una mejor opción.

  4. Escalabilidad: si se prevé que pueda necesitarsggiPara escalar un servidor a varias máquinas, utiliceProtocolo de control de tráficoLos sockets serán más fáciles de ajustar en el esquema.

  5. Necesidades de depuración y monitoreo: si necesita utilizar herramientas de red estándar para monitorear y depurar,Protocolo de control de tráficoLos enchufes pueden ser más adecuados.

En breve,Unixsocket de dominio yProtocolo de control de tráfico Los enchufes son todas opciones válidas. Su elección debe basarse en las necesidades específicas de su aplicación, los requisitos de rendimiento y el entorno de implementación.En muchos casos, especialmente cuando se persigue un alto rendimiento yNginxysggiCuando los servidores coexisten en la misma máquina,Unix Los sockets de dominio pueden ser una mejor opción. Pero si se requiere mayor flexibilidad o implementación distribuida,Protocolo de control de tráficoLos enchufes son una opción indispensable.

5. Configuración avanzada de scgi_pass

Este capítulo discutirá en detallescgi_passTres aspectos clave de configuración avanzada: configuración de tiempo de espera, configuración del búfer y administración del grupo de conexiones.

5.1 Configuración del tiempo de espera

La configuración del tiempo de espera es para garantizarNginxysggi Clave para la confiabilidad de la comunicación entre servidores. Una configuración de tiempo de espera adecuada puede evitar que las solicitudes se cuelguen indefinidamente si se encuentra un problema, y ​​al mismo tiempo proporciona suficiente tiempo de procesamiento para conexiones lentas.

NginxProporciona múltiplesscgi_passInstrucciones de tiempo de espera relacionadas:

en primer lugarscgi_connect_timeout, que defineNginxysggi El tiempo máximo de espera para que el servidor establezca una conexión. Si la conexión no se puede establecer dentro del tiempo especificado,Nginx devolverá un error. Por ejemplo:

scgi_connect_timeout 60s;
  • 1

Esta configuración establece el tiempo de espera de la conexión en 60 segundos.

En segundo lugar,scgi_read_timeoutdesignadaNginxdesggi El tiempo de espera del servidor para leer las respuestas.sisggi El servidor no ha transmitido ningún dato durante este tiempo y la conexión se cerrará. Por ejemplo:

scgi_read_timeout 60s;
  • 1

por fin,scgi_send_timeoutya configuradoNginxHaciasggi El período de tiempo de espera para que el servidor envíe solicitudes.Si dentro del tiempo especificadosggi El servidor no recibió ningún dato y la conexión se cerrará. Por ejemplo:

scgi_send_timeout 60s;
  • 1

Estas configuraciones de tiempo de espera deben ajustarse según las necesidades de la aplicación real. Para la mayoría de las aplicaciones, los valores predeterminados son suficientes. Pero para algunas solicitudes de larga duración, puede que sea necesario aumentar estos valores de tiempo de espera.

5.2 Configuración del búfer

Configuración del buffer para optimizaciónNginxysggi La transferencia de datos entre servidores es fundamental. Una configuración de búfer razonable puede mejorar la velocidad de respuesta y reducir el consumo de recursos.

scgi_buffer_sizeInstrucciones para configurar la lectura.sggi El tamaño del búfer para la primera parte de la respuesta del servidor. Generalmente contiene un pequeño encabezado de respuesta. Por ejemplo:

scgi_buffer_size 4k;
  • 1

scgi_buffersLas instrucciones están definidas para su lectura.sggi El número y tamaño de los buffers para las respuestas del servidor. Por ejemplo:

scgi_buffers 8 4k;
  • 1

Esta configuración crea 8 buffers de tamaño 4k.

Si la respuesta no encaja completamente en la memoria, puedes usarscgi_max_temp_file_sizeDirectiva para limitar el tamaño máximo de archivos temporales:

scgi_max_temp_file_size 1024m;
  • 1

Esto limita el tamaño máximo de archivos temporales a 1024 MB.

Para respuestas grandes puedes usarscgi_busy_buffers_sizeDirectiva para limitar el tamaño del buffer disponible en estado ocupado:

scgi_busy_buffers_size 8k;
  • 1

Estas configuraciones de búfer deben ajustarse según las características de su aplicación y los recursos del servidor para lograr un rendimiento óptimo.

5.3 Gestión del grupo de conexiones

La gestión del grupo de conexiones está optimizada.Nginxysggi Otro aspecto importante de la comunicación entre servidores. Al reutilizar las conexiones, se puede reducir significativamente la sobrecarga de establecer nuevas conexiones y mejorar el rendimiento general.

scgi_keepaliveDirectiva para la configuración upstreamsggi El número máximo de conexiones inactivas que el servidor puede mantener activas. Por ejemplo:

scgi_keepalive 10;
  • 1

Esta configuración permite que cada proceso de trabajo mantenga hasta 10 conexiones de mantenimiento de actividad inactivas.

puedo usarscgi_http_versioncomando para especificarNginxusado consggicomunicación del servidorHTTPVersión del protocolo:

scgi_http_version 1.1;
  • 1

usarHTTP/1.1Se pueden habilitar conexiones de larga duración, lo cual es fundamental para mantener la eficiencia del grupo de conexiones.

Además, se puede utilizarscgi_next_upstreamDirectivas para controlar bajo qué circunstancias las solicitudes deben pasarse al siguiente servidor:

scgi_next_upstream error timeout invalid_header http_500;
  • 1

Esta configuración especifica qué hacer cuando ocurre un error, se agota el tiempo de espera, se recibe un encabezado no válido oHTTP En caso de error 500, la solicitud debe pasarse al siguiente servidor.

6. Caso de implementación web de Python flup

Para ser escrito

6.1 Resumen de pasos

6.2 Implementación en contenedores

7. Resumen

Este artículo analiza en detalleNginxmedioscgi_passaplicación de instrucciones, con especial atención aPitón Configuración y despliegue de aplicaciones.Primero presentamossggiA continuación se explicaron en profundidad las características y ventajas del protocolo.scgi_pass Sintaxis básica y opciones de configuración avanzadas para directivas.A través de casos prácticos, mostrar cómoFlujo de PythonConfiguración del marcoscgi_pass, incluida la configuración básica, el equilibrio de carga, la agrupación de conexiones y la gestión del búfer.