Como atomicamente substituir arquivos no Apache?

3

Quando eu substituo o arquivo servido (ou modifico o symlink) e faço o download desse arquivo simultaneamente, o Apache raramente (em pequena fração de porcentagem) responde com cabeçalhos do arquivo antigo, mas com conteúdo do novo arquivo.

Eu testei em algumas versões do Apache 2.2 (2.2.3, 2.2.22 - Debian estável), local e remotamente, em máquinas virtuais e físicas, em diferentes distribuições (Red Hat, CentOS, Debian) - eu sempre poderia reproduzi-lo usando script Python baixando repetidamente o arquivo em threads (20-200 threads) e substituindo-o no servidor de tempos em tempos (como a cada 100ms).

Onde está o problema? É culpa do Apache ou talvez eu esteja fazendo algo errado?

Atualização: também testei o Nginx, ele não tem esse problema. Mas em casos raros (100 vezes mais raros do que no Apache), ele não vê o arquivo e serve conteúdo padrão (página 404 ou padrão).

    
por Tupteq 18.02.2014 / 17:10

3 respostas

2

O Apache não se destina a veicular conteúdo dinâmico de um sistema de arquivos diretamente. Eu esperaria problemas como este simplesmente devido ao armazenamento não intencional dentro do programa. Se você precisar veicular conteúdo dinâmico, use scripts, CGI ou similares.

    
por 19.02.2014 / 16:02
2

Em vez de violar o sistema de arquivos, sugiro alterar a configuração do servidor, por exemplo mudar

DocumentRoot /var/www/version_1

para

DocumentRoot /var/www/version_2

e depois emitir um apachectl -k gracefull . Usar inclui apenas um pequeno trecho que você deve sobrescrever. Obviamente, ainda existe um período, em que alguns processos do apache podem servir arquivos antigos com cabeçalhos antigos e outros novos com novos cabeçalhos, mas o problema de cabeçalhos / conteúdo mistos não deve acontecer.

    
por 30.10.2015 / 11:03
1

Em sistemas compatíveis com POSIX, renomear é atômico. Portanto, deve ser seguro e consistente gravar em filename.new e, em seguida, "mv filename.new filename". Todas as alças abertas no nome "antigo" receberão o conteúdo no inode antigo e as novas solicitações receberão o novo.

    
por 20.02.2014 / 09:34