Archives pour l'étiquette Curl

Varnish : Comment détecter l’appareil derrière le user-agent ?

Face à la multitude de user-agent savoir quel est le type d’appareil qui se cache derrière peux sembler compliqué.

Etat des lieux

Tout d’abord  dresse toi même un état des lieux sur ton varnish avec l’aide de la commande varnishtop.

varnishtop -i RxHeader -C -I ^User-Agent

Il en ressort le top des user-agent actuellement en accès sur ton varnish classé dans l’ordre d’importance de leur population

list length 73
 
 6.67 RxHeader User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
 6.41 RxHeader User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
 6.35 RxHeader User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Firefox/31.0
 6.25 RxHeader User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:25.0) Gecko/20100101 Firefox/25.0
 4.84 RxHeader User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
 4.49 RxHeader User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53
 4.43 RxHeader User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)
 4.43 RxHeader User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
 4.35 RxHeader User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
 3.92 RxHeader User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10
 3.78 RxHeader User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.1.2; GT-N8010 Build/JZO54K) 
 3.37 RxHeader       User-Agent: Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53

J’ai un peu épuré la liste pour ne garder que ce qui est explicite dans notre cas. On peux constater que nous avons une foule de user-agent mais que tous reste explicite comme

Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X)

ou encore

User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.1.2; GT-N8010 Build/JZO54K)

et encore

Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53

On peux en conclure que avec des recherches d’expressions régulières basé sur des chaines de caractère comme iPhoneiPad ou Android  (chaine présent dans les exemples ci dessus) on peux obtenir une idée du type d’appareil et de leur nombre.

Devidedetect la solution varnish

Donc du code d’instruction varnish vcl utilisant des expressions régulière la chose est possible. Et c’est exactement que fournit detectdevice.vcl de  Lasse Karstensen qui travail pour varnish software

Vous l’incluez dans votre code de configuration vcl avant le bloc vcl_recv

# Include sub module for mobil device detection
# Set req.http.X-UA-Device;
# must be call un recv section
include "devicedetect.vcl";

Pour mieux l’utiliser dans le  bloc vcl_recv

 # CALL sub module for mobil device detection
 # Set req.http.X-UA-Device;
 call devicedetect;

Au final detectdevice.vcl  va ajouter un champ nommé X-UA-Device au header http de la requête avec l’information sur le type d’appareil derrière le user-agent

En voici la liste pour exemple :

X-UA-Device = "pc";
X-UA-Device = "bot";
X-UA-Device = "tablet-ipad";
X-UA-Device = "mobile-iphone";
X-UA-Device = "mobile-android";
X-UA-Device = "tablet-android";
X-UA-Device = "mobile-smartphone";
X-UA-Device = "tablet-android";
X-UA-Device = "tablet-rim";
X-UA-Device = "tablet-hp";
X-UA-Device = "tablet-kindle";
X-UA-Device = "mobile-firefoxos";
X-UA-Device = "mobile-smartphone"
X-UA-Device = "mobile-generic"

Ce champ est donc inclus dans la demande et est disponible tout du long de la chaîne de traitement de la requête http. Elle est également transmise au backend. L’application web peux donc analyser les champs du header http et décider du comportement à adopter en fonction.

Exploiter X-UA-Device :

C’est très bien que l’application reçoive l’information mais comment faire pour que moi je puisse la voir dans la réponse ? Pour le savoir plaçons le code suivant dans le bloc vcl_deliver.

  # Set resp.http.X-UA-Device from req.http.X-UA-Device
 # For debug mobil detection device 
 set resp.http.X-UA-Device = req.http.X-UA-Device;

Dans le hearder de la demande nous avons précédemment ajouté le champ X-UA-Device avec la variable req.http.X-UA-Device (req comme request) . Maintenant nous avons indiqué que resp.http.X-UA-Device (resp comme response) est égale à req.http.X-UA-Device. Nous allons donc trouver un champs X-UA-Device dans le header http des réponses au navigateur.

Consulter l’information

Avec curl c’est toujours simple

curl -I http://www.grazia.fr -A "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"
HTTP/1.1 200 OK
Server: Apache
X-Powered-By: eZ Publish
Expires: Fri, 29 Aug 2014 07:48:46 GMT
Last-Modified: Fri, 29 Aug 2014 07:38:46 GMT
Cache-Control: public, max-age=600
Pragma:
Served-by: www.grazia.fr
Content-language: fr-FR
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
X-Cacheable: YES
X-Served-By: gz_web3
Date: Fri, 29 Aug 2014 07:39:49 GMT
X-Varnish: 1573767385 1573766523
Age: 63
Connection: keep-alive
X-UA-Device: pc
X-Cache: HIT
Via: gz-proxy1

Ma commande curl forge un user-agent Chrome sur Windows

 curl -I http://www.grazia.fr -A "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"

En conséquence le champ X-UA-Device indique un Pc desktop

X-UA-Device: pc

Avec les outils de Chromium

X-UA-Device.Grazia

Varnishtop

Maintenant vous pouvez également utiliser varnishtop pour suivre les user-agent et leur détection.

varnishtop -i TxHeader -I ^X-UA-Device
list length 6
 
 105.19 TxHeader X-UA-Device: pc
 38.52 TxHeader X-UA-Device: mobile-grazia
 18.19 TxHeader X-UA-Device: bot
 6.63 TxHeader X-UA-Device: mobile-android
 2.30 TxHeader X-UA-Device: mobile-iphone
 0.74 TxHeader X-UA-Device: mobile-smartphone

 

Varnish : savoir ce qu’il met en cache

Pour savoir ce que varnish place dans en cache ?

Le plus simple est de lui demander de mettre l’information à disposition. L’ajout d’un entête http spécifique est la solution. Ainsi chaque appel http comportera l’information : en cache ou non ?

Cachable ?

Demandons à vanish de nous indiquer si l’objet peux être placé en cache pour ceci dans le block vcl_fetch de votre fichier de configuration varnish placé le code suivant. Attention,  prenez le temps de lire les commentaires du code pour comprendre ce qui possible de mettre en cache ou non.

# DEBUG NOTICE FOR VARNISHLOG
# Varnish determined the object was not cacheable
if (beresp.ttl <= 0s) {
set beresp.http.X-Cacheable = "NO:Not Cacheable";

# You don't wish to cache content for logged in users
} elsif (req.http.Cookie ~ "(UserID|_session)") {
set beresp.http.X-Cacheable = "NO:Got Session";
return(hit_for_pass);

# You are respecting the Cache-Control=private header from the backend
} elsif (beresp.http.Cache-Control ~ "private") {
set beresp.http.X-Cacheable = "NO:Cache-Control=private";
return(hit_for_pass);

# Varnish determined the object was cacheable
} else {
set beresp.http.X-Cacheable = "YES";
}
# END DEBUG NOTICE FOR VARNISHLOG

Cachable et dans le cache ?

Vanish indique maintenant si l’objet peux être placé dans son cache mais l’a t’il fait ? Ou du moins l’a t’il trouvé dans son cache sans à avoir à le demander au backend.  Pour le savoir plaçons le code suivant dans le bloc vcl_deliver.

 # Set Header for HIT or MISS
 if (obj.hits > 0) {
 set resp.http.X-Cache = "HIT";
 } else {
 set resp.http.X-Cache = "MISS";
 }

 

Consulter l’information

Un fois votre configuration activée un champ http  » X-Cacheable  » apparaîtra dans chaque header http de chaque échange pour indiquer si l’objet est potentiellement acceptable dans le cache. Et un autre champs « X-Cache » indique si il l’a trouvé dans son cache « HIT » ou si il à du le demander au serveur backend « MISS »

Avec curl c’est très simple à voir

# curl -I http://www.telestar.fr
HTTP/1.1 200 OK
Server: Apache
X-Powered-By: eZ Publish
Expires: Tue, 26 Aug 2014 09:54:02 GMT
Last-Modified: Tue, 26 Aug 2014 09:44:02 GMT
Cache-Control: public, max-age=600
Pragma:
Served-by: www.telestar.fr
Content-language: fr-FR
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
X-Cacheable: YES
X-Served-By: tls_web1
Date: Tue, 26 Aug 2014 09:53:01 GMT
X-Varnish: 1712524658 1712516447
Age: 535
Connection: keep-alive
X-UA-Device: pc
X-Cache: HIT
Via: tls-proxy2

la réponse est la X-Cacheable: YES   la page index de www.telestar.fr peux être mise en cache,  X-Cache: HIT d »ailleurs est elle en cache. Vous pouvez la retrouver avec curl , ou les outils de dev de chromium, ou encore firebug.

Avec la commande varnishtop vous pouvez suivre le ratio de page « cachable »

varnishtop -i TxHeader -I "^X-Cacheable:"
list length 2
15.00 TxHeader X-Cacheable: YES
 5.00 TxHeader X-Cacheable: NO:Not Cacheable

ou effectivement mise en cache

varnishtop -i TxHeader -I "^X-Cache:"
list length 2
60.63 TxHeader X-Cache: HIT
 51.07 TxHeader X-Cache: MISS

Avec les « developer  tools » de Chromium c’est aussi très simple

Via les dev tools de Chrome inspecter les headers http
Via les dev tools de Chrome inspecter les headers http

Installation et configuration d’un serveur Pootle de management de traduction online

Pootle est un outil de management de traduction en ligne souvent utilisé pour internationalisé une application.

Le paquet Pootle

L’installation facile avec apt.

apt-get update apt-get <span style="color: #c20cb9; font-weight: bold;">install</span> pootle

Modifier /etc/default avec

 POOTLE_ENABLE=Yes

Modifier dans le fichier /etc/pootle/pootle.prefs les lignes 63 a 64 sur le modèle suivant :

<span style="color: #000000;">63</span>     fromaddress = <span style="color: #ff0000;">&quot;pootle@domaine.com&quot;</span>  <span style="color: #000000;">64</span>     smtpserver = <span style="color: #ff0000;">&quot;localhost&quot;</span>  <span style="color: #000000;">65</span>     supportaddress = <span style="color: #ff0000;">&quot;pootle@domaine.com&quot;</span>

Relancer pootle via la commande :

 /etc/init.d/pootle restart

Vérifier la disponibilité en local via la commande :

 curl -I http://localhost:8080

Installer un service de mail (envois de code d’inscription) si nécessaire via la commande :

 apt-get install postfix

Install Apache2 en proxy de Pootle

Ajouter module proxy via la commande :

 a2enmod proxy proxy_http

Pour éviter les accès interdit (error 403) configurer /etc/apache2/mods-available/proxy.conf avec la directive :

 Allow from all.

Ajouter un vhost apache2 pour pootle

&lt;VirtualHost *:<span style="color: #ff0000;">80</span>&gt;  <span style="color: #00007f;">ServerName</span> pootle.cafe.com  <span style="color: #00007f;">ProxyPass</span> /images !  <span style="color: #00007f;">ProxyPass</span> /js !  <span style="color: #00007f;">ProxyPass</span> /pootle.css !  <span style="color: #00007f;">ProxyPass</span> /favicon.ico !  <span style="color: #00007f;">ProxyPass</span> / http://localhost:<span style="color: #ff0000;">8080</span>/  <span style="color: #00007f;">ProxyPassReverse</span> / http://localhost:<span style="color: #ff0000;">8080</span>/ &nbsp;  &lt;Directory proxy:http://localhost:<span style="color: #ff0000;">8080</span>/*&gt;      <span style="color: #00007f;">Order</span> <span style="color: #00007f;">deny</span>,<span style="color: #00007f;">allow</span>      <span style="color: #00007f;">Allow</span> <span style="color: #00007f;">from</span> <span style="color: #00007f;">all</span>  &lt;/Directory&gt; &nbsp;  <span style="color: #adadad; font-style: italic;"># Possible values include: debug, info, notice, warn, error, crit,</span>  <span style="color: #adadad; font-style: italic;"># alert, emerg.</span>  <span style="color: #00007f;">LogLevel</span> warn  <span style="color: #00007f;">ErrorLog</span> /var/log/apache2/pootle-error_log  <span style="color: #00007f;">CustomLog</span> /var/log/apache2/pootle-access_log common &nbsp;  <span style="color: #adadad; font-style: italic;"># Fallback for static html content</span>  <span style="color: #00007f;">DocumentRoot</span> <span style="color: #7f007f;">&quot;/usr/share/pootle/html&quot;</span> &nbsp;  &lt;Directory <span style="color: #7f007f;">&quot;/usr/share/pootle/html&quot;</span>&gt;    <span style="color: #00007f;">Order</span> <span style="color: #00007f;">deny</span>,<span style="color: #00007f;">allow</span>    <span style="color: #00007f;">Allow</span> <span style="color: #00007f;">from</span> <span style="color: #00007f;">all</span>  &lt;/Directory&gt; &nbsp; &lt;/VirtualHost&gt;

Relancer apache via la commande :

 /etc/init.d/apache2 restart

Tester que le vhost et le ServerName configurer répond via la commande :

 curl -H "Host: pootle.cafe.com" http://localhost/

Ouvrir le compte admin dans Pootle

Lire /usr/share/doc/pootle/README.Debian sur le serveur Pootle

Si le ServerName dans le Vhost Pootle ne correspond pas à une entré DNS modifier votre fichier /etc/hosts en conséquence

Ouvir un compte avec le login admin en vous connectant sur le serveur pootle : http://servername

Valider l’ouverture de compte avec le Registration code reçu pas email

Modifier le fichier /etc/pootle/users.prefs afin d’ajouter les droits d’administration au compte créé. Pour cela ajouter la ligne rights.siteadmin = True comme dans l’exemple suivant en tenant compte de l’indentation. admin:

activated = <span style="color: #000000;">1</span>   activationcode = <span style="color: #ff0000;">'e0e0eaa3840daf3833c16774aec95aa7'</span>   email = u<span style="color: #ff0000;">'karles@domaine.com'</span>   name = u<span style="color: #ff0000;">'Administrator'</span>   passwdhash = <span style="color: #ff0000;">'20b47a2e5debe0df2954b9307a7be7691'</span>   uilanguage = u<span style="color: #ff0000;">'fr'</span>   rights.siteadmin = True

Relancer pootle via la commande :

 /etc/init.d/pootle restart

Monitoring de sites web et surveillance de la performance et de la qualité de service

La qualité de la diffusion

Au delà du simple monitoring de site, surveiller la qualité et la performance d’une solution de web hosting et son architecture d’hébergement fait partie des fondamentaux du ebusiness.

En effet la qualité du service passe également par la qualité de la diffusion car :

  • Un visiteur parcoure plus de pages si le site est véloce
  • Le taux de rebond est inversement proportionnel à la rapidité du site
  • L’internaute quitte vite un site qui ne répond pas rapidement et est un frein dans son acte d’achat
  • Les moteurs de recherche index plus facilement le contenue d’un site rapide
  • Les moteurs de recherche et google en particulier accord plus de crédit au site rapide et les positionne mieux.

Google vient d’ajouter au webmaster tools un graphique des performances des sites abonnés. On peux raisonnablement conclure que le grand google tiens compte de la performance de la diffusion pour indéxer et positionner les sites. Si vous possédez un compte Google Webmaster tools vous pouvez déjà ausculté la courbe de performance de votre site et savoir en combien de seconde il répond.

Google Webmaster tools performance

Performance en yoyo de Karlesnine.com au grès des tests

Multiplier les contrôles

Vous pouvez vous contenter de l’analyse de performance offert par Google. Mais pour diverses raisons il peut être utile d’avoir sa propre source d’analyse :

  • Pour contrôler le contrôleur, en effet on ne connais si la methode ni la technique de google avec une référence externe est important.
  • Pour avoir une mesure depuis un point précis de l’internet, par exemple le réseau interne de l’entreprise ou celui d’un prestataire ou fournisseur.
  • Pour surveiller la concurrence et l’évalué par rapport à vos propres service

D’autre raisons qui sont autant de cas particuliers sont possible. Bien des services professionnels comme ip-label ou xiti offre de tel service de mesure mais pour plusieurs millier d’euro par an.

Solution système D

Mon besoin est de monitorer la qualité de délivrance de contenue de différent site, jour après jour et sur de longue période. J’ai donc chercher dans les solutions de monitoring classique. Je me suis naturellement orienté vers cacti je que connais depuis longtemps et qui a toujours répond à mes besoins.

Après quelque recherche j’ai trouver un agent de monitoring en php utilisant curl pour cacti. L’utilisation de curl permet un acces distant tel un client et permet des mesures de site sans aucun droit sur le serveur, parfait pour la concurrence. Dans la cas présent l’agent enregistre plusieurs paramètres intéréssants :

  • dns: Le temps de résolution du nom de domaine
  • con: Le temps pour établir la connexion
  • pre: Le temps entre la connexion et l’arrivé du premier octet
  • str: Le temps entre la premier octet et la fin du transfert
  • ttl: Le temps total des étapes précédentes
  • sze: Le volume transféré
  • spd: La vitesse moyenne du transfère.

Attention aux limites

L’agent monitore une ressource correspondant à une url. Ce n’est pas un spider il ne va pas parcourir les liens. Si vous lui donner l’url de la home page (HP) d’un site il appliquera sa mesure à la seul page HTML.

Si vous souhaitez surveillez l’intégralité des éléments d’une page, chaque hit quelque soit le type mime et connaitre le temps d’interprétation et de rendu le site performance web pose les bases d’une automatisation de Yslow qui a attirer mon attention. Je vous invite à consulté cet article.

Installation & configuration

L’installation et la configuration de l’agent est expliqué en trois étapes :

  1. Using Cacti To Monitor Web Page Loading Part 1
  2. Using Cacti To Monitor Web Page Loading Part 2
  3. Using Cacti To Monitor Web Page Loading Part 3

Attention bug

l'agent monitor très bien un site mais si vous configuré le monitoring de plusieurs site il y à un bug qui fait que seul le premier a tout les paramètres de correctement surveiller. Ceci est facilement visible en surveillant les <strong>log de cacti</strong> après avoir<strong> augmenter leur verbosité</strong> et évidement apr!s voir installer l'agent en question. <a href="http://www.askaboutphp.com/tutorials/46/cacti-using-cacti-to-monitor-web-page-loading-part-3.html#comment-14319" hreflang="en">Un solution de contournement est disponible dans les commentaires du site</a>

Dans le fichier pageload-agent.php remplacer les lignes suivantes :

print “dns:”.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'namelookup_time'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; print ” con:”.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'connect_time'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; print ” pre:”.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'pretransfer_time'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; print ” str:”.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'starttransfer_time'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; print ” ttl:”.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'total_time'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; print ” sze:”.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'size_download'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; print ” spd:”.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'speed_download'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>

par celle-ci sans négliger les espaces entre les doubles cotes :

<span style="color: #007800;">$outstring</span> = <span style="color: #ff0000;">&quot;ttl:&quot;</span>.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'total_time'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>.<span style="color: #ff0000;">&quot; str:&quot;</span>.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'starttransfer_time'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>.<span style="color: #ff0000;">&quot; dns:&quot;</span>.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'namelookup_time'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>. <span style="color: #ff0000;">&quot; con:&quot;</span>.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'connect_time'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>.<span style="color: #ff0000;">&quot; pre:&quot;</span>.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'pretransfer_time'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>.<span style="color: #ff0000;">&quot; sze:&quot;</span>.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'size_download'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>. <span style="color: #ff0000;">&quot; spd:&quot;</span>.<span style="color: #007800;">$output</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'speed_download'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; &nbsp; print chop<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$outstring</span>,”\n\r”<span style="color: #7a0874; font-weight: bold;">&#41;</span>;

Et les templates ?

Cacti utilise un système de template pour simplifier le travail à chaque ajout d’un monitor. Dans la cas de l’agent présenté ici nul template n’est livré. Il est très facile d’en créé un de vous même si vous souhaitez apprendre à le faire dans la cas contraire voici mes templates pour les graphiques. Attention pas de question sur leur utilisation et aucune garantie quant à leur utilisation.

Résultat

Au final vous avez la possibilité de comparer les qualités de diffusions de différent site web entre eux.

Web Page load graph

Comparatif du temps de chargement de la HP de Voici.fr vs RTL.fr

web page size graph

Comparatif de la taille de laa HP de Voici.fr vs RTL.fr

Comment purger un élément de vos reverse proxy cache SQUID

L’utilisation d’un étage de cache web dans l’architecture d’une plate-forme d’hébergement est de plus en plus courante. Dans le cas de eZ Publish c’est même nécessaire si vous l’utilisé comme CMS générateur de site web [1].

Mais j’ai eu l’occasion de souligner l’intérêt d’un cache web à la lumière de mon actualité professionnel que cela soit quand Voici.fr dépasse les 650 K pages vue en 24h, quand Voici.fr et Gala.Fr ont survécu au pic d’audience du à la mort de Michael Jackson ou enfin quand l’optimisation d’un site eZ Publish 4 pour l’utilisation des caches web en prenant voici.fr en exemple.

Autorisé la purge dans squid.conf

Avant tout, il est nécessaire de modifier Squid via le fichier de configuration squid.conf afin d’autoriser la purge. Pour j’ai ajoutez les ligne suivantes dans ma configuration afin d’autorisé la purge depuis le squid et surtout depuis le réseau local afin que cela soit possible de toute les machines de l’architecture.

acl purge method PURGE http_access allow PURGE localnet http_access allow PURGE localhost

Purger squid avec cURL

Exemple pour purger une page du cache de trois serveurs SQUID avec cURL

~$ curl -I -X PURGE -H <span style="color: #ff0000;">&quot;Host: &lt;HOST&gt;&quot;</span> http:<span style="color: #000000; font-weight: bold;">//</span>squid<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000;">1</span>,<span style="color: #000000;">2</span>,<span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#125;</span><span style="color: #000000; font-weight: bold;">/&lt;</span>URI<span style="color: #000000; font-weight: bold;">&gt;</span>

Dans cet exemple nous allons supprimé la home page de http://www.femmeactuelle.fr/ (soit l’index) actuellement mise en cache sur nos trois serveurs reverse proxy squid :

~$ curl -I -X PURGE -H <span style="color: #ff0000;">&quot;Host: www.femmeactuelle.fr&quot;</span> http:<span style="color: #000000; font-weight: bold;">//</span>squid<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000;">1</span>,<span style="color: #000000;">2</span>,<span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#125;</span><span style="color: #000000; font-weight: bold;">/</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">26</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">26</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">26</span> GMT Content-Length: <span style="color: #000000;">0</span>

Dans cet exemple nous avons voulu supprimer la page « cachée » de http://365.femmeactuelle.fr/ (soit l’index) Toutefois aucune page n’était présente dans le cache

~$ curl -I -X PURGE -H <span style="color: #ff0000;">&quot;Host: www2.femmeactuelle.fr&quot;</span> http:<span style="color: #000000; font-weight: bold;">//</span>squid<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000;">1</span>,<span style="color: #000000;">2</span>,<span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#125;</span><span style="color: #000000; font-weight: bold;">/</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">404</span> Not Found Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">45</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">404</span> Not Found Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">45</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">404</span> Not Found Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">35</span>:<span style="color: #000000;">45</span> GMT Content-Length: <span style="color: #000000;">0</span>

Purger squid avec squidclient

La même chose est possible avec squidclient

<span style="color: #808080; font-style: italic;"># squidclient -m PURGE -p 80 -h prpsquid1 http://www.femmeactuelle.fr/</span>

L’utilisation de « {1,2,3} » n’est pas possible, il faut utiliser une boucle bash :

~$ <span style="color: #000000; font-weight: bold;">for</span> I <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000;">1</span> <span style="color: #000000;">2</span> <span style="color: #000000;">3</span>; <span style="color: #000000; font-weight: bold;">do</span> squidclient -m PURGE -p <span style="color: #000000;">80</span> -h squid<span style="color: #007800;">$I</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.femmeactuelle.fr<span style="color: #000000; font-weight: bold;">/</span>; <span style="color: #000000; font-weight: bold;">done</span> HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">56</span>:<span style="color: #000000;">11</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">56</span>:<span style="color: #000000;">11</span> GMT Content-Length: <span style="color: #000000;">0</span> &nbsp; HTTP<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.0</span> <span style="color: #000000;">200</span> OK Server: squid<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.6</span>.STABLE5 Date: Fri, <span style="color: #000000;">30</span> Jan <span style="color: #000000;">2009</span> <span style="color: #000000;">10</span>:<span style="color: #000000;">56</span>:<span style="color: #000000;">11</span> GMT Content-Length: <span style="color: #000000;">0</span>

Notes

[1] eZ n’est forcement utilisé comme générateur de site web. Il est avant tout un CMS; quelque soit la destination du contenu