Configurando o Nginx para desempenho e segurança

Neste tutorial, veremos como podemos configurar o servidor web Nginx para um ambiente de produção.

Um servidor web em um ambiente de produção é diferente de um servidor web em um ambiente de teste em termos de desempenho, segurança e assim por diante.

Por padrão, sempre há uma definição de configuração pronta para uso para um servidor da web Nginx depois de instalá-lo com sucesso. No entanto, a configuração padrão não é boa o suficiente para um ambiente de produção. Portanto, vamos nos concentrar em como configurar o Nginx para ter um desempenho melhor durante picos de tráfego intenso e normal e como protegê-lo de usuários que pretendem abusar dele.

Se você não instalou o Nginx em sua máquina, você pode verificar como fazê-lo aqui. Ele mostra como instalar o Nginx em uma plataforma Unix. Opte por instalar o Nginx por meio dos arquivos de origem porque o Nginx pré-construído não vem com alguns dos módulos usados ​​neste tutorial.

Requisitos

Você precisa ter o seguinte instalado em sua máquina e certifique-se de executar este tutorial em qualquer plataforma baseada em Debian, como o Ubuntu.

  • Ubuntu ou qualquer outra plataforma baseada em Debian
  • wget
  • Vim (editor de texto)

Além disso, você precisa executar alguns comandos neste tutorial como usuário root por meio do sudo comando.

Compreendendo a estrutura de configuração do Nginx

Nesta seção veremos o seguinte:

  • Estrutura do Nginx
  • Seções como um evento, HTTP e correio
  • Sintaxe válida do Nginx

No final desta seção, você entenderá a estrutura da configuração do Nginx, o propósito ou as funções das seções, bem como como definir diretivas válidas dentro das seções.

O arquivo de configuração Nginx completo possui uma estrutura lógica composta por diretivas agrupadas em várias seções, como a event section, http section, mail section e assim por diante.

O arquivo de configuração principal está localizado em /etc/nginx/nginx.conf enquanto outros arquivos de configuração estão localizados em /etc/nginx.

Contexto principal

Esta seção ou contexto contém diretivas fora de seções específicas, como mail section.

Quaisquer outras diretivas, como user  nginx; , worker_processes  1; , error_log  /var/log/nginx/error.log warn; e pid  /var/run/nginx.pid pode ser colocado dentro da seção principal ou contexto.

Mas algumas dessas diretivas, como a worker_processes também pode existir no event section.

Seções

As seções no Nginx definem a configuração dos módulos Nginx.

Por exemplo, o http section define a configuração para o ngx_http_core modulea event section define a configuração para o ngx_event_module enquanto a seção de correio define a configuração para o ngx_mail_module.

Você pode checar aqui para obter uma lista completa de seções no Nginx.

Diretivas

As diretivas no Nginx são compostas por um nome de variável e vários argumentos, como os seguintes:

o worker_processes é um nome de variável enquanto o auto serve de argumento.

  worker_processes  auto;

As diretivas terminam com um ponto e vírgula como mostrado acima.

Por fim, o arquivo de configuração do Nginx deve aderir a um determinado conjunto de regras. A seguir estão as sintaxes válidas da configuração do Nginx:

  • As diretivas válidas começam com um nome de variável seguido por um ou mais argumentos
  • Todas as diretivas válidas terminam com um ponto e vírgula ;
  • As seções são definidas com chaves {}
  • Uma seção pode ser incorporada em outra seção
  • A configuração fora de qualquer seção faz parte da configuração global do Nginx.
  • As linhas que começam com o sinal de hash # são comentários.

Ajustando o Nginx para desempenho

Nesta seção, configuraremos o Nginx para ter um desempenho melhor durante tráfego pesado e pico de tráfego.

Veremos como configurar:

  • Trabalhadores
  • Atividade de E/S de disco
  • Atividade de rede
  • Buffers
  • Compressão
  • Cache
  • Tempo esgotado

Ainda assim, dentro do ambiente virtual ativado, digite os seguintes comandos para mudar para o diretório Nginx e listar seu conteúdo.

  cd nginx && ls

Procure a pasta conf. Dentro desta pasta está o nginx.conf Arquivo.

Faremos uso deste arquivo para configurar o Nginx

Agora execute os seguintes comandos para navegar até o conf pasta e abra o arquivo nginx.conf com o <a href="https://tecnologico.online/7-editores-vim-para-melhor-produtividade-em-2023/">vim editor</a>

  cd conf
sudo vim nginx.conf

Abaixo está uma captura de tela de como o nginx.conf arquivo se parece por padrão.

Trabalhadores

Para permitir que o Nginx funcione melhor, precisamos configurar workers na seção de eventos. Configurar trabalhadores Nginx permite que você processe conexões de clientes de forma eficaz.

Supondo que você não tenha fechado o editor vim, pressione o botão i botão no teclado para editar o nginx.conf Arquivo.

Copie e cole o seguinte dentro do events section como mostrado abaixo:

 events { 
    worker_processes    auto;
    worker_connections  1024;
    worker_rlimit_nofile 20960;
    multi_accept        on;  
    mutex_accept        on; 
    mutex_accept_delay  500ms; 
    use                 epoll; 
    epoll_events        512;  
}

worker_processes: esta diretiva controla o número de trabalhadores no Nginx. O valor desta diretiva é definido como auto para permitir que o Nginx determine o número de núcleos disponíveis, discos, carga do servidor e subsistema de rede. No entanto, você pode descobrir o número de núcleos executando o comando lscpu no terminal.

worker_connections: Esta diretiva define o valor do número de conexões simultâneas que podem ser abertas por um trabalhador. o valor padrão é 512 mas nós configuramos para 1,024 para permitir que um trabalhador aceite uma conexão muito simultânea de um cliente.

worker_rlimit_nofile: Esta diretiva está de alguma forma relacionada com worker_connections. Para lidar com grandes conexões simultâneas, definimos um valor alto.

multi_accept: Essa diretiva permite que um trabalhador aceite muitas conexões na fila por vez. Uma fila neste contexto significa simplesmente uma sequência de objetos de dados esperando para serem processados.

mutex_accept: Esta diretiva está desativada por padrão. Mas como configuramos muitos trabalhadores no Nginx, precisamos ativá-lo conforme mostrado no código acima para permitir que os trabalhadores aceitem novas conexões uma a uma.

mutex_accept_delay: Esta diretiva determina quanto tempo um trabalhador deve esperar antes de aceitar uma nova conexão. Uma vez o accept_mutex está ativado, um bloqueio mutex é atribuído a um trabalhador por um período de tempo especificado pelo accept_mutex_delay . Quando o prazo terminar, o próximo funcionário da fila estará pronto para aceitar novas conexões.

use: Esta diretiva especifica o método para processar uma conexão do cliente. Neste tutorial, decidimos definir o valor como epoll porque estamos trabalhando em um Ubuntu plataforma. o epoll é o método de processamento mais eficaz para plataformas Linux.

epoll_events: O valor desta diretiva especifica o número de eventos que o Nginx irá transferir para o kernel.

E/S de disco

Nesta seção, configuraremos a atividade de E/S assíncrona no Nginx para permitir que ele execute a transferência de dados efetiva e melhore a eficácia do cache.

A E/S de disco refere-se simplesmente às operações de gravação e leitura entre o disco rígido e a RAM. Nós faremos uso de <a href="https://linux.die.net/man/2/sendfile">sendfile(</a>) função dentro do kernel para enviar pequenos arquivos.

Você pode fazer uso do http section, location section e server section para as directivas nesta área.

o location section, server section podem ser embutidos ou colocados dentro do http section para tornar a configuração legível.

Copie e cole o código a seguir dentro da seção de localização incorporada na seção HTTP.

 location /pdf/  {
   sendfile on; 
   aio      on; 
  }  

location /audio/ {  
    directio    4m
    directio_alignment 512  
}

sendfile: Para utilizar os recursos do sistema operacional, defina o valor desta diretiva como on. sendfile transfere dados entre descritores de arquivo dentro do espaço do kernel do sistema operacional sem enviá-los para os buffers do aplicativo. Esta diretiva será usada para servir arquivos pequenos.

directio: Essa diretiva melhora a eficácia do cache, permitindo que a leitura e a gravação sejam enviadas diretamente para o aplicativo. directio é um recurso de sistema de arquivos de todos os sistemas operacionais modernos. Esta diretiva será usada para servir arquivos maiores como vídeos.

aio: Esta diretiva permite multi-threading quando definida como on para operações de escrita e leitura. Multi-threading é um modelo de execução que permite que vários threads sejam executados separadamente uns dos outros enquanto compartilham seus recursos de processo de hospedagem.

directio_alignment: Esta diretiva atribui um valor de tamanho de bloco para a transferência de dados. Está relacionado com o directio diretiva.

Camada de rede

Nesta seção, faremos uso de diretivas como tcp_nodelay e tcp_nopush para evitar que pequenos pacotes esperem por um período de tempo especificado de cerca de 200 milissegundos antes de serem enviados de uma só vez.

Normalmente, quando os pacotes são transferidos em ‘pedaços’, eles tendem a saturar a rede altamente carregada. Então John Nagle construiu um algoritmo de buffer para resolver este problema. O objetivo do algoritmo de buffer de Nagle é evitar que pequenos pacotes saturem a rede altamente carregada.

Copie e cole o seguinte código dentro da seção HTTP.

 http {   

  tcp_nopush  on; 
  tcp_nodelay on;

  }

tcp_nodelay: Esta diretiva, por padrão, é desabilitada para permitir que pequenos pacotes esperem por um período especificado antes de serem enviados de uma só vez. Para permitir que todos os dados sejam enviados de uma só vez, esta diretiva está habilitada.

tcp_nopush: Porque habilitámos tcp_nodelay diretiva, pequenos pacotes são enviados de uma só vez. No entanto, se você ainda quiser usar o algoritmo de buffering de John Nagle, também podemos habilitar o tcp_nopush para adicionar pacotes uns aos outros e enviá-los todos de uma vez.

Buffers

Vamos dar uma olhada em como configurar os buffers de solicitação no Nginx para lidar com as solicitações de forma eficaz. Um buffer é um armazenamento temporário onde os dados são mantidos por algum tempo e processados.

Você pode copiar o abaixo na seção do servidor.

  server { 

   client_body_buffer_size 8k;
   client_max_body_size 2m; 
   client_body_in_single_buffer on;  
   client_body_temp_pathtemp_files 1 2;
   client_header_buffer_size  1m; 
   large_client_header_buffers 4 8k;

 }

É importante entender o que essas linhas de buffer fazem.

client_body_buffer_size: Esta diretiva define o tamanho do buffer para o corpo da solicitação. Se você planeja executar o servidor da Web em sistemas de 64 bits, precisa definir o valor como 16k. Se você deseja executar o servidor da Web no sistema de 32 bits, defina o valor como 8k.

client_max_body_size: Se você pretende lidar com uploads de arquivos grandes, você precisa definir esta diretiva para pelo menos 2m ou mais. Por padrão, é definido como 1m.

client_body_in_file_only: Se você desativou a diretiva client_body_buffer_size com o símbolo de hashtag # e esta diretiva client_body_in_file_only estiver definido, o Nginx salvará os buffers de solicitação em um arquivo temporário. Isso não é recomendado para um ambiente de produção.

client_body_in_single_buffer: Às vezes, nem todo o corpo da solicitação é armazenado em um buffer. O restante é salvo ou gravado em um arquivo temporário. No entanto, se você pretende salvar ou armazenar o buffer de solicitação completo em um único buffer, é necessário habilitar esta diretiva.

client_header_buffer_size: Você pode usar esta diretiva para definir ou alocar um buffer para cabeçalhos de solicitação. Você pode definir esse valor para 1m.

large_client_header_buffers: Essa diretiva é usada para definir o número e o tamanho máximos para leitura de cabeçalhos de solicitação grandes. Você pode definir o número máximo e o tamanho do buffer para e 8k precisamente.

Compressão

A compactação da quantidade de dados transferidos pela rede é outra maneira de garantir que seu servidor da Web funcione melhor. Nesta seção, faremos uso de diretivas como gzip, gzip_comp_levele gzip_min_length para compactar dados.

Cole o seguinte código dentro do http section como mostrado abaixo:

  http {  

  gzip on;
  gzip_comp_level  2;
  gzip_min_length  1000; 
  gzip_types  text/xml text/css; 
  gzip_http_version 1.1; 
  gzip_vary  on;  
  gzip_disable "MSIE (4-6) ."; 

}

gzip: Se você deseja ativar a compactação, defina o valor desta diretiva como on. Por padrão, ele está desabilitado.

gzip_comp_level: Você pode usar esta diretiva para definir o nível de compactação. Para não desperdiçar recursos da CPU, você não precisa definir o nível de compactação muito alto. Entre 1 e 9você pode definir o nível de compressão para 2 ou 3.

gzip_min_length: Defina o comprimento mínimo de resposta para compactação por meio do content-length response header field. Você pode configurá-lo para mais de 20 bytes.

gzip_types: Esta diretiva permite que você escolha o tipo de resposta que deseja compactar. Por padrão, o tipo de resposta text/html é sempre compactado. Você pode adicionar outro tipo de resposta, como text/css como mostrado no código acima.

gzip_http_version: Essa diretiva permite escolher a versão HTTP mínima de uma solicitação para uma resposta compactada. Você pode fazer uso do valor padrão que é 1.1.

gzip_vary: Quando gzip diretiva está habilitada, esta diretiva adiciona o campo de cabeçalho Vary:Accept Encoding à resposta.

gzip_disabled: Alguns navegadores como Internet Explorer 6 não tem suporte para gzip compression. Esta diretiva faz uso de User-Agent campo de cabeçalho de solicitação para desabilitar a compactação para determinados navegadores.

Cache

Aproveite os recursos de cache para reduzir o número de vezes para carregar os mesmos dados várias vezes. O Nginx fornece recursos para armazenar em cache metadados de conteúdo estático via open_file_cache diretiva.

Você pode colocar esta diretiva dentro do server, location e http seção.

  http {  

open_file_cache max=1,000 inactive=30s; 
open_file_cache_valid 30s; 
open_file_cache_min_uses 4; 
open_file_cache_errors on; 

 }

open_file_cache: Esta diretiva está desativada por padrão. Ative-o se quiser implementar o cache no Nginx. Esta diretiva armazena metadados de arquivos e diretórios comumente solicitados pelos usuários.

open_file_cache_valid: Esta diretiva contém informações de backup dentro do open_file_cache diretiva. Você pode usar esta diretiva para definir um período de validade geralmente em segundos após o qual as informações relacionadas a arquivos e diretórios são revalidadas novamente.

open_file_cache_min_uses: O Nginx geralmente limpa as informações dentro do open_file_cache directiva após um período de inactividade com base na open_file_cache_min_uses. Você pode usar esta diretiva para definir um número mínimo de acesso para identificar quais arquivos e diretórios são acessados ​​ativamente.

open_file_cache_errors: Você pode usar esta diretiva para permitir que o Nginx armazene em cache erros como “permissão negada” ou “não é possível acessar este arquivo” quando os arquivos são acessados. Portanto, sempre que um recurso é acessado por um usuário que não tem o direito de fazê-lo, o Nginx exibe o mesmo relatório de erro “permissão negada”.

Tempo esgotado

Configure o tempo limite usando diretivas como keepalive_timeout e keepalive_requests para evitar que conexões de longa espera desperdicem recursos.

Na seção HTTP, copie e cole o seguinte código:

  http {  

 keepalive_timeout  30s; 
 keepalive_requests 30;
 send_timeout      30s;

}

keepalive_timeout: mantenha as conexões ativas por cerca de 30 segundos. O padrão é 75 segundos.

keepalive_requests: configure um número de solicitações para manter ativo por um período de tempo específico. Você pode definir o número de solicitações para 20 ou 30.

keepalive_disable: se você deseja desabilitar a conexão keepalive para um grupo específico de navegadores, use esta diretiva.

send_timeout: Defina um tempo limite para a transmissão de dados para o cliente.

Configuração de segurança para Nginx

O seguinte se concentra apenas em como configurar com segurança um Nginx em vez de um aplicativo da web. Portanto, não veremos ataques baseados na Web, como SQL injeção e assim por diante.

Nesta seção veremos como configurar o seguinte:

  • Restringir o acesso a arquivos e diretórios
  • Configurar logs para monitorar atividades maliciosas
  • Evitar DDoS
  • Desativar listagem de diretórios

Restringir o acesso a arquivos e diretórios

Vejamos como restringir o acesso a arquivos e diretórios confidenciais por meio dos métodos a seguir.

Fazendo uso da Autenticação HTTP

Podemos restringir o acesso a arquivos confidenciais ou áreas não destinadas à exibição pública, solicitando autenticação de usuários ou até mesmo administradores. Execute o seguinte comando para instalar um utilitário de criação de arquivo de senha se você não o tiver instalado.

  apt-get install -y apache-utils

Em seguida, crie um arquivo de senha e um usuário usando o htpasswd ferramenta como mostrado abaixo. o htpasswd ferramenta é fornecida pelo apache2-utils Utilitário.

  sudo  htpasswd  -c  /etc/apache2/ .htpasswd mike

Você pode confirmar se você teve sucesso criou um usuário e senha aleatória através do seguinte comando

  cat  etc/apache2/ .htpasswd

Dentro da seção de localização, você pode colar o seguinte código para solicitar autenticação dos usuários usando o auth_basic diretiva.

  location /admin {  

 basic_auth "Admin Area"; 
 auth_basic_user_file /etc/apache2/ .htpasswd; 

}

Fazendo uso da diretiva Allow

Em adição a basic_auth directiva, podemos fazer uso da allow diretiva para restringir o acesso.

Dentro da seção de localização, você pode usar o código a seguir para permitir que os endereços IP especificados acessem a área sensível.

  location /admin {  
 allow 192.168.34.12; 
 allow 192.168.12.34; 
}

Configurar logs para monitorar atividades maliciosas

Nesta seção, vamos configurar error e access logs para monitorar especificamente solicitações válidas e inválidas. Você pode examinar esses logs para descobrir quem efetuou login em um determinado momento ou qual usuário acessou um determinado arquivo e assim por diante.

error_log: Permite configurar o registro em um arquivo específico, como syslog ou stderr. Você também pode especificar o nível de mensagens de erro que deseja registrar.

access_log: Permite gravar a solicitação dos usuários no arquivo access.log

Dentro da seção HTTP, você pode usar o seguinte.

  http {  

  access_log  logs/access.log   combined; 
  error_log   logs/warn.log     warn;

}

Evitar DDOS

Você pode proteger o Nginx de um ataque DDOS pelos seguintes métodos:

Limitando solicitações de usuários

Você pode fazer uso do limit_req_zone e limit_req diretivas para limitar a taxa de uma solicitação enviada pelos usuários em minutos.

Adicione o seguinte código no location seção embutida na seção do servidor.

  limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;  

server {
 location /admin.html { 
   limit_req zone=one;
       }

}

Limite o número de conexões

Você pode fazer uso do limit_conn e limit_conn_zone diretivas para limitar a conexão a determinados locais ou áreas. Por exemplo, o código abaixo recebe 15 conexões de clientes por um período específico.

O seguinte código irá para o location seção.

  limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
   
    location /products/ {
        limit_conn addr 10;
       
    }
}

Terminar conexões lentas

Você pode fazer uso de diretivas de tempo limite, como o client_body_timeout e client_header_timeout para controlar quanto tempo o Nginx esperará pelas gravações do client body e client header.

Adicione o seguinte dentro do server seção.

  server {
    client_body_timeout 5s;
    client_header_timeout 5s;
}

Também seria uma boa ideia interromper os ataques DDoS na borda, aproveitando soluções baseadas em nuvem como mencionado aqui .

Desativar listagem de diretórios

Você pode fazer uso do auto_index diretiva para impedir a listagem de diretórios, conforme mostrado no código abaixo. Você precisa configurá-lo para o valor off para desativar a listagem de diretórios.

  location / {  
 auto_index  off;
}

Conclusão

Configuramos o servidor da web Nginx para funcionar de forma eficaz e protegê-lo contra abuso excessivo em um ambiente de produção. Se você estiver usando o Nginx para aplicativos da Web voltados para a Internet, também deve considerar o uso de um CDN e segurança baseada em nuvem para melhor desempenho e segurança.

Artigos relacionados