nginx hackery: altera o arquivo de imagem a cada pedido X

1

Deixe-me descrever o que estou tentando fazer primeiro.

Eu tenho um monte de fotos em um diretório chamado /images/*.(jpg|gif|png|blah blah |)

Agora, digamos que essas imagens estão incorporadas em uma página html e não me importo com qual imagem ou onde ela está incorporada.

Para cada pedido de 10 para o mesmo arquivo de imagem (se possível) ou para qualquer imagem que eu quero exibir uma imagem fixa (por exemplo, trollface.jpg). é isso!

Eu pesquisei um pouco, mas não tenho certeza do que estou procurando. Reescrever pode ajudar, mas então é uma coisa permanente. isso tem que fazer alguma coisa com pedidos. Eu ouvi que scripts perl podem ser usados com o nginx. Eu não posso escrever um módulo nginx (embora eu tenha procurado bravamente os documentos e depois desistido)

Antes de perguntar "Mas por que você não faz isso no aplicativo, noob?". Este é um servidor apenas de arquivos estáticos. O ponto é não executar nenhum binário.

    
por Abhishek Dujari 19.11.2011 / 11:11

3 respostas

1

Outra solução poderia ser ter o proxy nginx para si mesmo. Configure dois vhosts upstream, um que sirva para suas imagens normais e um que sirva apenas para trollface.jpg.

Inclua o vhost normal como seu servidor upstream com um peso de 9 e o vhost trollface como o outro servidor upstream com um peso de 1.

Isso servirá a imagem alternativa uma vez a cada 10 solicitações, mas não uma vez a cada 10 solicitações para cada arquivo individual.

Alternativamente, o HttpEchoModule pode ser capaz de fazer o truque para você. Uma combinação de echo_subrequest_async e echo_random pode dar a você uma chance em 10 de entregar trollface.jpg em vez do arquivo que eles pediram.

Existe também esta publicação na lista de discussão , que sugere que alguém está trabalhando em IP -address contadores na configuração do nginx.

Note que não estou recomendando nenhuma dessas soluções, apenas observando que elas são possíveis.

    
por 19.11.2011 / 17:09
2

Posso pensar em uma solução para sua pergunta sem a necessidade de hackear o nginx.

Logo, ele pode ser tratado no nível do sistema de arquivos.

Em mais detalhes, você pode configurar um script incron a ser executado no evento IN_ACCESS . Isso significa que seu script será executado sempre que um arquivo específico for acessado (lido). Nesse script, você pode fazer o que quiser, como contar os acessos de leitura e substituir o arquivo por outro (não se esqueça de fazer um backup).

Por favor, note que o cache do servidor pode afetar este método. O arquivo / imagem pode não ser lido quando armazenado em cache pelo servidor ou por um servidor proxy intermediário.

Estou assumindo a plataforma Linux. Talvez seja necessário instalar o incron pacakge.

    
por 19.11.2011 / 12:58
1

Aleatoriamente .. eu caio sobre isso.

link

Isso parece muito mais fácil do que escrever um módulo NGINX inteiro. Basicamente, usamos os módulos nginx já feitos, exceto que parece que eu tenho que usar memcache para salvar contadores. Mas pelo menos parece possível.

Existem exemplos atualizados de memcache e subrequests. Ele ainda irá desacelerar o nginx um pouco devido a chamadas "if", mas não muito. Eu preferiria o método de Khaled se soubesse como proceder.

    
por 19.11.2011 / 14:53