Compartilhamento de tecnologia

Proxy reverso Nginx de sete camadas (camada de aplicativo): proxy SCGI scgi_pass

2024-07-12

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

Proxy reverso Nginx de sete camadas (camada de aplicativo)
Agente SCGI scgi_pass

- Informações do artigo -
Autor: Li Juncai (jcLee95)
Visite-me na CSDN: https://jclee95.blog.csdn.net
Meu websitehttp://thispage.tech/
E-mail: [email protected].
Shenzhen, China
Endereço deste artigo:https://blog.csdn.net/qq_28550263/article/details/140253307
Hua Wei:https://bbs.huaweicloud.com/blogs/XXXXXXXXXX

[Introdução]: Nginx fornece uma variedade de suporte a proxy reverso da camada de aplicativo, incluindo proxy_pass, uwsgi_pass, fastcgi_pass e scgi_pass, etc. Entre eles, a diretiva proxy_pass pode aceitar um parâmetro de URL para implementar um proxy reverso para o protocolo HTTP/HTTPS é usado para fazer proxy para o servidor de aplicativos uWSGI é usado para fazer proxy para o servidor FastCGI; para aplicação SCGI (Simple Common Gateway Interface). Essas diretivas permitem que o Nginx lide com flexibilidade com diferentes tipos de serviços e aplicativos de back-end. O foco deste artigo é scgi_pass.


Artigos relacionados:
Proxy reverso Nginx de sete camadas: proxy reverso HTTP proxy_pass

Proxy reverso Nginx de sete camadas: proxy UWSGI uwsgi_pass
Proxy reverso Nginx de sete camadas: proxy SCGI scgi_pass
Proxy reverso Nginx de sete camadas: proxy FastCGI fastcgi_pass

Insira a descrição da imagem aqui


1. Visão Geral

1.1 O que é SCGI

SCGIO proxy (Simple Common Gateway Interface) éNginx Um dos importantes métodos de proxy reverso suportados. em,SCGIé uma versão simplificadaCGI(Common Gateway Interface), projetado para fornecer uma maneira mais eficiente de conectarRede Servidores e aplicativos.com tradicionalCGIcomparado com,SCGIAo usar conexões persistentes e um formato de protocolo simplificado, a sobrecarga por solicitação é significativamente reduzida.

SCGIO protocolo define uma maneira padronizada deRede Passe informações de solicitação e receba respostas entre o servidor e a aplicação. Ele usa um formato de texto simples para transmitir informações do cabeçalho da solicitação, seguido pelo corpo da solicitação (se houver).Este desenho fazSCGIÉ fácil de implementar e oferece bom desempenho.

1.2 Cenários de aplicação do SCGI

existirRedeNa arquitetura do aplicativo,SCGIAgiu comoRedeservidor (comoNginx ) e aplicativos de back-end.quandoNginxrecebido do clienteHTTPQuando solicitado, ele pode converter essas solicitações emSCGIformatar e depois passarSCGIO protocolo é enviado ao servidor de aplicativos backend.

Esta abordagem é particularmente adequada para aqueles que suportam nativamenteSCGILinguagens de programação de protocolo e estruturas comoPitãoalgunsRedequadros (por ex.Fracasso)ouRubiAlguns servidores de aplicativos (comoUnicórnio ).usandoSCGI, essas aplicações podem evitarHTTPA sobrecarga de análise, processamento direto deRedesolicitações ao servidor, melhorando assim o desempenho geral.

Em aplicações práticas,SCGIOs cenários de uso incluem, mas não estão limitados a:

  1. alta performanceRedeAplicação: Para aplicações que precisam lidar com um grande número de solicitações simultâneas,SCGIPode fornecer melhor que o tradicionalCGIMelhor performance.

  2. Processos de longa execução: Certos aplicativos que precisam manter o estado ou são de longa execução podemSCGIeRedeO servidor mantém uma conexão persistente.

  3. Otimizações específicas de linguagem: Certas linguagens de programação ou estruturas podem usarSCGImostram melhor desempenho ou implementação mais simples.

por emNginxusado emscgi_passcomando, os administradores podem facilmente colocarHTTPEncaminhar solicitação para suporteSCGI servidor de aplicativos back-end.Isso não apenas simplifica o processo de configuração, mas também oferece oportunidades de otimizaçãoRedeO desempenho do aplicativo oferece flexibilidade.

2. Introdução ao protocolo SCGI

2.1 Características do protocolo SCGI

SCGI(Simple Common Gateway Interface) é um protocolo simplificadoCGIprotocolo, projetado especificamente paraRede Comunicação entre servidor e aplicação. Possui as seguintes características marcantes:

Simplicidade:SCGI O protocolo usa um formato de texto simples para transmitir informações do cabeçalho da solicitação, o que torna a implementação e a depuração do protocolo relativamente fáceis. A filosofia de design do protocolo é mantê-lo simples e, ao mesmo tempo, fornecer funcionalidade suficiente.

Conexões persistentes: versus tradicionaisCGIdiferente,SCGI Suporta conexões persistentes.isso significa umSCGI O servidor pode lidar com múltiplas solicitações sem criar um novo processo ou thread para cada solicitação. Isso reduz bastante a sobrecarga de recursos do sistema e melhora o desempenho geral.

Baixa sobrecarga: devido aSCGI O design do protocolo é simples e cria pouca sobrecarga adicional durante o processamento da solicitação.Isto fazSCGIEspecialmente adequado para lidar com alta simultaneidadeRedeCenários de aplicação.

flexibilidade:SCGI O protocolo permite a transmissão de informações de cabeçalho arbitrárias, o que proporciona aos desenvolvedores grande flexibilidade. Os desenvolvedores podem personalizar as informações do cabeçalho conforme necessário para atender aos requisitos de aplicativos específicos.

Independência de idioma:SCGI O design do protocolo é independente da linguagem de programação.Isso significa que ele pode ser implementado em qualquer linguagem de programação, permitindo que os desenvolvedores escolham a linguagem que melhor se adapta às necessidades do seu projeto.SCGIservidor.

2.2 SCGI versus protocolo HTTP

EmboraSCGIeHTTPsão usados ​​paraRedeProtocolos de comunicação, mas apresentam diferenças significativas nas finalidades de design e cenários de uso:

Usuários-alvo:HTTPO protocolo é usado principalmente por clientes (como navegadores) eRedecomunicação entre servidores, enquantoSCGIO acordo centra-seRedeComunicação entre aplicativos de servidor e backend.

Complexidade do protocolo:HTTPO protocolo é relativamente complexo e contém uma grande quantidade de informações de cabeçalho e métodos para suportar váriosRede cena interativa. Em contraste,SCGIO protocolo é mais simples e contém apenas as informações necessárias para entregar solicitações e respostas.

Considerações de desempenho: emRedeUsado entre servidor e aplicativoSCGIem vez deHTTPA sobrecarga da análise de protocolo pode ser reduzida porqueSCGI O formato é mais simples e direto. Isso pode trazer melhorias significativas de desempenho em cenários de alta simultaneidade.

Gerenciamento de conexão:HTTP/1.1O conceito de conexões persistentes foi introduzido, mas emRedeUsado entre servidor e aplicativoHTTPO gerenciamento de conexão adicional ainda pode ser necessário.SCGIO suporte integrado para conexões persistentes simplifica esse processo.

cenas a serem usadas:HTTPÉ o protocolo básico da Internet e é aplicável a váriosRedecenário de comunicação.SCGIé usado principalmente paraRedeComunicação interna entre servidores e aplicações back-end, especialmente em cenários onde é necessário processamento de alto desempenho.

2.3 SCGI vs FastCGI

SCGIeCGI rápidoTodosCGIUma versão melhorada doRede Desempenho do aplicativo. Eles têm algumas semelhanças, mas também algumas diferenças importantes:

Complexidade do protocolo:SCGIproporção de acordoCGI rápidomais simples.SCGIUsa um formato de texto simples para transmitir informações de cabeçalho, enquantoCGI rápido Use formato binário.Isto fazSCGIMais fácil de implementar e depurar, mas pode ser ligeiramente inferior aoCGI rápidodesempenho.

  1. Multiplexação:CGI rápidoSuporta o tratamento de múltiplas solicitações em uma única conexão (multiplexação), enquantoSCGI Normalmente, apenas uma solicitação é processada por conexão. Isso significa que em certos cenários de alta simultaneidade,CGI rápidoPode ter um desempenho melhor.

  2. Tipo de registro:CGI rápidoVários tipos de registro são definidos (por exemplo,DISTÂNCIA PADRÃOSAÍDA PADRÃOSTDERRetc.), permitindo um controle mais refinado.SCGIÉ adotada uma abordagem mais simples, focada principalmente na transmissão de solicitações e respostas.

  3. Suporte de idioma: devido aCGI rápido Quanto mais tempo existe, mais difundido provavelmente será seu suporte em várias linguagens de programação e estruturas. No entanto,SCGISua simplicidade torna sua implementação em algumas linguagens potencialmente mais direta.

  4. Desempenho: Na maioria dos casos,SCGIeCGI rápido A diferença de desempenho não é significativa. A escolha de qual protocolo usar geralmente depende das necessidades específicas do aplicativo, do suporte à linguagem de desenvolvimento e da preferência pessoal.

3. Diretiva scgi_pass no Nginx

3.1 Sintaxe básica da instrução scgi_pass

existirNginxConfigurando,scgi_passA diretiva é usada para passar a solicitação paraSCGI Principais diretivas para o servidor.defineNginxpara onde a solicitação deve ser encaminhadaSCGIServidor ou grupo de servidores.

scgi_passA sintaxe básica do comando é a seguinte:

scgi_pass address;
  • 1

em,addressPode ser nas seguintes formas:

  1. nome de domínio ouPropriedade IntelectualEndereço mais número da porta:

Por exemplo:scgi_pass localhost:9000;

nesse caso,NginxA solicitação será encaminhada para o servidor em execução no host local e escutando na porta 9000.SCGIservidor.

  1. UnixCaminho do soquete de domínio:

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

aqui,Nginxpassará o especificadoUnixsoquete de domínio comSCGI Comunicação do servidor.Este método é geralmente usadoSCGIservidor comNginxExecutar na mesma máquina pode proporcionar melhor desempenho.

  1. Nome do grupo de servidores upstream:

Por exemplo:scgi_pass scgi_backend;

Neste uso,scgi_backendé um emNginx Um grupo de servidores upstream predefinido no arquivo de configuração. Isso permite implementar recursos avançados, como balanceamento de carga e failover.

scgi_passAs instruções geralmente estão emlocationusado em blocos para lidar comURL caminho. Por exemplo:

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

Neste exemplo, todos/scgi/As solicitações iniciais serão encaminhadas para a porta local 9000.SCGIservidor.

include scgi_params;contém um arquivo de configuração predefinido, que define uma série deSCGI parâmetro.Esses parâmetros definemNginxcomoHTTPAs informações da solicitação são convertidas emSCGIperguntar.

Vale a pena notar quescgi_passAs directivas podem ser combinadas com outrasNginx As diretivas são usadas em combinação para obter configurações mais complexas.Por exemplo, você pode usarifInstruções condicionais para selecionar diferentes opções com base em diferentes condiçõesSCGIservidor:

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

Neste exemplo,PUBLICARAs solicitações são encaminhadas para a porta 9001, enquanto todas as outras solicitações são encaminhadas para a porta 9000.

3.2 scgi_pass vs proxy_pass

scgi_passeproxy_passTodas elas são instruções de proxy reverso comumente usadas e encaminham solicitações para o servidor back-end.

em,scgi_passProjetado para uso com suporteSCGIProtocolo para comunicação do servidor backend.SCGIé um simplificadoCGIprotocolo, projetado paraRede Comunicação eficiente entre servidores e aplicações. Em contraste,proxy_passé uma diretiva mais geral que pode ser usada para proxy de uma variedade de protocolos, incluindoHTTPHTTPSCGI rápidoespere.

Em usoscgi_passhora,Nginxirá receberHTTPA solicitação é convertida emSCGIformato e depois enviado para o backendSCGI servidor. Durante este processo,Nginx Cuidará da conversão do protocolo para garantir que o servidor back-end possa entender e processar corretamente a solicitação.eproxy_passGeralmente é usado para encaminhar a solicitação intacta ao servidor back-end, sem conversão de protocolo.

Outra diferença importante é como ele está configurado.scgi_passGeralmente requer cooperaçãoscgi_paramdiretiva a ser usada para definirSCGI Parâmetros exigidos pelo protocolo. Por exemplo:

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

Neste exemplo,include scgi_paramsintroduzido predefinidoSCGIparâmetros, enquantoscgi_paramAs diretivas são usadas para definir parâmetros adicionais.

Em contraste,proxy_passA configuração geralmente é mais simples e direta:

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

Em termos de desempenho,scgi_passeproxy_pass Cada um tem suas próprias vantagens.Para uso especificamente projetadoSCGIaplicação de protocolo,scgi_passpode proporcionar melhor desempenho porque evitaHTTP sobrecarga de protocolo. No entanto,proxy_passSua versatilidade o torna mais flexível e pode se adaptar a diversos servidores e protocolos backend.

A segurança também é um aspecto a considerar.porquescgi_passdedicado àSCGI protocolo, que pode fornecer melhor segurança em alguns casos porque limita a forma como ele se comunica com o servidor back-end.eproxy_passDevido à sua versatilidade, podem ser necessárias configurações adicionais para garantir a segurança, especialmente ao lidar com dados confidenciais.

Em aplicações práticas, opte por usarscgi_passaindaproxy_pass Depende principalmente das características e requisitos do aplicativo backend.Se o aplicativo back-end for projetado especificamente para usarSCGIacordo, entãoscgi_pass Pode ser uma escolha melhor.Se o back-end for um padrãoRedeServidor ou aplicativo, não suportado ou necessárioSCGI,Entãoproxy_passpode ser mais apropriado.

3.3 Como funciona o scgi_pass

scgi_passA instrução éNginxusado no processamentoSCGI (Simple Common Gateway Interface) instruções básicas solicitadas. O funcionamento envolve várias etapas, desde o recebimento de uma solicitação do cliente até o retorno de uma resposta processada ao cliente.

Em primeiro lugar, quandoNginxRecebido de um clienteHTTP Quando uma solicitação é feita, ele decidirá como lidar com a solicitação com base nas regras do arquivo de configuração.Se a solicitação corresponder, usescgi_passo bloco de localização da instrução,Nginxvai começarSCGIfluxo de processamento.

existirSCGIDurante o processo de processamento,NginxPrimeiro, criaremos oSCGI Conexão do servidor.Essa conexão pode serTCPtomada ouUnixSoquete de domínio, dependendoscgi_pass O endereço especificado na instrução. Se um grupo de servidores upstream for usado,NginxUm servidor específico também é selecionado com base no algoritmo de balanceamento de carga configurado.

Depois que a conexão for estabelecida,NginxvaiHTTPA solicitação é convertida emSCGI Formatar.Este processo inclui a criaçãoSCGICabeçalho da solicitação e corpo da solicitação.SCGIO cabeçalho da solicitação contém uma série de pares de valores-chave que fornecem metadados sobre a solicitação, como método de solicitação, caminho, string de consulta, clientePropriedade Intelectual Endereço etcA maior parte dessas informações vem do originalHTTPcabeçalhos de solicitação, mas também pode incluirscgi_paramParâmetros adicionais definidos pelo comando.

SCGI O formato do cabeçalho da solicitação é específico: ele começa com um número que indica o comprimento de todo o cabeçalho, seguido por dois pontos, depois uma série de pares de valores-chave terminados por um caractere nulo e, finalmente, finalizados por uma vírgula.Por exemplo, uma simplificaçãoSCGIO cabeçalho da solicitação pode ser assim:

70:CONTENT_LENGTH27SCGI1REQUEST_METHODGETquery_string,
  • 1

Neste exemplo, "70" representa o comprimento total do cabeçalho, seguido por três pares de valores-chave:CONTENT_LENGTHSCGIeREQUEST_METHOD

Depois de enviar o cabeçalho da solicitação,Nginx O corpo da solicitação é enviado (se houver).paraPEGARAs solicitações geralmente não possuem corpo de solicitação, mas paraPUBLICARouCOLOCARSolicitação, o corpo da solicitação pode conter dados de formulário ou outros tipos de conteúdo.

SCGI Depois que o servidor recebe a solicitação, ele a processa e gera uma resposta.A resposta é enviada de volta pela mesma conexãoNginxSCGIO formato da resposta é relativamente simples. Inclui cabeçalhos e corpo da resposta, separados por uma linha em branco.

NginxrecebidoSCGIApós a resposta do servidor, ele é convertido novamente paraHTTP Formato de resposta.Este processo inclui análiseSCGICabeçalhos de resposta, definidos adequadamenteHTTPcabeçalhos de resposta e, em seguida, passe o corpo da resposta intacto para o cliente.

em todo o processo,Nginx Também responsável por gerenciar o ciclo de vida da conexão.Isto inclui lidar com tempos limite de conexão, gerenciar o pool de conexões (se ativadokeepalive ), lidar com erros de rede, etc. Se ocorrer um erro durante o processamento,NginxUma resposta de erro apropriada será retornada ao cliente de acordo com a configuração.

além disso,scgi_pass O processo de trabalho não é bloqueador.isso significaNginxPode processar váriosSCGI solicitações sem criar um novo processo ou thread para cada solicitação.Este desenho fazNginxCapacidade de lidar com eficiência com um grande número de conexões simultâneas.

4. Configure o Nginx para usar scgi_pass

4.1 Exemplo de configuração básica

existirNginxConfiguração médiascgi_pass O exemplo básico é relativamente simples.Esta configuração permitiráNginxEncaminhar solicitações de um caminho específico paraSCGI servidor. Aqui está um exemplo de configuração básica:

Primeiro, abraNginxO arquivo de configuração principal, geralmente localizado em/etc/nginx/nginx.confou/usr/local/nginx/conf/nginx.conf .Neste arquivo precisamoshttpAdicionar ou modificar dentro de um blocoserverpedaço.

existirserverbloco, adicionaremos umlocationdiretiva para definir quais solicitações devem ser encaminhadasSCGI servidor.Por exemplo, se quisermos somar todos/scgi/A solicitação inicial é encaminhada para o servidor rodando na porta local 9000.SCGIServidor, você pode usar a seguinte configuração:

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

Nesta configuração,listen 80instruções dizemNginxOuça na porta 80 (padrãoHTTPporta).server_nameA diretiva define o nome de domínio ao qual este bloco de servidor deve responder.

location /scgi/bloco define tudo/scgi/começoURL Todas as solicitações devem ser processadas.Dentro deste bloco usamosscgi_passcomando para especificarSCGI O endereço e a porta do servidor. Neste exemplo,SCGIO servidor está rodando na mesma máquina (localhost) da porta 9000.

include scgi_params;contém um arquivo de configuração predefinido, que define uma série deSCGI parâmetro.Esses parâmetros definemNginxcomoHTTPAs informações da solicitação são convertidas emSCGI perguntar.Normalmente, esse arquivo está localizado/etc/nginx/scgi_paramsou/usr/local/nginx/conf/scgi_params

Se seuSCGIO servidor requer parâmetros adicionais, que podem ser usadosscgi_param comando para definir.Por exemplo, se você precisar definirSCRIPT_FILENAMEOs parâmetros podem ser configurados assim:

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

aqui,SCRIPT_FILENAMEO parâmetro é definido como o caminho real para o script.$fastcgi_script_nameÉ umNginxVariável que representa o nome do script solicitado.

Se seuSCGIUso do servidorUnixsoquete de domínio em vez dissoTCPA porta pode ser configurada assim:

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

Neste exemplo,Nginxestará localizado através/tmp/scgi.socketdeUnixsoquete de domínio comSCGIComunicação do servidor.

Após a conclusão da configuração, você precisa recarregar ou reiniciarNginx para que as alterações entrem em vigor. Os seguintes comandos podem ser usados:

sudo nginx -s reload
  • 1

ou

sudo systemctl restart nginx
  • 1

Esta configuração básica é usarscgi_pass Fornece um bom ponto de partida. Dependendo de suas necessidades específicas, mais ajustes e otimizações podem ser necessários. Por exemplo, pode ser necessário configurar buffer, tempos limite ou configurar grupos de servidores upstream para balanceamento de carga. Essas opções de configuração serão discutidas detalhadamente nos capítulos subsequentes.

4.2 Usando o módulo upstream

existirNginx , o módulo upstream nos permite definir um conjunto de servidores que podem ser usados ​​para balanceamento de carga e failover.quando comscgi_passO módulo upstream pode ser bastante aprimorado quando usado em conjunto com diretivasSCGIFlexibilidade e confiabilidade do agente.

A sintaxe básica do módulo upstream é a seguinte:

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

Nesta configuração,backend_nameé o nome que você especificou para este grupo de servidores, que pode ser usado posteriormentescgi_pass citado na directiva.cadaserverA diretiva define o endereço de um servidor backend, que pode serPropriedade IntelectualEndereço mais número da porta, que também pode serUnixCaminho do soquete de domínio.

Por exemplo, podemos definir um arquivo chamadoscgi_serversgrupo a montante:

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

Depois de definir o upstream, podemosscgi_passUse-o na diretiva:

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

então,NginxO pedido será distribuídoscgi_serversservidores do grupo.

O módulo upstream fornece uma variedade de algoritmos de balanceamento de carga, que podem ser configurados adicionando parâmetros após a diretiva do servidor:

  1. Round-robin (padrão): Distribua solicitações para cada servidor sequencialmente.

  2. Sondagem ponderada: você pode especificar um peso para cada servidor. Servidores com pesos mais altos recebem mais solicitações. Por exemplo:

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 Conexões: Envie a solicitação ao servidor com o menor número de conexões ativas no momento.usarleast_conninstrução:
upstream scgi_servers {
    least_conn;
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  1. Propriedade IntelectualHash: de acordo com o clientePropriedade IntelectualO valor hash do endereço para selecionar o servidor pode garantir que ele venha do mesmoPropriedade Intelectual As solicitações são sempre enviadas para o mesmo servidor (a menos que esse servidor esteja indisponível).usarip_hashinstrução:
upstream scgi_servers {
    ip_hash;
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}
  • 1
  • 2
  • 3
  • 4
  • 5

O módulo upstream também fornece funções de verificação de integridade do servidor e failover.Por exemplo, podemos usarmax_failsefail_timeoutParâmetros para configurar a detecção de falhas:

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

Nesta configuração, se um servidor falhar três vezes seguidas em 30 segundos,NginxEle será marcado como indisponível e nenhuma outra solicitação será enviada nos próximos 30 segundos.

Além disso, podemos usarbackupParâmetros para especificar um servidor de backup, que será utilizado somente quando todos os servidores primários estiverem indisponíveis:

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

Usando corretamente o módulo upstream, podemos construir um sistema altamente disponível e de alto desempenhoSCGI Cluster de agentes. Isso não apenas melhora o desempenho geral do aplicativo, mas também aumenta a confiabilidade e a tolerância a falhas do sistema. Em aplicações práticas, devemos escolher estratégias adequadas de balanceamento de carga e mecanismos de failover com base em necessidades e cenários específicos para obter o melhor desempenho do sistema.

4.3 Soquete Unix vs Soquete TCP

Na configuraçãoNginxdescgi_passdirectiva, temos duas opções principais para especificarSCGIEndereço do servidor:Unixsoquete de domínio eTCP soquete. Ambos os métodos têm suas próprias vantagens e desvantagens, e qual método escolher depende dos cenários e necessidades específicas da aplicação.

UnixSoquetes de domínio são um tipo de comunicação entre processos (CPI ) mecanismo que permite que processos na mesma máquina se comuniquem de forma eficiente.existirNginxConfigurando,Unix O endereço de um soquete de domínio geralmente é representado como um caminho de arquivo. Por exemplo:

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

usarUnix A principal vantagem dos soquetes de domínio é o seu desempenho.Como a comunicação ocorre na mesma máquina e não precisa passar pela pilha de protocolos de rede, portantoUnixOs soquetes de domínio são geralmente menores queTCP Os soquetes são mais rápidos.eles evitamTCP/IP A sobrecarga causada pelo protocolo, como encapsulamento e desencapsulamento de pacotes de dados, controle de congestionamento de rede, etc.Isto fazUnixOs soquetes de domínio são particularmente adequados paraNginxeSCGIO servidor é executado na mesma máquina.

Outro usaUnix A vantagem dos soquetes de domínio é a segurança. Como a comunicação é limitada à máquina local, ela é naturalmente imune a ataques provenientes de toda a rede. Além disso, as permissões do sistema de arquivos podem ser usadas para controlar o acesso aos arquivos de soquete, fornecendo uma camada adicional de segurança.

No entanto,Unix Os soquetes de domínio também têm suas limitações. Obviamente, eles só podem ser usados ​​para comunicação entre processos na mesma máquina.seNginxeSCGIO servidor precisa ser executado em uma máquina diferente, portanto não pode ser usadoUnixsoquete de domínio.

Em contraste,TCPUso de soquetePropriedade Intelectual endereço e número da porta para especificar o endereço do servidor. Por exemplo:

scgi_pass 127.0.0.1:9000;
  • 1

TCP A principal vantagem dos soquetes é a flexibilidade.eles permitemNginxeSCGI Os servidores são executados em máquinas diferentes, o que é necessário para sistemas distribuídos ou aplicativos que exigem escalabilidade horizontal.usarTCPsoquetes, podemos implementar facilmente o balanceamento de carga, distribuindo solicitações para váriosSCGIservidor.

Outra vantagem é queTCP Os soquetes facilitam o monitoramento e a depuração no nível da rede. Usando ferramentas de rede padrão, podemos verificar facilmente o status da comunicação e diagnosticar problemas.

No entanto,TCPA principal desvantagem dos soquetes é que o desempenho é ligeiramente inferior aoUnix soquete de domínio. Mesmo se comunicando na mesma máquina, os dados precisam passar pela pilha completa de protocolos de rede, o que trará alguma sobrecarga adicional.Além disso, useTCPOs soquetes podem exigir considerações de segurança adicionais, como definir regras de firewall, usarSSL/TLSCriptografia etc.

Ao escolher usarUnixSoquetes de domínio aindaTCPAo usar soquetes, os seguintes fatores precisam ser considerados:

  1. Requisitos de desempenho: Se você busca o mais alto desempenho eNginxeSCGIO servidor está na mesma máquina e deve ser selecionadoUnixsoquete de domínio.

  2. Arquitetura de implantação: seNginxeSCGISe o servidor precisar ser executado em máquinas diferentes ou precisar obter balanceamento de carga, você deverá usarTCPsoquete.

  3. Requisitos de segurança: Se a segurança for a principal preocupação e a comunicação entre máquinas não for necessária,UnixSoquetes de domínio podem ser uma escolha melhor.

  4. Escalabilidade: Se for previsto que você precisaráSCGIPara dimensionar um servidor para várias máquinas, useTCPOs soquetes serão mais fáceis de ajustar o esquema.

  5. Necessidades de depuração e monitoramento: se você precisar usar ferramentas de rede padrão para monitoramento e depuração,TCPOs soquetes podem ser mais adequados.

Resumidamente,Unixsoquete de domínio eTCP Soquetes são todas escolhas válidas. Sua escolha deve ser baseada nas necessidades específicas do aplicativo, nos requisitos de desempenho e no ambiente de implantação.Em muitos casos, especialmente quando se busca alto desempenho eNginxeSCGIQuando os servidores coexistem na mesma máquina,Unix Soquetes de domínio podem ser uma escolha melhor. Mas se for necessária maior flexibilidade ou implantação distribuída,TCPOs soquetes são uma opção indispensável.

5. Configuração avançada de scgi_pass

Este capítulo discutirá em detalhesscgi_passTrês aspectos principais de configuração avançada: configurações de tempo limite, configuração de buffer e gerenciamento de pool de conexões.

5.1 Configuração de tempo limite

A configuração do tempo limite é para garantirNginxeSCGI Chave para a confiabilidade da comunicação entre servidores. A configuração adequada do tempo limite pode evitar que as solicitações sejam suspensas indefinidamente se um problema for encontrado, além de fornecer tempo de processamento suficiente para conexões lentas.

NginxFornece váriosscgi_passInstruções de tempo limite relacionadas:

em primeiro lugarscgi_connect_timeout, que defineNginxeSCGI O tempo máximo de espera para o servidor estabelecer uma conexão. Se a conexão não puder ser estabelecida dentro do tempo especificado,Nginx retornará um erro. Por exemplo:

scgi_connect_timeout 60s;
  • 1

Esta configuração define o tempo limite de conexão para 60 segundos.

Em segundo lugar,scgi_read_timeoutdesignadaNginxdeSCGI O tempo limite do servidor para leitura de respostas.seSCGI O servidor não transmitiu nenhum dado durante esse período e a conexão será encerrada. Por exemplo:

scgi_read_timeout 60s;
  • 1

afinal,scgi_send_timeoutjá configuradoNginxEm direção aSCGI O período de tempo limite para o servidor enviar solicitações.Se dentro do tempo especificadoSCGI O servidor não recebeu nenhum dado e a conexão será encerrada. Por exemplo:

scgi_send_timeout 60s;
  • 1

Essas configurações de tempo limite devem ser ajustadas com base nas necessidades do aplicativo real. Para a maioria dos aplicativos, os valores padrão são suficientes. Mas para algumas solicitações de longa duração, pode ser necessário aumentar esses valores de tempo limite.

5.2 Configuração de buffer

Configuração de buffer para otimizaçãoNginxeSCGI A transferência de dados entre servidores é crítica. Configurações de buffer razoáveis ​​podem melhorar a velocidade de resposta e reduzir o consumo de recursos.

scgi_buffer_sizeInstruções para configuração para leituraSCGI O tamanho do buffer para a primeira parte da resposta do servidor. Geralmente contém um pequeno cabeçalho de resposta. Por exemplo:

scgi_buffer_size 4k;
  • 1

scgi_buffersAs instruções são definidas para leituraSCGI O número e o tamanho dos buffers para respostas do servidor. Por exemplo:

scgi_buffers 8 4k;
  • 1

Esta configuração cria 8 buffers de tamanho 4k.

Se a resposta não couber inteiramente na memória, você pode usarscgi_max_temp_file_sizeDiretiva para limitar o tamanho máximo de arquivos temporários:

scgi_max_temp_file_size 1024m;
  • 1

Isso limita o tamanho máximo dos arquivos temporários a 1.024 MB.

Para respostas grandes você pode usarscgi_busy_buffers_sizeDiretiva para limitar o tamanho do buffer disponível no estado ocupado:

scgi_busy_buffers_size 8k;
  • 1

Essas configurações de buffer devem ser ajustadas com base nas características do aplicativo e nos recursos do servidor para obter desempenho ideal.

5.3 Gerenciamento do pool de conexões

O gerenciamento do pool de conexões é otimizadoNginxeSCGI Outro aspecto importante da comunicação entre servidores. Ao reutilizar conexões, a sobrecarga de estabelecimento de novas conexões pode ser significativamente reduzida e o desempenho geral melhorado.

scgi_keepaliveDiretiva para configurar upstreamSCGI O número máximo de conexões inativas que o servidor pode manter ativas. Por exemplo:

scgi_keepalive 10;
  • 1

Essa configuração permite que cada processo de trabalho mantenha até 10 conexões keep-alive ociosas.

pode usarscgi_http_versioncomando para especificarNginxusado comSCGIcomunicação do servidorHTTPVersão do protocolo:

scgi_http_version 1.1;
  • 1

usarHTTP/1.1Conexões de longa duração podem ser habilitadas, o que é fundamental para manter a eficiência do pool de conexões.

Além disso, pode-se usarscgi_next_upstreamDiretivas para controlar sob quais circunstâncias as solicitações devem ser passadas para o próximo servidor:

scgi_next_upstream error timeout invalid_header http_500;
  • 1

Esta configuração especifica o que fazer quando ocorre um erro, um tempo limite, um cabeçalho inválido é recebido ouHTTP Em um erro 500, a solicitação deve ser passada para o próximo servidor.

6. Caso de implantação da web Python flup

Para ser escrito

6.1 Resumo das etapas

6.2 Implantação em contêiner

7. Resumo

Este artigo discute em detalhesNginxmeioscgi_passaplicação de instruções, com foco particular emPitão Configuração e implantação de aplicativos.Nós introduzimos pela primeira vezSCGIAs características e vantagens do protocolo foram então explicadas em profundidade.scgi_pass Sintaxe básica e opções de configuração avançadas para diretivas.Através de casos práticos, mostre comoPython FalhaConfiguração do quadroscgi_pass, incluindo configurações básicas, balanceamento de carga, pool de conexões e gerenciamento de buffer.