Engenharia

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:

Tela de boas-vindas ao Kibana

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:

Botões Hosts, Kubernetes e Docker

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:

Clique no botão Hosts para ver os dados sendo fornecidos

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.

Gráficos do Kibana mostrando métricas do servidor

Logs

Se navegarmos até o aplicativo Logs, poderemos ver nossos logs de acesso e erro que foram fornecidos provenientes do Filebeat.

Aplicativo Logs do Kibana mostrando logs de erro e acesso

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:

Página do Kibana mostrando os painéis disponíveis

Se especificarmos que a pesquisa seja "nginx", teremos estes painéis disponíveis:

Página do Kibana mostrando os painéis do NGINX 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:

Filebeat NGINX - logs de acesso e erro - ECS

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ê.

Experimente

Começar com o Elastic Stack é fácil— você pode baixar vários produtos por meio dos comandos curl fornecidos ou navegar até a nossa página de downloads e obtê-los lá mesmo. Ou tem um jeito ainda mais fácil, que é executar uma avaliação gratuita por 14 dias do Elasticsearch Service e acessar dali. Se tiver qualquer dúvida, consulte os fóruns do Discuss.