Como faço para migrar suavemente o DNS de um servidor da web de um endereço IP para outro?

7

Atualmente, tenho um nome de domínio registrado para um servidor Linux / Apache que substituirei por outro em um novo endereço IP.

A migração dos dados será relativamente rápida e uma interrupção de 5 minutos durante esse processo é aceitável.

O registro DNS tem um TTL de 6 a 12 horas aparentemente, o que não posso acelerar.

Quais são as possíveis conseqüências dessa mudança? Presumivelmente, os usuários que ainda estão observando o endereço antigo continuarão a acessar o servidor antigo, enquanto os usuários cujo cache de DNS expirou ou está vazio verão o novo domínio.

É possível fazer algum tipo de redirecionamento do servidor antigo (com Apache ou iptables) para o novo IP? O servidor antigo pode continuar a ser executado pelo tempo necessário.

    
por Tom 17.09.2009 / 04:10

5 respostas

5

Você pode usar um proxy reverso no antigo servidor web. Pode ser um pouco trabalhoso configurar, mas enquanto o ITS DNS estiver atualizado, você estará OK.

O que acontecerá é:

  1. O servidor da web antigo está configurado para ser o proxy reverso
  2. alternância de DNS
  3. Novo servidor da web exibe ocorrências de registros DNS atualizados
  4. Web antiga quando recebe um hit, encaminha a solicitação para o DNS correto e, em seguida, exibe o conteúdo na íntegra.

Se você estiver executando o Apache, procure em mod_proxy. Se você estiver executando o IIS, procure no ISAPI Rewrite para obter esse tipo de funcionalidade.

(note que o DNS no servidor da web antigo precisa estar atualizado se você quiser usar o proxy como nome de domínio. Caso contrário, faça proxy diretamente para o endereço IP e verifique se o host está escutando no IP sem um nome de host)

    
por 17.09.2009 / 04:17
11

Minha empresa acabou de fazer isso com vários sites maiores. O procedimento básico que seguimos foi:

  1. Reduza o TTL do domínio o máximo possível. Faça isso com antecedência pelo menos o tempo que o TTL atual.
  2. Configure o site no novo servidor exatamente como você deseja que o "produto final" seja
  3. Adicione um nome com alias ao site no novo servidor, como www2.domain.com ou www-new.domain.com. Com o Apache, você usaria a diretiva ServerAlias . Se o site tiver algum código dinâmico (PHP, mod_perl, RubyOnRails, etc.), certifique-se de que o site se comporte e responda corretamente com esse novo nome.
  4. No momento da transição, configure um redirecionamento no servidor antigo apontando para o novo servidor
  5. Altere o DNS de www para ir para o novo IP.

Para o Apache, você provavelmente deve usar o mod_rewrite para o redirecionamento, para que você possa preservar os URIs solicitados pelo cliente. Uma implementação simples seria:

# old server
<VirtualHost 1.1.1.1:80>
    ServerName www.domain.com
    RewriteEngine on
    RewriteRule ^(.*)$ http://www-new.domain.com$1 [L]
</VirtualHost>

# new server
<VirtualHost 1.1.1.2:80>
    ServerName www.domain.com
    ServerAlias www-new.domain.com
</VirtualHost>

Isso fará um redirecionamento temporário de 302 para www.domain.com/anything para www-new.domain.com/anything. Você quer que ele seja temporário porque você provavelmente quer que os mecanismos de pesquisa indexem apenas www.domain.com, e não www-new.domain.com.

Uma vez que a mudança de DNS para www.domain.com tenha se propagado para sua satisfação, você pode baixar o www-new por completo ou suavemente facilitar a transferência de qualquer pessoa para www com outro redirecionamento. É quase o mesmo processo acima; configure o servidor antigo para manipular o www-new, altere o DNS para www-new para apontar para o servidor antigo e configure um redirecionamento no servidor antigo enviando o tráfego www-new para www:

# old server
<VirtualHost 1.1.1.1:80>
   ServerName www-new.domain.com
   RewriteEngine on
   RewriteRule ^(.*)$ http://www.domain.com$1 [R=301,L]
</VirtualHost>

# new server
<VirtualHost 1.1.1.2:80>
    ServerName www.domain.com
    # ServerAlias removed, no longer needed
</VirtualHost>

Desta vez, você quer fazer um redirecionamento 301 permanente, mais uma vez para indicar aos indexadores de mecanismo de pesquisa que www.domain.com é o site que você deseja indexar.

    
por 17.09.2009 / 06:26
4

É um tópico antigo, mas talvez ajude alguém:

Além das respostas de Mark Henderson (mod_proxy) OU James Sneeringer (redirecionamento de 302.301 para novos subdomínios), mais uma coisa poderia ser adicionada em relação à sincronização de banco de dados ao mover grandes aplicativos.

Se o seu projeto web usa um banco de dados (ex. MySQL), antes de trocar o DNS, certifique-se de que os aplicativos (ex. PHP) dos dois servidores estejam se conectando ao mesmo banco de dados. Assim, as leituras e gravações estão indo para o mesmo lugar e você não precisa lidar com diferentes ferramentas de sincronização de banco de dados posteriormente.

Isso afetaria (muito provavelmente) o tempo de carregamento em um servidor, mas, para o período de troca, isso pode ser aceito.

Caso o servidor de banco de dados não seja acessível de fora, você também pode configurar o mysql_proxy na web servidor que tem acesso a ele e é acessível a partir de IPs externos.

    
por 03.12.2012 / 13:53
3

Eu uso o iptables para isso quando preciso fazer isso; um pouco rápido de DNAT / SNAT e todo o seu tráfego magicamente reaparece onde deveria estar. Se você tiver uma necessidade real de manter os endereços IP de origem, um proxy reverso pode ajudar, definindo cabeçalhos apropriados, mas isso requer muito desvio em ambas as extremidades para garantir que tudo esteja em ordem, então normalmente não me preocupo com isso. para algo como uma migração, uma vez que é transitório, e reduzir TTLs lida com a maior parte.

    
por 17.09.2009 / 14:33
3

Ok, com base no que @Farseeker recomendou, eu configurei a seguinte configuração no antigo servidor Apache para encaminhar solicitações para o novo servidor:

<VirtualHost *>
  UseCanonicalName Off
  ServerAdmin  [email protected]
  ServerName domain.com
  DocumentRoot /var/www/

  ProxyRequests Off

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / http://domain.com/
  ProxyPassReverse / http://domain.com/
</VirtualHost>

Para garantir que o servidor antigo tivesse o endereço correto, coloquei uma entrada em /etc/hosts :

1.2.3.4 domain.com

Também tive que ativar os módulos Apache mod_proxy e mod_proxy_http e recarregar a configuração:

a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache force-reload
    
por 17.09.2009 / 15:26