E o serviço pára

Um tutorial de como criar um pequeno script para a verificação de serviços de web no IIS

Nada mais comum que serviços do Windows NT pararem sem uma explicação (por mais absurda que possa ser) e nos deixar na mão.

Também sofrendo deste mal com um servidor de web (IIS – Internet Information Server 4), resolvi criar um script em Perl que, a cada 2 minutos (configurável de acordo com suas necessidades), testa se os serviços de web e todos os domínios virtuais (virtual hosts) configurados estão 100% em funcionamento e, no caso de qualquer um estar parado, reinicia-o automaticamente.

O problema
Além de todas as minhas atribuições em consultorias e treinamentos, mantenho uma equipe de desenvolvimento ativa para a prestação de serviços em desenvolvimento de aplicações para a Web, sejam estas sites, estruturas de comércio eletrônico, implementação de aplicações, sistemas de Intranets, etc. Com isto, administramos alguns sites de clientes em um de nossos servidores localizado nos E.U.A.

De tempos em tempos percebia que os sites simplesmente paravam de responder as requisições dos usuários, mesmo estando o serviço de publicação de Web (IIS) funcionando “corretamente” (pelo menos aparentava). Em uma cansativa busca pelo MSDN da Microsoft e toda sua ferramenta de busca, encontrei somente pistas do que poderia estar acontecendo, o que não me adiantava muito pois, os sites precisam estar disponíveis 24 horas por dia para acesso.

Diante disto, resolvi criar um script que, em conjunto com o agendador de tarefas (Task Schedule) do Windows NT, pudesse verificar se todos os sites (virtuais ou não) estavam realmente respondendo as requisições vindas de clientes.

Por quê Perl?
Há algum tempo venho desenvolvendo ferramentas baseadas em Perl para administração e monitoração de sistemas em ambientes Unix/Linux, o que me permitia criar fácil e rapidamente um script para trabalhar em ambiente win32 também. Um outro fator determinante na escolha foi que não poderia ser utilizada nenhuma ferramenta de desenvolvimento que utilizasse os serviços do IIS pois, em caso de pane no mesmo, o script também ficaria inativo e de nada adiantaria tê-lo.

Finalmente, a questão mais contundente foi a portabilidade; desenvolvendo para Win32, poderia facilmente portar a aplicação para ambientes Unix/Linux a fim de monitorar também os serviços de http nestas plataformas.

A empresa ActiveState (http://www.activestate.com) mantém uma versão da linguagem Perl para ambientes Windows gratuita denominada ActivePerl, sendo esta totalmente compatível com a versão para o ambiente “X” encontrada em http://www.perl.com.

Como já possuímos o Perl instalado em nosso servidor, resolvi colocar mãos à obras para acabar com mais este problema.

O script
O grande desafio foi descobrir como testar se cada um dos sites virtuais estavam em funcionamento ou não. Inicialmente tentamos somente verificar se o IIS estava funcionando ou não, mas logo percebemos que muitas vezes o IIS continuava funcionado mas vários sites administrados por ele paravam (BTW: Se alguém souber por que isto acontece, entre em contato e nos conte!).

Em uma nova busca pelo MSDN descobrimos uma parte de código que nos mostrava como fazer o teste.

Observando o código percebemos o instanciamento de um objeto ())ServObj(() que trás as informações que precisamos. Neste exemplo está sendo apresentado o root do primeiro site virtual do IIS disponível. Era o que precisávamos para colocar em prática as idéias do script.

A partir deste ponto foi fácil desenvolver o script.

Nota: Para aqueles que não conhecem Perl, indico o site Perl.com (http://www.perl.com) para aprendizado.

Observe que este script utiliza uma página qualquer (que pode conter somente um “hello world!”) para verificar se o servidor virtual está respondendo. Assim, conseguimos testar efetivamente se cada um dos domínios virtuais estão respondendo 100%.

Também neste script não existe o envio de e-mail para um administrador ou operador do sistema, opção esta que será abordada no próximo artigo sobre este script juntamente com o log que o mesmo gera.

O agendamento (schedule) do funcionamento deste script ficou a cargo do próprio servidor, onde utilizamos o Agendador de tarefas (Task Scheduler) para esta função, fazendo com que a cada 2 minutos todos os sites sejam testados e, caso algum pare, que seja reiniciado.

Finalizando…
Até o momento o script funciona sem nenhum problema ou dano ao sistema (e já fazem 2 meses e meio!) verificando a cada 2 minutos se todos os domínios virtuais se encontram respondendo as requisições.

Encontramos alguns problemas com o MTS do IIS 4 que, certas vezes entra em parafuso e trava completamente o serviço de Web. Na versão mais avançada do script colocamos uma saída para isto também.

Finalmente, muitos perguntaram (mesmo depois de terem lido o artigo) o por quê de se utilizar Perl.

A resposta mais simples possível: hoje, temos o mesmo script rodando em um servidor Linux como redundância ao que se encontra no NT que, além de testar se os sites estão no ar, em caso de queda ou travamento da máquina, reinicia a mesma automaticamente sem nenhuma intervenção de administradores. Neste ponto entrou o Perl. O script desenvolvido para NT é o mesmo para Linux que conta com algumas funcionalidades a mais, somente isto.

Enfim, portabilidade é o nome da ação. Não existe aqui “puxada de sardinha” para esta ou aquela linguagem, mas sim resolução de problemas. Rápido, prático e portável.

Na segunda parte deste artigo estarei apresentando como enviar e-mails (sem servidores de SMTP, inclusive) e os logs de funcionamento do script. Aguarde!