jeremm

Jérémy MURIEL ( jeremy [at] jeremm [dot] fr )

Fév 232012
 

Pour modifier la page d’erreur par défaut de varnish, ajouter ceci dans le vcl_error :

synthetic {"<votre code HTML>"};
return (deliver);

Pour inclure des images voir http://blog.jeremm.fr/?p=151

Si besoin vous pouvez appelez les variables varnish : req.xid, obj.status, obj.response dans votre page mais il faut ressortir du code hml:

html..."} + obj.status + {"html...

Vous pouvez faire plusieurs page d’erreur en fonction du code de retour :

if (obj.status == 500) {
        synthetic {" ... "};return (deliver);
    } else {
        synthetic {" ... "};return (deliver);
    }

Si le code est trop long, vous pouvez le mettre dans un fichier à part :

sub vcl_error {
        include "/etc/varnish/vcl_error.vcl";
}

avec les commandes synthetic et return(deliver) dans le fichier vcl_error.vcl

Fév 232012
 

Pour ajouter des images à votre page d’erreur varnish, soit vous faites appel à une image qui se trouve sur un autre serveur, soit vous l’encodez directement en base 64 dans la page. Varnish ne permet de renvoyer qu’un objet en erreur.
Pour cela il faut encoder votre image en base64 avec ce script:

<?php
$data = file_get_contents($argv[1]);
$data = base64_encode($data);
file_put_contents($argv[2], $data);
?>
php base64.php image_source.jpg image_cible.b64

Ensuite il suffit de l’intégrer à la placue du « ‹img src=http:// » habituel :

<img src="data:image/jpeg;base64,<le code de votre image_cible.b64>">
Fév 192012
 

Ajoutez une nouvelle routine à la configuration varnish :

sub identify_device {
        set req.http.X-Device = "pc";
        if ( req.http.user-agent ~ "(Android.*|.*Blackberry.*|.*BlackBerry.*|.*Blazer.*|.*Ericsson.*|.*htc.*|.*Huawei.*|.*iPhone.*|.*iPod.*|.*MobilePhone.*|.*Motorola.*|.*nokia.*|.*Novarra.*|.*O2.*|.*Palm.*|.*Samsung.*|.*Sanyo.*|.*Smartphone.*|.*SonyEricsson.*|.*Symbian.*|.*Toshiba.*|.*Treo.*|.*vodafone.*|.*Xda.*|^Alcatel.*|^Amoi.*|^ASUS.*|^Audiovox.*|^AU-MIC.*|^BenQ.*|^Bird.*|^CDM.*|^DoCoMo.*|^dopod.*|^Fly.*|^Haier.*|^HP.*iPAQ.*|^i-mobile.*|^KDDI.*|^KONKA.*|^KWC.*|^Lenovo.*|^LG.*|^NEWGEN.*|^Panasonic.*|^PANTECH.*|^PG.*|^Philips.*|^portalmmm.*|^PPC.*|^PT.*|^Qtek.*|^Sagem.*|^SCH.*|^SEC.*|^Sendo.*|^SGH.*|^Sharp.*|^SIE.*|^SoftBank.*|^SPH.*|^UTS.*|^Vertu.*|.*Opera.Mobi.*|.*Windows.CE.*|^ZTE.*)" ) {
        set req.http.X-Device = "mobile";
        }
}

Dans le vcl_recv :

call identify_device;

Dans le vcl_hash :

hash_data(req.http.X-Device);
Fév 192012
 

Pour voir si l’objet vient du cache ou pas, ajoutez dans le vcl_deliver :

if (obj.hits > 0){
      set resp.http.X-Varnish-Cache = "HIT";
}else{
      set resp.http.X-Varnish-Cache = "MISS";
}

Pour voir si la requête est passée par la routine pass :

sub vcl_pass {
        set req.http.X-marker = "pass" ;
}
sub vcl_fetch {
        if (req.http.X-marker == "pass" ) {
                unset req.http.X-marker;
                set beresp.http.X-marker = "pass" ;
        }
}
sub vcl_deliver {
        if (resp.http.X-marker == "pass" ) {
                remove resp.http.X-marker;
                set resp.http.X-Varnish-Cache = "PASS";
        }
}

Pour voir le TTL dans les en-têtes des objets, ajoutez dans le vcl_fetch :

set beresp.http.X-Varnish-TTL = beresp.ttl;

Pour voir le nom du serveur où se trouve varnish, ajoutez dans le vcl_fetch :

set beresp.http.X-Served-By = server.hostname;

Pour voir le backend dans les en-têtes des objets, ajoutez dans le vcl_fetch :

set beresp.http.Served-By = beresp.backend.name ;

Pour voir le host et l’url dans les en-têtes des objets, ajoutez dans le vcl_fetch :

set beresp.http.X-host = req.http.host;
set beresp.http.X-url = req.url;
Fév 192012
 

Kill tous les sleeps de plus de 10s :

for requete in $(mysql INFORMATION_SCHEMA -B -e'select id from PROCESSLIST where Command like "Sleep" and TIME >= "10"'| grep -v id); do /usr/bin/mysqladmin kill $requete ; done

Kill tous les selects de plus de 10s :

for requete in $(mysql INFORMATION_SCHEMA -B -e'select id from PROCESSLIST where INFO like "select%" and TIME >= "10"'| grep -v id); do /usr/bin/mysqladmin kill $requete ; done

Voir les requêtes en cours :

mysqladmin pro

ou

 mysql -e"show processlist"

Voir les requêtes en cours en entier :

 mysql -e"show full processlist"