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 module
a 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 4
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_level
e 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 9
você 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.