X-UA-Device sur Grazia.fr

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

 

Via les dev tools de Chrome inspecter les headers http

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

Sur Varnish en français binbash.fr tu dois lire

Logo Varnish Cache

Concernant varnish les sources d’informations et d’exemples ne manque pas. Pourtant un français un site est pour moi sorti du lot c’est Binbash.fr

Voici la liste des articles présent sur BinBash qui vous aiderons à prendre pied avec varnish. Ils sont à lire avant de déranger les ops.

BinBash Logo

Varnish : aperçu Avant de commencer une série d’articles sur Varnish, il me semble important de faire un petit détour sur son fonctionnement. Je me suis basé ici sur Wikipedia et la documentation de Varnish.

Varnish 3 : installation : 1ère étape dans la série des articles sur Varnish : l’installation. Je vais traiter ici de l’installation de Varnish 3 sur une Debian Squeeze 64 bits fraîchement installée. Pourquoi 64 bits ? Parce que Varnish est conçu pour fonctionner sur des architectures 64 bits. Le 32 bits limitera la quantité de mémoire qu’il pourra utiliser, le nombre de threads qu’il pourra ouvrir…

Surveiller l’activité de Varnish 3 avec varnishstat : Varnishstat est un outil qui permet de voir les statistiques du cache Varnish en temps réel. C’est un outil très pratique pour s’assurer que Varnish fonctionne correctement.

Les logs Varnish 3 avec varnishlog : Varnishlog permet de lire les logs Varnish de la mémoire partagée et de les afficher formatés pour en faciliter la lecture. C’est un outil très pratique pour voir le détail de la transaction et la façon dont elle a été traitée par Varnish

Recharger la configuration de Varnish à chaud : Voici un petit article pour vous présenter la procédure permettant de recharger ou charger une nouvelle configuration de Varnish à chaud.

Purger le cache de Varnish 3 : Il y a deux solutions pour purger le cache Varnish : la purge “classique” et les “bans”. Je vais reprendre l’article de varnish-cache.org en rajoutant des exemples pour les différentes méthodes de purge.

Varnish 3 : booster le nombre de hit : Dans cet article, nous allons voir différentes solutions pour augmenter le nombre de hits sur votre cache Varnish. Le but recherché est qu’un maximum de requêtes soient servies depuis le cache plutôt que du backend généralement moins performant.

Varnish 3 et le streaming : un cas d’usage : Varnish 3 propose une solution pour streamer du contenu : il permet de délivrer à un client un flux (audio, vidéo…) tout en le cachant pour les prochains utilisateurs. Malheureusement dans sa version actuelle, il ne permet de streamer du contenu qu’à un seul client .

Logique Prod / Preprod

#Craquage

On ne peux que comprendre. C’est quand même pas compliqué d’avoir une prod et une preprod avec des outils comme chef ou puppet qui donne la possibilité de déterminer avec précision la version des logiciels / paquets installer pour chacun des composants midleware (apache / mysql / redis / etc)

Actuellement j’ai une prod sur des machines virtuelles VMware, une préprod sur des container openvz sur Proxmox et du dev sur des machine virtuelles Virtualbox . Soit un ensemble de plus de 70 serverus, et tous utilisent strictement les mêmes version à la décimale près

Calculer l’utilisation mémoire des processus Apache

Snippet pour calculer la consommation moyen de mémoire des processus apache

ps aux | grep apache | grep -v pts | awk '{ tot += $6; procs += 1; print $2,$6,$11 } END { print "TOTAL: ",tot,"/",procs,"=",tot/procs }'

Vous obtenez en sortie la moyenne sous cette forme

4231 50212 /usr/sbin/apache2
4265 53588 /usr/sbin/apache2
4275 52236 /usr/sbin/apache2
4307 50760 /usr/sbin/apache2
4340 54164 /usr/sbin/apache2
4370 48952 /usr/sbin/apache2
4372 42916 /usr/sbin/apache2
4420 19940 /usr/sbin/apache2
4421 44568 /usr/sbin/apache2
4446 8180 /usr/sbin/apache2
4448 7620 /usr/sbin/apache2
4449 7600 /usr/sbin/apache2
4450 7604 /usr/sbin/apache2
4451 7604 /usr/sbin/apache2
4452 7604 /usr/sbin/apache2
4871 18584 /usr/sbin/apache2
TOTAL: 482132 / 16 = 30133.2

Run linux since 1994 and this web site since 2002