Je souhaite, dans un avenir proche, pouvoir héberger notamment des photos et vidéos sur le serveur à mon domicile. Pour le moment, j’utilise les services proposés par Google (Picasa, YouTube) ou Vimeo. Mais pour diverses raisons je n’aime pas mettre mes fichiers, mêmes si c’est de manière cachée, privée et non répertoriée, dans une infrastructure non contrôlée. L’accès à l’internet étant encore et toujours asymétrique (le débit de téléchargement est toujours beaucoup plus grand que celui de téléversement), l’accès à ce contenu sur mon serveur à domicile avec une connexion de ce type pourrait être relativement lent.
Un ami m’a transmis l’idée de configurer un serveur virtuel que je loue chez Hetzner comme proxy inverse et comme cache, de sorte que ce dernier stocke les fichiers dans son cache local en ne les téléchargeant donc qu’une fois (ou lorsqu’ils ont changé).
J’ai configuré ainsi deux serveurs Apache:
- Celui de la machine source (cdn.domain.ch)
- Celui de la machine frontale (video.domain.ch)
Sur la machine source, j’ai configuré simplement un VirtualHost ainsi:
<VirtualHost cdn.domain.ch:80> ServerAdmin #####@####### ServerName cdn.domani.ch DocumentRoot /var/www/cdn.domain.ch/ <Directory /var/www/cdn.domain.ch/> Order deny,allow Deny from all Allow from xx.yy.zz.uu </Directory> </VirtualHost>
On prendra soin de limiter l’accès à la source au serveur frontal uniquement.
Sur le serveur frontal, j’ai utilisé les modules suivants de Apache2 (2.2.16):
- mod_proxy
- mod_proxy_http
- mod_cache
- mod_disk_cache
(Les activer avec a2enmod, puis apache2ctl restart)
Configuration du serveur frontal (reverse proxy):
<VirtualHost video.domain.ch:80> ServerAdmin #####@############# ProxyPass / http://cdn.domain.ch/ ProxyPassReverse / http://cdn.domain.ch/ CacheEnable disk / CacheRoot /var/cache/apache2/mod_disk_cache CacheDirLevels 3 CacheDirLength 1 CacheMaxFileSize 300000000 # CacheIgnoreCacheControl On CustomLog /var/log/apache2/cached-requests.log common env=cache-hit CustomLog /var/log/apache2/uncached-requests.log common env=cache-miss CustomLog /var/log/apache2/revalidated-requests.log common env=cache-revalidate CustomLog /var/log/apache2/invalidated-requests.log common env=cache-invalidate CustomLog /var/log/apache2/video.domain.ch-access.log common </VirtualHost>
On peut forcer l’utilisation du cache en ajoutant:
CacheIgnoreCacheControl On
Redémarrer Apache2 avec apache2ctl graceful (ou apache2ctl restart).
Cela fonctionne très bien, mais il y a un problème avec l’utilisation du tag <video> de HTML5. En effet, les navigateurs utilisent l’option Range afin de ne prendre qu’une partie du contenu du fichier vidéo. Le serveur source retourne donc le fichier avec une réponse 206 (Partial Content) et non 200 (OK). Et mod_cache ne peut pas mettre en cache cela.
J’ai utilisé l’astuce suivante pour contourner le problème: il suffit de forcer le téléchargement de la vidéo sans passer par un navigateur:
wget http://video.domain.ch/myvideo.ogg
De cette manière, le fichier est bel et bien mis dans le cache, et ensuite Apache peut y accéder, même avec Range et retourne donc du contenu partiel, sans faire appel au serveur source.
A faire pour la suite:
- Le système de mise en ligne de vidéos/photos sur le serveur source devra inclure une petite commande permettant de forcer la mise à jour du cache
- Se documenter sur les options de cache pour éviter que ce dernier ne délivre du contenu qui n’est pas à jour, etc.