sábado, 18 de janeiro de 2014

Otimizando o Servidor Web Apache



Imagine o seu domínio saindo do ar porque a máquina no qual o site está hospedado não possui memória ou processador suficiente para processar todas as requisições que chegam até ela, ou isto já aconteceu, ou está acontecendo com você neste exato instante . Isto muito é mal não é ?
Por experiencia própria vou tentar passar aqui algumas dicas para evitar que isto aconteça, seja você um web master ou um administrador de redes.
Quando um sistema é desenvolvido, um dos requisitos do projetado é verificar a plataforma e hardware no qual este sistema sera executado, podendo prever se servidores já ativos suportarão a aplicação desenvolvida ou se será necessária a contratação de uma máquina mais robusta.
Mas o que fazer se mesmo após toda uma análise de requisitos e após algum tempo o servidor começar a dar TOP(s) muito altos, chegando até a travar o sistema, tornando o acesso remoto impossível porque de uma hora para outra muitas requisições chegaram ao servidor Apache e muitas requisições a base de dados foram executadas, deixando o MySQL totalmente doido.
Não existe uma forma genérica para se configurar serviços web, principalmente um servidor Web Apache apara responder a requisições em excesso, porem podemos chegar a um consenso ou uma luz no fim do túnel para agradarmos a Gregos e Troianos de como configura-lo a fim de otimizar os serviços prestados.
A ultima frase não é um tanto quanto animadora, mas, devo lembrar que cada tipo de serviço disposto, seja ele na web ou em uma intranet consome recursos de formas diferentes. Como uma aplicação que roda em uma loja de calçados  por exemplo, a disponibilidade do banco de dados, impressora, cabeamento, sistema operacional, hardware e outros recursos que fogem do escopo desta postagem são fatores que influenciam um serviço.
E claro, não podemos esquecer do mais problemático de todos, o fator “humano“.
Portanto após cuidarmos de todos estes detalhes, podemos partir para o principal, o Apache.
Primeiramente você deve analisar o tráfego de requisições que chegam ao servidor Apache, para se ter uma estatística de consumo de memória que cada requisição do Apache esta consumindo e o tempo que cada requisição está prendendo a instância criada no sistema.
Complicado não é?
Mas digamos que após executar o comando “top” no linux:
1
servidor: ~# top
Você reparou que a média de consumo de mémória de uma instancia do apache é de 6MB, se existir 500 processos em execução, basta multiplicar o valor da memória pela quantidade de processos para achar o resultado de 3GB de Memória, isto mesmo, 3GB de memória serão necessários para dar conta de todos os processos. Lembrando ainda que você deve reservar memória para o sistema operacional e as outras aplicações, incluindo o próprio servidor Apache que consome em torno de 100MB, fazendo com que todos fiquem em total harmonia.
Uma diretiva que se pode utilizar, porem em certas circunstancias pode trazer mais problemas do que solução, em caso de não haver possibilidade de aumentar recursos de hardware no servidor web, podemos alterar a propriedadeMaxClients do arquivo de configuração do apache.
MaxClients 500
Esta propriedade vai limitar o máximo número de processos do apache em execução no sistema operacional, fazendo assim com que a capacidade de memória existente não estoure. Porem fazer isso com o servidor tendo mais requisições do que o limite estipulado, fará com que os usuário excedentes fiquem esperando pela liberação de um processo, para poder carregar as páginas web tão esperadas.
Claro que se os recursos forem escassos, não dá para fazer milagre.
Uma forma de avaliar melhor a configuração efetuada, é utilizar o comando “ab”:
1
ab -n 500 -c 100 http://www.meu-site.com.br
O comando “ab” auxilia no teste e verificação de requisições ao sistema web Apache, fazendo com que se tenha um ideia de como se comportará o servidor web com as requisições as página de sites existentes. O comando “ab” ouApache Bench não simula a real manipulação de requisições efetuadas por um usuário real, mas requisita o servidor muitas vezes.
Outra dica é ativar o KeepAlive no arquivo de configurações do Apache, fazendo com que várias requisições sejam efetuadas atravês de uma mesma conexão, não tendo assim, fazer com que não seje preciso encerrar um socket e abri-lo novamente.
Arquivos de configuração do Apache (apache2.conf)
1
2
3
4
5
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
Outra propriedade é o MaxKeepAliveRequests que que indica quantas requisições serão tratadas pelo KeepAlive.
1
2
3
4
5
6
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
A próxima propriedade deve ser atribuido um valor de acordo com o tipo de sistema que roda sobre o servidor web Apache, Mas não atribua um valor muito alto, pois fara com que a próxima requisição fique muito tempo na file aguardando para ser tratada.
1
2
3
4
5
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15
As configurações abaixo indicarão ao Apache como se comportar com a inicialização, execução com requisições e cargar de processos.
1
2
3
4
5
6
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
1
2
3
4
5
StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients          150
MaxRequestsPerChild   0
 
A propriedade StartServers indica o número de processos que ficará ativo na inicialização do servidor web Apache ficando carregado em memória, esperando por uma requisição.
MinSpareServers são instâncias reservadas pelo Apache para o caso de sofrer carga elevada de requisições, não tendo assim que criar novas instâncias para tratar as requisições que chegaram ao servidor, não fazendo com que essas requisições fiquem na fila de espera. As Opções MinSpareServers e MaxSpareServers determinam o mínimo e o máximo de reservas que deve ficar disponível para responder as requisições solicitadas
MaxClients A directiva MaxClients define número máximo de solicitações simultâneas que serão tratados pelo servidor web apache. Quaisquer tentativas de conexão acima do limite definido será colocado na fila até um processo filho seja liberado e então atender a tal requisição.
MaxRequestsPerChild Limita o número de pedidos que cada processo irá lidar durante a sua vida.

htaccess – a espada de dois gumes

Tome cuidado com o htaccess, pois tal recurso é incrivel do ponto de vista funcional, podendo efetuar diversas interações nas requisições que chegam ao servidor web, porem, este recurso é desencorajado tendo como motivo o sobrecarregamento do servidor com alterações de desvio do fluxo natural. Procure evitar utilizar este recurso e, se for necessário a sua utilização tenha cautela.

Módulos

Os módulos do apache o torna um servidor versátil e robusto, porem, tenha certeza que os módulos carregados são realmente necessários, pois do contrário estará carregando recurso extra e o apache rodaŕa mais pesado, consumindo mais memória do que o esperado.

Modular ou Compilado

Já ouvi muito sobre, “… instale o apache 1.3 … , ” … instale o apache 2.0, pois é melhor que o apache 2.2 …”, “… compila ele …”. Na verdade a respeito do versionamento, devemos e isto é incentivado na própria página do apache, a utilizar sempre d ultima versão do software a fim de obter todas as modificações ocorridas até o momento, como correções de vulnerabilidades e bugs. Claro que se você não pode efetuar a atualização do teu servidor web Apache para a ultima versão, terá que utilizar a versão que corresponde a sua necessidade, porem se você fará uma instalação nova do sistema, recomendo instalar a ultima versão disponível.
Já entre ser compilado, a grande diferença está em o apache já ter agregado a ele os módulos de necessidade do utilizador, como mod_rewrite, mod_ssl, mod_jk e entre outros, consumindo assim menos memória pois não é necessário carregar tal recurso. Mas o modular torna o serviço de manipulação e configuração do servidor, algo menos árduo facilitando a vida do administrador de sistemas tendo é claro como lado ruim o de consumir um pouco mais de memória para carregar os recursos extras.
Então optar entre o modular e o compilado é uma questão de necessidade e praticidade na utilização de recursos de hardware e gerenciamento do sistema, o que apenar o utilizador obterá tal resposta.
Obvio que toda a informação citada acima não servirá de nada se, você não coletar dados úteis sobre o teu servidor web, sobre as requisições e consumo que o teu site gera. Tendo isto em mente, devo ainda lembrar que o apache fornece uma infinidade de opções o que tornaria impossível agregar tal informação em apenas uma postagem.
Mas vai a dica, a documentação do apache é muito rica o que torna gratificante buscar informações sobre as configurações e recursos que o apache disponibiliza, abrindo assim o leque de conhecimento sobre este incrível servidor.
Para mais informações, comentem e enviem perguntas, pois se estiver ao meu alcance, terei o prazer em disponibilizar tal conhecimento.
Até a próxima.


Nenhum comentário:

Postar um comentário