Como monitorar servidores web NGINX com o Elastic Stack
Neste artigo, vamos analisar como podemos monitorar o NGINX usando os vários componentes do Elastic Stack. Vamos usar o Metricbeat e o Filebeat para coletar dados. Esses dados serão fornecidos e armazenados no Elasticsearch. Por fim, vamos visualizar esses dados com o Kibana.
O Metricbeat coletará dados relacionados às conexões (ativas, manipuladas, aceitas etc.) e o número total de solicitações do cliente. O Filebeat coletará dados relacionados a logs de acesso e erro. A milhagem será variável entre diferentes instalações, mas para a maior parte podemos usar essas informações para deduzir determinadas situações, por exemplo:
- Um pico nos logs de erro para um recurso específico pode significar que excluímos um recurso que ainda é necessário.
- Os logs de acesso podem mostrar quando são os horários de pico de um serviço (e assim quando será mais conveniente executar operações como manutenção).
- Um pico repentino nas solicitações de cliente pode apontar alguma atividade maliciosa (como um ataque de DDoS).
O principal foco deste artigo é a funcionalidade de monitoramento, por isso operações como a instalação do Elasticsearch serão breves. Eu uso um Mac e, por isso, usarei as distribuições do Elasticsearch, Metricbeat, Filebeat e Kibana para Mac. As distribuições para outras plataformas podem ser adquiridas na página de downloads.
Instalação do Elasticsearch
O Metricbeat e o Filebeat (na realidade, todos os Beats) precisam de um cluster do Elasticsearch para armazenar dados. Vamos instalar localmente um cluster simples do Elasticsearch. Como não estamos expondo o Elasticsearch externamente, não desperdiçaremos tempo configurando a segurança.
Etapa 1: fazer download do Elasticsearch
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.0-darwin-x86_64.tar.gz
Etapa 2: extrair o arquivo
tar -xvf elasticsearch-7.1.0-darwin-x86_64.tar.gz
Etapa 3: alterar para o diretório bin
cd elasticsearch-7.1.0/bin
Etapa 4: iniciar nosso cluster de nó único
./elasticsearch
Por padrão, o cluster será executado em localhost:9200
.
Execução do NGINX
Há muitas maneiras de executar o NGINX — de forma autônoma no host, via container do Docker, em uma instalação do Kubernetes etc. O Beats tem um recurso Autodiscover que pode ouvir eventos de API de container para rastrear nossos containers de servidor à medida que são executados ou removidos.
Considerando a variedade de maneiras como o NGINX pode ser instalado e configurado, este artigo não faz muitas pressuposições e mostrará a configuração do host, além de exemplos de Autodiscover (Docker, neste caso).
Configuração do Metricbeat e do Filebeat
Agora vamos configurar o Beats para começar a coletar e fornecer nossos dados.
Metricbeat
Vamos usar o Metricbeat para coletar métricas.
Etapa 1: fazer download do Metricbeat:
curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.1.0-darwin-x86_64.tar.gz
Etapa 2: extrair o arquivo
tar -xvf metricbeat-7.1.0-darwin-x86_64.tar.gz
Etapa 3: alterar diretórios
cd metricbeat-7.1.0-darwin-x86_64
É hora da configuração!
Por padrão, nosso arquivo de configuração (metricbeat.yml) procurará um cluster do Elasticsearch em execução em localhost:9200, que é o que configuramos anteriormente.
Etapa 4: habilitar módulos relevantes do Metricbeat
Por padrão, somente métricas de nível de sistema são coletadas:
./metricbeat modules enable nginx
Etapa 5: alterar propriedades de arquivo
Precisamos alterar algumas propriedades de arquivo, porque executaremos o Metricbeat como raiz (como alternativa, é possível optar por usar a opção --strict.perms=false na linha de comando para desabilitar as verificações de permissão estritas):
sudo chown root metricbeat.yml sudo chown root modules.d/system.yml sudo chown root modules.d/nginx.yml
Etapa 6: habilitar conjuntos de métricas
Se abrirmos nosso arquivo modules.d/nginx.yml
, poderemos habilitar o conjunto de métricas stubstatus
, que envolve retornar ao código-fonte o comentário deste trecho:
#metricsets: # - stubstatus
Esse conjunto de métricas coleta dados do módulo ngx_http_stub_status do NGINX; é importante que esse módulo do NGINX esteja configurado para que o conjunto de métricas funcione.
Você também pode alterar os hosts sendo monitorados aqui; por padrão, <a href="http://127.0.0.1">http://127.0.0.1</a>
é monitorado. Para instalações baseadas em host, isso é tudo o que é necessário.
Etapa 7: instalações de Autodiscover (alternativa)
Com as instalações de Autodiscover, a configuração equivalente será variável entre os três provedores, a saber, Docker, Kubernetes e Jolokia. Um exemplo do Docker teria aparência semelhante a esta, em que adicionamos metricbeat.autodiscover
à parte inferior do arquivo de configuração metricbeat.yml
.
metricbeat.autodiscover: providers: - type: docker templates: - condition: contains: docker.container.image: nginx config: - module: nginx metricsets: ["stubstatus"] hosts: "${data.host}:${data.port}"
Com essa configuração, todos os containers do Docker que usam uma imagem com NGINX no nome (containers executarão uma correspondência de subcadeia de caracteres, em vez de uma correspondência exata) terão correspondência e usarão uma configuração que habilita o módulo do NGINX com o conjunto de métricas stubstatus.
Etapa 8: executar o Metricbeat
Beleza! Agora que fizemos a configuração, podemos executar o Metricbeat com um sinalizador que envia os logs para stderr e desabilita a saída de syslog/file:
sudo ./metricbeat -e
Se tudo tiver funcionado bem, você deverá ver alguma saída inicial, e depois mais saídas toda vez em que o Metricbeat postar de volta os dados no cluster.
Filebeat
Vamos usar o Filebeat para coletar logs.
Etapa 1: fazer download do Filebeat
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.0-darwin-x86_64.tar.gz
Etapa 2: extrair o arquivo
tar -xvf filebeat-7.1.0-darwin-x86_64.tar.gz
Etapa 3: alterar diretórios
cd filebeat-7.1.0-darwin-x86_64
Etapa 4: habilitar o módulo do NGINX
./filebeat modules enable nginx
Por padrão, logs de acesso e erro serão coletados. Em relação aos caminhos do arquivo de log, o Filebeat tentará determiná-los com base no sistema operacional; se precisar definir diferentes caminhos explicitamente, você poderá defini-los no arquivo de configuração modules.d/nginx.yml.
Etapa 5: alterar as propriedades de arquivo
sudo chown root filebeat.yml sudo chown root modules.d/nginx.yml sudo chown root module/nginx/access/manifest.yml sudo chown root module/nginx/error/manifest.yml
Para uma instalação baseada em host, isso é tudo o que é necessário.
Etapa 6: instalação de Autodiscover (alternativa)
Como antes, a configuração adicional é necessária para usar o Autodiscover. Semelhante à seção anterior, o exemplo do Docker precisaria de uma seção de Autodiscover adicionada à configuração, e o arquivo filebeat.yml teria aparência semelhante a esta:
filebeat.autodiscover: providers: - type: docker templates: - condition: contains: docker.container.image: nginx config: - module: nginx access: input: type: docker containers.ids: - "${data.docker.container.id}" error: input: type: docker containers.ids: - "${data.docker.container.id}"
Neste ponto, configuramos as opções de acesso e erro para usar uma entrada do Docker. Uma entrada do Docker pesquisará logs de container sob o caminho (o caminho base em que os logs do Docker estão localizados; por padrão é este /var/lib/docker/containers)
. Especificamos containers.ids
usando o(s) id(s) dos containers que fizeram correspondência com a condição do nosso modelo. Combinados, os logs (por padrão) terão como fonte /var/lib/docker/containers/ac29b98ad83ca43bb4c15ae8f0d03aff8c7d57bf5dee9024124374b92b14b0f2/
(os ids serão diferentes).
Etapa 7: executar o Filebeat
sudo ./filebeat -e
instalação do Kibana
Agora que temos o Metricbeat e o Filebeat fornecendo dados sobre nosso(s) servidor(es) NGINX, precisamos de uma maneira de visualizar esses dados, e é nessa hora que o Kibana entra.
Etapa 1: fazer download do Kibana
curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.1.0-darwin-x86_64.tar.gz
Etapa 2: extrair o arquivo e alterar o diretório
tar -xzf kibana-7.1.0-darwin-x86_64.tar.gz
cd kibana-7.1.0-darwin-x86_64
Etapa 3: executar o Kibana
./bin/kibana
Por padrão, o Kibana usará um host do Elasticsearch de http://localhost:9200
e estará acessível em http://localhost:5601
.
Se você navegar até http://localhost:5601
, deverá ser recebido por esta tela:
Outra opção é experimentar a amostra de dados, mas vamos apenas clicar em Explore on my own (Explorar por minha conta).
Visualização dos dados do NGINX no Kibana
Depois vamos examinar como podemos usar o Kibana para visualizar e analisar nossos dados.
Infrastructure
Se navegarmos até o aplicativo Infrastructure na barra lateral do Kibana, poderemos ver uma visualização de instantâneo (último minuto) da nossa infraestrutura. Dependendo da configuração que foi usada, os dados estarão acessíveis em Hosts para instalações não baseadas no Autodiscover; para instalações do Autodiscover, os botões Docker e Kubernetes (com base no provedor que foi usado) levarão você até o conjunto de dados correto:
Como eu estava usando uma instalação baseada no Hosts, posso clicar no botão Hosts e ver os seguintes dados sendo fornecidos provenientes do Metricbeat:
Se selecionarmos um desses nós e escolhermos View Metrics, poderemos ver uma página com métricas detalhadas para esse único servidor do NGINX.
Logs
Se navegarmos até o aplicativo Logs, poderemos ver nossos logs de acesso e erro que foram fornecidos provenientes do Filebeat.
Painéis do NGINX pré-configurados
Agora que temos uma instância do Kibana em execução e acessível, podemos carregar alguns painéis pré-criados.
Para carregar os painéis do Metricbeat, execute este código no diretório do Metricbeat:
sudo ./metricbeat setup --dashboards
E faça o mesmo para o Filebeat:
sudo ./filebeat setup --dashboards
Agora, se navegarmos até a guia Dashboards (Painéis) no Kibana, deveremos ver esta tela:
Se especificarmos que a pesquisa seja "nginx", teremos estes painéis disponíveis:
O painel [Filebeat NGINX] Access and error logs ECS ([Filebeat NGINX] Logs de acesso e erro - ECS), como exemplo, tem aparência semelhante a esta:
E assim aprendemos como usar o Elastic Stack para monitorar os servidores do NGINX. A partir deste ponto, existem várias opções disponíveis (por exemplo, diferentes opções de agrupamento e filtragem) até chegar às informações detalhadas que realmente importam para você.