Configurando o Nginx para desempenho e segurança

Neste tutorial, veremos como podemos configurar o servidor da 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, após a instalação bem-sucedida. No entanto, a configuração padrão não é boa o suficiente para um ambiente de produção. Portanto, focaremos em como configurar o Nginx para ter um desempenho melhor durante o pico de tráfego pesado e normal e em como protegê-lo dos usuários que pretendem abusar dele..

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

Exigências

Você precisa ter o seguinte instalado em sua máquina e 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 ou executar alguns comandos neste tutorial como usuário root através do comando sudo.

Entendendo 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 de Nginx

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

O arquivo de configuração completo do Nginx possui uma estrutura lógica composta por diretivas agrupadas em várias seções, como a seção de eventos, a seção http, a seção mail 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 a seção de correio.

Quaisquer outras diretivas, como user nginx; , Worker_processes 1; , Error_log /var/log/nginx/error.log warn; e pid /var/run/nginx.pid podem ser colocados na seção ou contexto principal.

Mas algumas dessas diretivas, como worker_processes, também podem existir na seção event.

Seções

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

Por exemplo, a seção http define a configuração do módulo ngx_http_core, a seção event define a configuração do ngx_event_module enquanto a seção mail define a configuração do ngx_mail_module.

Você pode checar aqui para obter uma lista completa das 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 como argumento.

worker_processes auto;

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

Por fim, o arquivo de configuração do Nginx deve aderir a um conjunto específico de regras. A seguir, é apresentada a sintaxe válida da configuração do Nginx:

  • Diretivas válidas começam com um nome de variável e são seguidas por um ou mais argumentos
  • Todas as diretivas válidas terminam com 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 intenso e pico de tráfego.

Vamos ver como configurar:

  • Trabalhadores
  • Atividade de E / S de disco
  • Atividade de rede
  • Buffers
  • Compressão
  • Armazenamento em 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 arquivo nginx.conf.

Usaremos esse arquivo para configurar o Nginx

Agora execute os seguintes comandos para navegar para a pasta conf e abrir o arquivo nginx.conf com o editor vim

cd conf
sudo vim nginx.conf

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

Trabalhadores

Para permitir que o Nginx tenha um desempenho melhor, precisamos configurar os trabalhadores na seção de eventos. A configuração dos trabalhadores do Nginx permite processar conexões de clientes de maneira eficaz.

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

Copie e cole o seguinte dentro da seção de eventos, como mostrado abaixo:

eventos {
worker_processes auto;
worker_connections 1024;
worker_rlimit_nofile 20960;
multi_accept on;
mutex_accept ativado;
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 automático 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 o definimos como 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 às conexões de trabalho. Para lidar com grandes conexões simultâneas, definimos um valor grande.

multi_accept: Esta diretiva permite que um trabalhador aceite muitas conexões na fila de cada vez. Uma fila neste contexto significa simplesmente uma sequência de objetos de dados aguardando processamento.

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

mutex_accept_delay: Esta diretiva determina quanto tempo um trabalhador deve esperar antes de aceitar uma nova conexão. Depois que o accept_mutex é ativado, um bloqueio mutex é designado a um trabalhador por um período 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 uma plataforma Ubuntu. O método 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 a transferência efetiva de dados e melhorar a eficácia do cache.

A E / S de disco refere-se simplesmente a operações de gravação e leitura entre o disco rígido e a RAM. Vamos fazer uso de Enviar arquivo() funcionam dentro do kernel para enviar arquivos pequenos.

Você pode usar a seção http, a seção de localização e a seção do servidor para obter diretrizes nessa área.

A seção local, a seção servidor, pode ser incorporada ou colocada na seção http para tornar a configuração legível.

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

local / pdf / {
sendfile ativado;
aio on;
}

local / áudio / {
directio 4m
directio_alignment 512
}

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

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

aio: Esta diretiva permite multiencadeamento quando ativado para operação de gravação e leitura. O multiencadeamento é um modelo de execução que permite que vários encadeamentos sejam executados separadamente, enquanto compartilham seus recursos de processo de hospedagem.

directio_alignment: Esta diretiva atribui um valor de tamanho de bloco à transferência de dados. Relacionou-se à diretiva directio.

Camada de rede

Nesta seção, usaremos diretivas como tcp_nodelay e tcp_nopush para impedir que pequenos pacotes aguardem um período especificado de cerca de 200 milissegundos antes de serem enviados de uma só vez..

Geralmente, 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 esse problema. O objetivo do algoritmo de buffer da Nagle é impedir que pequenos pacotes saturem a rede altamente carregada.

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

http {

tcp_nopush on;
tcp_nodelay on;

}

tcp_nodelay: essa diretiva, por padrão, está desabilitada para permitir que pequenos pacotes aguardem 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: Como habilitamos a diretiva tcp_nodelay, pacotes pequenos são enviados de uma só vez. No entanto, se você ainda quiser usar o algoritmo de buffer de John Nagle, também podemos permitir que o tcp_nopush adicione pacotes um ao outro e envie todos de uma só vez.

Buffers

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

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

servidor {

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, defina 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, precisará 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 está configurada, 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ê deseja salvar ou armazenar o buffer de solicitação completo em um único buffer, é necessário ativar 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: esta diretiva é usada para definir o número e tamanho máximo para a leitura de cabeçalhos grandes de solicitações. Você pode definir o número máximo e o tamanho do buffer para 4 e 8k com precisão.

Compressão

A compactação da quantidade de dados transferidos pela rede é outra maneira de garantir que o servidor da Web tenha um desempenho melhor. Nesta seção, usaremos diretivas como gzip, gzip_comp_level e gzip_min_length para compactar dados.

Cole o seguinte código na seção http, 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 ativado. Por padrão, está desativado.

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

gzip_min_length: defina o tamanho mínimo da resposta para compactação através do campo do cabeçalho de resposta do tamanho do conteúdo Você pode configurá-lo para mais de 20 bytes.

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

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

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

gzip_disabled: alguns navegadores como o Internet Explorer 6 não têm suporte para compactação gzip. Esta diretiva faz uso do campo de cabeçalho de solicitação do agente do usuário para desativar a compactação para determinados navegadores.

Armazenamento em cache

Aproveite os recursos de armazenamento em 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 diretiva open_file_cache.

Você pode colocar esta diretiva na seção servidor, local e http.

http {

open_file_cache max = 1.000 inativo = 30s;
open_file_cache_valid 30s;
open_file_cache_min_uses 4;
open_file_cache_errors ativado;

}

open_file_cache: esta diretiva está desativada por padrão. Habilite se você deseja 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 da diretiva open_file_cache. Você pode usar esta diretiva para definir um período válido, geralmente em segundos, após o qual as informações relacionadas a arquivos e diretórios são novamente validadas novamente..

open_file_cache_min_uses: o Nginx geralmente limpa as informações dentro da diretiva open_file_cache após um período de inatividade com base no 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 pode 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 impedir que conexões de longa espera desperdiçam 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-se ativo por um período específico. Você pode definir o número de solicitações para 20 ou 30.

keepalive_disable: se você deseja desativar 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 ao cliente.

Configuração de segurança para Nginx

A seguir, concentre-se apenas em como configurar com segurança um Nginx em vez de um aplicativo da Web. Portanto, não consideraremos ataques baseados na Web, como injeção de SQL, etc..

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ório

Restringir o acesso a arquivos e diretórios

Vamos ver como restringir o acesso a arquivos e diretórios confidenciais através dos seguintes métodos.

Fazendo uso da autenticação HTTP

Podemos restringir o acesso a arquivos ou áreas confidenciais não destinadas à exibição pública solicitando autenticação de usuários ou mesmo de 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 a ferramenta htpasswd, como mostrado abaixo. A ferramenta htpasswd é fornecida pelo utilitário apache2-utils.

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

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

gato etc / apache2 / .htpasswd

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

local / administrador {

basic_auth "Área de administração";
auth_basic_user_file / etc / apache2 / .htpasswd;

}

Ao fazer uso da diretiva Allow

Além da diretiva basic_auth, podemos fazer uso da diretiva allow para restringir o acesso.

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

local / administrador {
permitir 192.168.34.12;
permitir 192.168.12.34;
}

Configurar logs para monitorar atividades maliciosas

Nesta seção, configuraremos os logs de erro e acesso 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 arquivo específico e assim por diante.

error_log: permite configurar o log para 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 solicitações de usuários no arquivo access.log

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

http {

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

}

Impedir DDOS

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

Limitando solicitações de usuários 

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

Adicione o seguinte código na seção local incorporada na seção servidor.

zona limit_req_zone $ binary_remote_addr = taxa de um: 10m = 30r / m;

servidor {
location /admin.html {
zona limit_req = um;
}

}

Limitar o número de conexões 

Você pode usar as diretivas limit_conn e limit_conn_zone 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 código a seguir irá para a seção local.

limit_conn_zone $ zona binary_remote_addr = endereço: 10m;

servidor {

local / produtos / {
limit_conn addr 10;

}
}

Terminar conexões lentas   

Você pode usar diretivas de tempo limite, como client_body_timeout e client_header_timeout, para controlar quanto tempo o Nginx aguardará gravações no corpo e no cabeçalho do cliente.

Adicione o seguinte dentro da seção do servidor.

servidor {
client_body_timeout 5s;
client_header_timeout 5s;
}

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

Desativar listagem de diretório

Você pode usar a diretiva auto_index para impedir a listagem de diretórios, conforme mostrado no código abaixo. Você precisa defini-lo com o valor off para desativar a listagem de diretórios.

local / {
auto_index desativado;
}

Conclusão

Configuramos o servidor da Web Nginx para executar com eficácia 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, considere também o uso de uma CDN e segurança baseada na nuvem para obter melhor desempenho e segurança.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map