Obs: Nesse artigo baseio minhas configurações e comandos executados na distribuição
Linux CentOS, podendo ser adaptado para execução em qualquer outra (Debian, Slackware etc).
Nesse cenário existe um Storage proprietário, nada impede que seja usado um servidor com discos SATA rápidos e NICs Gigabit. Segue abaixo a configuração básica do Storage NFS caseiro:
/etc/exports:
/storage/sites 192.168.10.0/24(rw,root_squash)
Reinicie o serviço de NFS, em um CentOS:
# /etc/init.d/nfs restart
ou
# exportfs -ra
Em cada servidor web será montado o diretório exportado do Storage NFS.
Em seu
/etc/fstab:
192.168.10.2:/storage/sites /var/www/sites nfs rw,sync 0 0
Agora partimos para a configuração de opções do httpd.conf que necessitam ser alteradas:
ServerName localhost
Listen 0.0.0.0:80
NameVirtualHost *:80
NameVirtualHost *:443
#Se existir mais de um site teremos que usar VirtualHost da seguinte maneira para cada um.
<VirtualHost *:80>
# Configurações
</VirtualHost>
#Caso existe um site com SSL
<VirtualHost *:443>
#Configurações
</VirtualHost>
As opções acima estão configuradas para funcionar em qualquer servidor web, caso exista mais alguma opção em particular deve-se primeiramente consultar a documentação do Apache para implementar esse ambiente (
http://httpd.apache.org/).
Agora devemos eleger um servidor web como master para estarmos executando o script de reload do httpd explicado mais tarde. No nosso cenário será o Web1, com o ponto de montagem NFS montado em /var/www/sites devemos criar um diretório para armazenar os diretórios de configuração do Apache que serão acessíveis pelos outros servidores web. Lembrando que o DocumentRoot de cada site está apontando para o ponto de montagem do Storage (/var/www/sites).
# mkdir /var/www/sites/shared_config
# chmod 750 /var/www/sites/shared_config
Copiaremos os seguintes diretórios de configuração do Apache para o diretório recém criado:
# cd /etc/httpd/
# cp -r conf /var/www/sites/shared_config/
# cp -r conf.d /var/www/sites/shared_config/
Pare o serviço de httpd do servidor web (
service httpd stop). Agora deve-se renomear os diretórios (conf e conf.d) e criar os links simbólicos apontando para os mesmos no diretório shared_config:
# cd /etc/httpd/
# mv conf conf_old
# mv conf.d conf.d_old
# ln -sf /var/www/sites/shared_config/conf conf
# ln -sf /var/www/sites/shared_config/conf.d conf.d
Inicie o serviço de httpd (
service httpd start) e verifique se ocorreu algum erro na inicialização em /var/log/httpd/error_log. Caso esteja tudo bem, repita o procedimento no restante dos servidores web.
Neste momento temos um Webfarm com 5 servidores web lendo os mesmo arquivos de configuração, mas se alterarmos uma linha por exemplo no arquivo
/etc/httpd/conf/httpd.conf, teremos que reiniciar o serviço httpd manualmente em cada servidor web. Meio dramático caso você possua um grande número de servidores.
A ideia é sempre usar um servidor (master) para alterar os arquivos de configuração e apenas executar um script que se encarregará de ativar a mudança em cada servidor web (reload, restart).
Teremos que compartilhar uma chave de criptografia DSA entre os servidores web slaves. Então vamos gerar a chave no servidor web master:
# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):<enter>
Enter passphrase (empty for no passphrase):<enter>
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
Acima foi gerado a chave pública e privada, teremos que distribuir o conteúdo do arquivo /root/.ssh/id_dsa.pub (chave pública) para os servidores web slave.
Em cada servidor web slave deve-se criar o arquivo
/root/.ssh/authorized_keys e adicionar chave pública.
Não devemos permitir o login de root diretamente via SSH, somente se for via chave de criptografia. Será necessário alterar o arquivo
/etc/ssh/sshd_config e deixar o parâmetro PermitRootLogin da seguinte maneira:
PermitRootLogin without-password
Após a alteração, reinicie o serviço de ssh (
service sshd restart). Nesse momento podemos testar o acesso via ssh do servidor web master para os servidores web slaves para verificar que não será solicitada a senha como normalmente.
Partiremos agora para o script que executará o reload do serviço httpd em todos os servidores do Webfarm.
# cat /home/scripts/reload-httpd.sh
#!/bin/bash
echo "Servidor local Web1..."
/sbin/service httpd reload
echo "Servidor remoto Web2..."
ssh 192.168.10.4 "/sbin/service httpd reload"
echo "Servidor remoto Web3..."
ssh 192.168.10.5 "/sbin/service httpd reload"
echo "Servidor remoto Web4..."
ssh 192.168.10.6 "/sbin/service httpd reload"
echo "Servidor remoto Web5..."
ssh 192.168.10.7 "/sbin/service httpd reload"
Configure a permissão de execução para o script e execute para verificar a funcionalidade do mesmo.
# /home/scripts/reload-httpd.sh
Servidor local Web1...
Reloading httpd: [ OK ]
Servidor remoto Web2...
Reloading httpd: [ OK ]
Servidor remoto Web3...
Reloading httpd: [ OK ]
Servidor remoto Web4...
Reloading httpd: [ OK ]
Servidor remoto Web5...
Reloading httpd: [ OK ]
O script é simples, você pode fazer o que quiser (criar parâmetros para start,stop etc).
Se você não tiver uma hardware de balanceamento poderá fazer via firewall mesmo (ipfw, pf ou iptables). No nosso caso faremos usando iptables.
# iptables -t nat -A PREROUTING -d IPSITE -p tcp --dport 80 -j DNAT --to 192.168.10.3-192.168.10.7
Lembrando que essa regra acima só faz o balanceamento da porta 80, as demais regras do firewall devem ser criadas para cada cenário.
Finalizando, concluímos que é possível centralizar a configuração do Apache em um Webfarm e de apenas um servidor ativar as alterações realizadas.
Abraços a todos.
Tiagonux
Referência:
http://www.tiagohpires.eti.br