Qual é a melhor prática para implantar o novo código em um site ao vivo (comércio eletrônico)?
Por agora eu parei apache para +/- 10 segundos quando renomeando diretório public_html_new
para public_html
e velho public_html_old
. Isso cria um curto período de inatividade, antes de iniciar o Apache novamente.
A mesma pergunta se aplica ao Git para puxar o novo repositório para o diretório ativo. Posso retirar o repositório enquanto o site está ativo? E se eu precisar copiar um banco de dados também?
Durante a compactação tar (finalidade de backup) do site ativo, notei que ocorreram alterações no diretório de mídia. Isso me indicou que os arquivos continuam mudando periodicamente. E se essas alterações puderem interferir se o Apache não for parado durante a implantação.
O mais rápido e fácil é usar um diretório de versão como
e use um link simbólico atual como seu html_root:
Essa técnica se integra perfeitamente a um sistema de controle de revisão (svn, git, mercurial, ...), pois você pode fazer checkout de ramos e tags, alterar o link simbólico e recarregar o Apache. O tempo de inatividade é mínimo usando essa técnica e permite reversão muito fácil .
Ele também se integra bem a sistemas de implantação mais complexos, como pacotes RPM ou infraestrutura de gerenciamento de alterações de configuração (chef, fantoche, etc.).
fonte
ln -snf
desobedecer o link simbólico original, a operação subjacente é umunlink
esymlink
. Há uma chance de os usuários receberem um 404 durante a atualização. Isso não é melhor do que apenas renomear o diretório original e renomear um novo diretório (assumindo que você não esteja cruzando sistemas de arquivos). Veja a resposta acima com uma marca de seleção ao lado, que aborda essa preocupação.Renomear os diretórios sem desligar o Apache também deve funcionar. Isso reduzirá significativamente a janela.
mv public_html public_html_old && mv public_html_new public_html
deve terminar em uma fração de segundo.Algumas desvantagens são que essa abordagem fornecerá
404
a qualquer solicitação que ainda consiga ocorrer durante a janela. E se você executar o comando acima sem ter umpublic_html_new
diretório, ele falhará e o deixará com um site fornecendo404
todas as solicitações.Fazê-lo atomicamente com diretórios não é suportado. Mas você pode fazer isso com links simbólicos. Em vez de ter um diretório nomeado
public_html
, tenha um diretório nomeadopublic_html.version-number
e um link simbólico chamadopublic_html
apontando para esse diretório. Agora você pode criar um diretório chamadopublic_html.new-version-number
e um novo link simbólico chamadopublic_html.new
.Em seguida, você pode renomear
public_html.new
parapublic_html
para alternar atomicamente. Observe quemv
é "inteligente demais" para executar essa renomeação, mas isso pode ser feito usandoos.rename
python ou qualquer outra coisa que chamará arename
chamada de sistema sem tentar ser inteligente.O que fazer com a base de dados depende de qual banco de dados você está usando e para o que está usando. Você precisa fornecer muito mais detalhes sobre o banco de dados antes de podermos dar uma boa resposta para essa parte da sua pergunta.
fonte
mv
tem uma-T
opção que impede de seguir o link simbólico. Isso permitirá que você atomicamente renomearpublic_html.new
maispublic_html
, assumindo que ambos são links simbólicos.Symlinks e mv são seus amigos, no entanto, se você realmente precisar evitar que os usuários finais obtenham uma página de erro ao implantar uma nova versão, deverá ter um proxy reverso ou um balanceador de carga na frente de pelo menos 2 servidores de back-end (apache no seu caso).
Durante a implantação, basta interromper um back-end de cada vez, implantar o novo código, reiniciá-lo e iterar nos demais back-end.
Os usuários finais serão sempre direcionados a bons back-ends pelo proxy.
fonte
Se você estiver aplicando alterações regularmente em um sistema de produção, eu cuidaria de um ciclo de vida estruturado. Uma boa prática é Capistrano http://capistranorb.com/ . Esta é uma solução de código aberto para implantar software em um ou mais servidores em várias plataformas e configurações.
Para o Magento, existe até um plugin: https://github.com/augustash/capistrano-ash/wiki/Magento-Example
Para servidor único e transições quase contínuas, recomendo usar links simbólicos.
fonte
A maneira como faço isso é confirmar minhas alterações do meu ambiente de desenvolvimento local para um repositório on-line do Git, como o Github. Meu ambiente de produção é executado em um repositório remoto, então tudo o que preciso fazer é ssh no servidor e executar
git pull
para reduzir as alterações mais recentes. Não há necessidade de parar seu servidor da web.Se você possui arquivos em seu projeto cujas configurações e / ou conteúdo diferem da sua versão local (como arquivos de configuração e upload de mídia), é possível usar variáveis de ambiente e / ou adicionar esses arquivos / diretórios a um
.gitignore
arquivo para impedir a sincronização com o repositório.fonte
Minha primeira ideia é:
Uma boa solução foi usar o rsync. Ele mudou apenas os arquivos realmente alterados. Cuidado, as barras no final dos caminhos são importantes aqui.
Normalmente, o apache não precisa ser reiniciado, não é o mundo java. Ele verifica a alteração de todos os arquivos php a pedido e relê (e re-tokeniza) automaticamente.
O Git pull foi semelhante eficiente, embora tenha sido um pouco mais difícil de script. É claro que permitiu um amplo espectro de diferentes possibilidades de detecção de fusão / alteração.
Essa solução funcionará perfeitamente apenas se não houver mudanças realmente importantes - se houver grandes alterações na implantação, um pouco de risco não poderá ser encerrado, porque há um intervalo de tempo não desprezível, quando o código será parcialmente alterado e particularmente não.
Se houver grandes mudanças, minha sugestão foi sua solução inicial (duas renomear).
Aqui está uma solução um pouco incondicional, mas 100% atômica:
(1) monte uma parte alternativa do seu sistema de arquivos, onde o seu magento ocorre:
(2)
--bind
monte seu public_html_new em public_html:A partir deste ponto, o apache verá sua nova implantação. Qualquer alteração de um 404 é impossível.
(3) faça a sincronização com o rsync, mas no ponto de montagem alternativo):
(4) remova o suporte de ligação
fonte
public_html
está em um estado inconsistente e não deseja aproveitar essa oportunidade.Mover / substituir a
http_public
pasta pode ser conseguido com simplesmv
ouln -s
comandos ou equivalente enquanto o servidor http continua em execução. Você pode executar alguns scripts para reduzir significativamente o tempo de inatividade, mas verifique cuidadosamente os códigos de retorno dos seus comandos no script se automatizar o processo.Dito isto, se você não deseja obter tempo de inatividade, seu aplicativo também deve suportá-lo. A maioria dos aplicativos usa um banco de dados para persistência. Fazer com que a versão N do seu aplicativo mexa com a versão N + 1 (ou o inverso) do seu modelo de dados pode quebrar as coisas, se não for previsto pela equipe de desenvolvimento.
Por experiência, manter essa consistência por meio de atualizações não é um dado para a maioria dos aplicativos. Um desligamento adequado, apesar do tempo de inatividade, é uma boa maneira de evitar problemas de consistência.
fonte