1 votes

nginx hackery : changer le fichier image à chaque X requête

Laissez-moi d'abord décrire ce que j'essaie de faire.

J'ai un tas d'images dans un répertoire appelé /images/*.(jpg|gif|png|blah blah|)

Supposons maintenant que ces images soient intégrées dans une page html et que je ne me soucie pas vraiment de l'image ou de l'endroit où elle est intégrée.

Pour chaque 10ème demande pour le même fichier image (si possible) ou pour toute image que je veux afficher une image fixe (par exemple trollface.jpg). c'est tout !

J'ai cherché un peu mais je ne suis même pas sûr de ce que je cherche. Rewrite pourrait aider mais alors c'est une chose permanente. Cela doit avoir quelque chose à voir avec les requêtes. J'ai entendu dire que perl scripts peut être utilisé avec nginx. Je ne peux pas écrire un module nginx (bien que j'aie courageusement regardé les docs et ensuite abandonné).

Avant que vous ne demandiez "Mais pourquoi ne pas le faire dans l'application, noob ?". Il s'agit d'un serveur de fichiers statiques uniquement. Le but est de ne pas exécuter de binaire du tout.

2voto

Khaled Points 35208

Je peux penser à une solution à votre question sans avoir besoin de pirater nginx.

En bref, elle peut être traitée au niveau du système de fichiers.

Pour plus de détails, vous pouvez configurer un incron script à exécuter sur la IN_ACCESS événement. Cela signifie que votre script sera exécuté chaque fois qu'un fichier spécifique est accédé (lu). Dans ce script, vous pouvez faire ce que vous voulez, comme compter les accès en lecture et écraser le fichier avec un autre (n'oubliez pas de garder une sauvegarde).

Veuillez noter que la mise en cache du serveur peut affecter cette méthode. Le fichier/image peut ne pas être lu lorsqu'il est mis en cache par le serveur ou un serveur proxy intermédiaire.

Je suppose qu'il s'agit d'une plateforme Linux. Vous devrez peut-être installer le incron pacakge.

0 votes

Semble être une solution plausible. Avez-vous un exemple de cet événement IN_ACCESS ? Je vais regarder incron maintenant. edit : ok j'ai vérifié incron. bien que in_access se produise à chaque fois, je me demande comment faire l'accès nTH pour chaque fichier.

0 votes

Regardez les exemples de cette page : linux.die.net/man/5/incrontab

0 votes

Oui, mais je ne vois pas comment nous pouvons stocker des informations sur l'état. Par exemple, le fichier xyz.txt a été consulté 12 fois - remplaçons-le. En fin de compte, j'ai besoin de maintenir un processus en cours d'exécution ou (FICHIER) pour conserver ces valeurs. Je pense avoir trouvé une solution plus simple en utilisant nginx.

1voto

Abhishek Dujari Points 567

Au hasard je tombe sur ceci.

http://agentzh.org/misc/slides/nginx-conf-scripting/nginx-conf-scripting.html#1

Cela semble beaucoup plus facile que d'écrire un module NGINX complet. En fait, nous utilisons les modules NGINX déjà créés, mais il semble que je doive utiliser memcache pour sauvegarder les compteurs. Mais au moins, cela semble possible.

Il y a des exemples mis à jour pour memcache et subrequests. Cela ralentira encore un peu nginx à cause des appels "if" mais pas trop. Je préférerais la méthode de Khaled si je savais comment m'y prendre.

1voto

Brad Points 3206

Une autre solution pourrait être de faire en sorte que nginx soit un proxy pour lui-même. Mettez en place deux vhosts en amont, un qui sert vos images normales et un qui sert uniquement trollface.jpg.

Incluez le serveur virtuel normal comme serveur amont avec un poids de 9 et le serveur virtuel trollface comme autre serveur amont avec un poids de 1.

Ainsi, l'image alternative sera servie une fois toutes les 10 demandes, mais pas une fois toutes les 10 demandes pour chaque fichier individuel.

Alternativement, le HttpEchoModule pourrait faire l'affaire pour vous. Une combinaison de echo_subrequest_async et echo_random pourrait vous donner une chance sur dix de livrer trollface.jpg au lieu du fichier demandé.

Il y a aussi ceci publier sur la liste de diffusion ce qui suggère que quelqu'un travaille sur les compteurs par adresse IP dans la configuration de nginx.

Notez que je ne suis pas recommander aucune de ces solutions, je note juste qu'elles sont possibles.

0 votes

Génial ! fantastique idée d'utiliser vhost en amont. sortir des sentiers battus :) Dans ma propre réponse ci-dessous, j'ai posté un lien vers HTTPEchoModule. Je n'avais pas vu echo_Random et cela m'aide beaucoup. per-IP serait une bonne chose. Je suis en train de regarder par referrer, mais c'est un bon point de départ. Merci de votre compréhension.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X