Catégories
Nagios Open-source Planet-libre Web

Notification Twitter (oAuth) dans Nagios

Twitter est un service devenu indispensable pour la veille technologique des geeks que nous sommes. Son « ouverture via des API permet également de l’utiliser comme un moyen simple de diffusion d’informations de type alerte.

Nous allons dans ce billet voir comment configurer Nagios (l’outil de supervision open-source) pour envoyer des alertes sur un compte Twitter dédié. La méthode détaillé est compatible avec la nouvelle méthode d’authentification de Twitter nommée oAuth.

Avant de commencer

Pour ne pas poluer votre time-line pricipale, je vous conseille de créer un compte Twitter dédié à ce besoin. C’est sur ce dernier que les alertes seront envoyées. Il suffira ensuite aux « administateurs » de suivre ce compte Twitter pour être informé au plus vite des anomalies survenues sur le réseau.

Pour créer notre compte Twitter special Nagios, on va à l’adresse suivante:

Il faut bien retenir votre « username » (nagiosnicolargo dans mon cas) et « password ».

Il faut ensuite se rendre dans les « Settings » et cliquer sur le bouton « Protect my updates » pour forcer l’approbation des utilisateurs qui vont pouvoir suivre ce compte Twitter. Quand un des administrateurs fera une demande pour suivre ce compte Twitter, il faudra l’approuver. Cela évite que n’importe qui voit que votre réseau est tombé :)…

Installation du script de mise à jour de Twitter

Depuis que l’authentification sur Twitter, la procédure est un peu plus compliquée. J’ai donc écrit un billet spécifique sur le sujet. Il suffit de suivre cette procédure en prenant comme compte Twitter le compte préalablement créé dans le chapitre précédant pour y associer une nouvelle application (le script Python nommé tweetitcli.py) qui va permettre à Nagios de mettre à jour la timeline.

Après cette étape, vous devez donc être capable de mettre à jour la timeline de votre compte Twitter dédié avec une ligne de commande du type:

./tweetitcli.py ‘Petit test depuis la ligne de commande Linux’

Je vous laisse vérifier que cela marche…

Il faut ensuite copier le script en question dans le répertoire des plugins de Nagios:

cp ./tweetitcli.py /usr/local/nagios/libexec/

sudo chown nagios:nagios /usr/local/nagios/libexec/tweetitcli.py

Configuration du serveur Nagios

Passons maintenant aux fichiers de configuration de Nagios. Je pars sur le principe que vous avez un serveur Nagios en état de marche. On commence par ajouter la commande tweetitcli.py qui va permettre d’envoyer un message à notre compte Twitter via Curl:

# vi /usr/local/nagios/etc/objects/commands.cfg

define command{
command_name    notify-host-by-twitter
command_line    $USER1$/tweetitcli.py « $HOSTNAME$ is $HOSTSTATE$ »
}
define command{
command_name    notify-service-by-twitter
command_line    $USER1$/tweetitcli.py « $SERVICEDESC$@$HOSTNAME$ is $SERVICESTATE$ ** $SERVICEOUTPUT$ »
}


Ensuite on défini le contact (ou le groupe à vous de voir):

# vi /usr/local/nagios/etc/objects/templates.cfg

define contact{
name  nicolargoadmin 
alias Admin Nicolargo
service_notification_period     24×7                    
host_notification_period        24×7                    
service_notification_options    w,u,c,r,f,s             
host_notification_options       d,u,r,f,s            
service_notification_commands   notify-service-by-twitter
host_notification_commands      notify-host-by-twitter
}

Puis enfin on associe le contact avec le service à surveiller (par exemple que mon serveur Web tourne bien…):

define host{
use                     linux-host
host_name               gandiserveur
alias                   Serveur Gandi
address                 blog.nicolargo.com
parents                 monrouteur
hostgroups              prj-perso
contacts                nicolargoadmin
}
define service{
use                     generic-service
host_name               gandiserveur
service_description     HTTP
check_command           check_http
contacts                nicolargoadmin
}

On teste…

Il ne reste plus qu’a tester vos fichiers de configuration:

sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

et à relancer Nagios:

sudo service nagios restart

A chaque notification, un nouveau message devrait apparaître dans votre compte Twitter dédié 😉

Catégories
Nagios Open-source Planet-libre Web

Twitter en ligne de commande (même avec oAuth)

Il y a quelque temps, j’avais écrit un billet sur comment envoyer les alertes de votre serveur Nagios sur un compte Twitter (ou comment réunir les SI et le Web 2.0). Malheureusement, depuis cette date,  Twitter a changé la méthode d’authentification pour poster des tweets. Ce n’est plus une authentification HTTP classique (qui pouvait donc être facilement faite en ligne de commande avec curl par exemple) mais une authentification oAuth, beaucoup plus souple mais nettement plus complexe.

Nous allons donc dans ce nouveau billet voir comment mettre en place l’authentification oAuth pour un script Python qui permettra à partir d’une simple ligne de commande de mettre à jour une timeline Twitter.

A vos fourneaux !

Les ingrédients…

Pour suivre cette recette il faut:

  • un compte Twitter
  • la librairie Python python-tweepy
  • un navigateur Web (pour enregistrer votre application)

Installation de Python-tweepy

Cette librairie Python va vous permettre de parler oAuth avec le serveur Twitter. Il existe un PPA pour Ubuntu (pour les autres distribution GNU/Linux, il faut installer la bête en suivant ces instructions):

sudo add-apt-repository ppa:chris-lea/python-tweepy

sudo aptitude update && sudo aptitude install python-tweepy

Update: Sous Debian la procédure à suivre est la suivante (merci Benjamin):

apt-get install python python-setuptools python-json python-twitter

wget http://pypi.python.org/packages/source/t/tweepy/tweepy-1.7.1.tar.gz

tar xvfz tweepy-1.7.1.tar.gz

cd tweepy-1.7.1

python ./setup.py install

Enregistrement de votre script

C’est la première étape: déclarer votre application (votre script) sur le serveur Twitter. Dans la suite de ce billet je vais procéder à l’enregistrement d’une application qui s’appellera ‘tweetit’ (c’est le nom de mon script en ligne de commande qui permettra de mettre à jour ma Timeline).

Pour cela, il faut se rendre à l’URL suivante: http://twitter.com/oauth_clients

Puis cliquer sur Register a new application »

On saisie ensuite le formulaire:

Une fois le formulaire validée, vous devriez être redirigé vers une page contenant deux informations importantes: Consumer key (la clés) et Consumer secret (le mot de passe) de votre application.

Il faut bien sur mettre ces informations de coté.

Connecter votre script à votre compte Twitter

Nous allons utiliser la librairie python-tweepy pour faire cette étape qui ne devra être faite qu’une seule fois lors du développement de votre application.

Le plus simple est de reprendre le script écrit par Jeff Miller sur son blog. On va donc créer un script nommé tweetit-register.py contenant le code suivant (remplacer les codes):

#!/usr/bin/env python

import tweepy

CONSUMER_KEY = ‘VOTRE CODE CONSUMER KEY’

CONSUMER_SECRET = ‘VOTRE CODE CONSUMER SECRET’

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)

auth_url = auth.get_authorization_url()

print ‘Please authorize: ‘ + auth_url

verifier = raw_input(‘PIN: ‘).strip()

auth.get_access_token(verifier)

print « ACCESS_KEY = ‘%s' » % auth.access_token.key

print « ACCESS_SECRET = ‘%s' » % auth.access_token.secret

On exécute le script:

chmod a+x tweetit-register.py

./tweetit-register.py

Le script va vous afficher une URL  et attendre un code PIN:


Please authorize: http://twitter.com/oauth/authorize?oauth_token=Ndddb0DBsjd6PNYccSEtl8vtdYkNsPRCk5joO7djqO8

PIN:

On copie l’URL dans un navigateur Web:

On récupère ensuite le code PIN que l’on entre dans notre terminal:

PIN: 0665141

On obtient en retour la clés et le mot de passe d’accès :

ACCESS_KEY = ‘7707822-TWzha9rf3icVF1h0FhGnaK5q7iLyNIRzHXDY8aagt4’

ACCESS_SECRET = ‘3dbTcWkU1LIYG4MtwmraausjaoSne5coGbXKOXhDfG0’

Création du script

Voilà (enfin), on peut développer notre application (tweetit.py):

#!/usr/bin/env python


import sys

import tweepy


# Authentification oAuth

CONSUMER_KEY = ‘Consumer Key’

CONSUMER_SECRET = ‘Consumer Secret’

ACCESS_KEY = ‘Access Key’

ACCESS_SECRET = ‘Access Secret’

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)

auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)

api = tweepy.API(auth)


# Main program

api.update_status(sys.argv[1])

On rend le script executable:

chmod a+x tweetit.py

Test de l’application

On lance le script avec le texte à tweeter:

./tweetitcli.py ‘Petit test depuis la ligne de commande Linux…’

Et voilà le travail:

Et voila, bientôt un prochain billet pour voir comment intégrer ce nouveau script à Nagios 🙂

Source pour la rédaction de cet article:

Catégories
Gstreamer Open-source Planet-libre Video Web

MyScreenCast passe en version 0.11

Il y quelques mois, j’avais écrit un script shell (MyScreenCast) permettant d’automatiser, en ligne de commande, la création d’un screencast (une vidéo de votre écran) avec des outils libres disponibles sur les distributions GNU/Linux (notamment GStreamer).

Je viens de mettre en ligne la version 0.11 de ce script avec les fonctions suivantes:

  • possibilité d’incruster un texte en overlay avec l’option  -o <Bla bla>
  • encodage du même screencast avec différents codecs
  • amélioration des pipelines GStreamer

Ces fonctions viennent s’ajouter aux fonctions suivantes:

  • capture vidéo de l’écran quelque soit sa résolution
  • capture audio (depuis le microphone par défaut de votre système)
  • incrustation de la vidéo venant de votre Webcam (avec l’option -w)
  • affichage des touches actionnées avec keymon (avec l’option -k)

Pour tester ce logiciel, il faut récupérer la dernière version du script:

MyScreencast

Puis de lancer la ligne de commande suivante:

chmod a+x ./myscreencast.sh

./myscreencast.sh

Comme toujours j’attend vos retours / tests sur d’autres distributions (je l’ai testé sous Ubuntu 10.10).

Catégories
Gstreamer Open-source Planet-libre Reseau Web

Nagios: vérifier l’existence d’un fichier sur un site Web

Il y a quelques jours je me suis rendu compte que lors d’une mise à jour de mon blog j’avais oublié de copier le fichier googlexxxxxxxxx.html à la racine de mon site. Ce fichier permet à Google de vérifier que le site est bien associé à mon compte Google Webmaster et au mécanisme de lecture d’un autre fichier important: sitemap.xml. En conséquence, mon site n’était plus référencé dans Google… C’est ici Google Analytics qui m’a servi de serveur de supervision vu que mon trafic a été divisé par 8 :).

Disposant d’un serveur de supervision Nagios pour mes tests, je me suis pencher sur le problème suivant: comment vérifier la présence d’un fichier précis sur un site Web en utilisant le protocole HTTP.

Il n’y a pas de plugin par défaut permettant d’effectuer cette action. Le seul qui se rapproche est check_http. Malheureusement ce dernier permet seulement de vérifier que le serveur Web est opérationnel mais ne fait aucune interprétation sur le contenu du site.

En cherchant un peu on tombe rapidement sur le plugin check_url. Ce dernier, écrit en Perl, utilise Wget pour récupérer le fichier cible et interprète le code d’erreur renvoyé par le serveur Web.

J’ai du un peu modifier le code pour le rendre compatible avec une installation ou le daemon Nagios tourne avec un utilisateur qui n’a pas de « home directory ». Le script modifié est disponible ici.

On a les associations code d’erreur Nagios / code d’erreur HTTP suivantes:

OK = (« 200 »);

WARN = (« 400 », « 401 », « 403 », « 404 », « 408 »);

CRITICAL = (« 500 », « 501 », « 502 », « 503 », « 504 »);

Pour installer le plugin, il faut le copier dans le répertoire /usr/local/nagios/libexec de votre serveur Nagios puis fixer les bons droits:

cd /usr/local/nagios/libexec

sudo wget https://raw.github.com/nicolargo/nagiosautoinstall/master/check_url.pl

sudo chown nagios:nagios /usr/local/nagios/libexec/check_url.pl

sudo chmod a+x /usr/local/nagios/libexec/check_url.pl

Enfin on configure un nouveau service dans le fichier commands.cfg:

# CheckURL

# $ARG1$: URL a tester (exemple: http://blog.nicolargo.com/sitemap.xml)

define command{

command_name check_url

command_line $USER1$/check_url.pl $ARG1$

}

Puis on définie le service associé au site/fichier à vérifier:

# Define a service to check URL

# http://blog.nicolargo.com/sitemap.xml

define service{

use generic-service

host_name monserveur

service_description URL Sitemap

check_command check_url!http://blog.nicolargo.com/sitemap.xml

}

Une fois Nagios relancé, une alerte sera automatiquement remontée si le fichier sitemap.xml n’est pas accessible !

Il est bien sur possible de faire autant d’alertes que de fichiers à vérifier.

Catégories
Blog Open-source Planet-libre Web

Le blog de Nicolargo a son application IOS

Mon ami Nicolas Richasse vient de finaliser la première version de l’application du « Blog de Nicolargo » pour iPhone, iPod et iPad. Cette application est d’ores et déjà téléchargeable gratuitement sur l’Apple Store. (voir ici la page officielle de l’application pour plus d’informations).

Vous devez trouver plutôt causasse le fait que ce blog dispose d’une application pour iPhone (axe du mal propriétaire) plutôt que pour Android (les gentils libristes)…

La raison principale est assez simple. Nicolas Richasse m’a proposé de développer gratuitement cette application pour « se faire la main » sur le développement d’application sous IOS. Disposant d’un iPhone 4 à la maison, je n’ai donc pas hésité longtemps (si une âme généreuse veut faire la même chose sous Android je suis preneur :)).

Cependant notre « bon coté de la force » nous a poussé à réfléchir à un modèle plus en accord avec nos convictions. Après quelques discussions avec lui, nous avons donc décidé de proposer l’application sous licence GPL v2.

Elle sera disponible au téléchargement et librement « adaptable » à votre blog dans quelques temps (sur une forge qu’il nous reste à identifier). Nicolas souhaite juste avoir un peu de temps et de recul sur l’application pour proposer une code documenté et facile à forker pour d’autres blogs sous WordPress..

Il faut donc considérer l’application IOS du Blog de Nicolargo comme une démonstration de ce code open-source.

A télécharger, tester puis commenter sans modération !


Que pensez-vous de cette initiative ?

Etes-vous intéressé pour développer un « fork » de cette application pour votre blog ?

Souhaitez vous participer au développement de l’application « core » pour l’améliorer  ?

A vos commentaires…

PS: l’application est bien entendu gratuite. Si vous voulez soutenir Nicolas Richasse  dans son développement vous pouvez acheter son application iNumber qui reprend grosso modo la règle des chiffres de l’émission des chiffres et des lettres.

Catégories
Gstreamer Open-source Planet-libre Video Web

Installation et test de Flumotion 0.8

Flumotion est un serveur de streaming open-source sous licence GPL. Il permet de diffuser à des utilisateurs ne disposant que d’un simple navigateur Web des contenus audio et vidéo.

La dernière version disponible (la 0.8) apporte une fonctionnalité que je trouve intéressante de tester: le support du conteneur WebM et du codec vidéo VP8 que gOOgle à libéré il y a quelques mois.

Nous allons voir dans ce billet comment installer et configurer Flumotion 0.8 sur une distribution GNU/Linux Ubuntu Desktop 10.10.

Compilation de Flumotion 0.8

Récupération des sources:

mkdir ~/src

cd ~/src

wget http://www.flumotion.net//src/flumotion/flumotion-0.8.0.tar.gz

tar zxvf flumotion-0.8.0.tar.gz

cd ~/src/flumotion-0.8.0

Installation des librairies (en plus de mon installation standard d’Ubuntu), j’ai du ajouter:

sudo aptitude install python-all-dev python-kiwi

Configuration et compilation:

./configure

make

sudo make install

sudo mkdir /usr/local/etc/flumotion/

sudo cp conf/default.pem /usr/local/etc/flumotion/

Configuration de Flumotion 0.8

Le serveur Flumotion utilise deux processus: flumotion-manager et flumotion-worker.

Le premier processus (flumotion-manager) à besoin d’un fichier de configuration nommé planet.xml. Je vous propose donc de partir du fichier de configuration fourni avec les sources et de le copier dans un répertoire de votre machine.

mkdir ~/flumotion

mkdir ~/flumotion/conf

cp ~/src/flumotion-0.8.0/conf/managers/default/planet.xml ~/flumotion/conf/

Puis de l’éditer:

gedit ~/flumotion/conf/planet.xml

La ligne vraiment intéressante à modifier est celle-ci:

user:PSfNpHTkpTx1M

Elle défini l’utilisateur user avec le mot de passe par défaut test (encodé).

Remarque: Pour générer un nouveau couple login/password, le plus simple est de ce rendre sur ce site et de remplacer le résultat dans le fichier ~/flumotion/conf/planet.xml.

On lance ainsi le processus avec la commande suivante:

flumotion-manager ~/flumotion/conf/planet.xml &

On vérifie que le processus est bien lancé:

ps auxw | grep flumotion

labo    16352 10.4  0.3  18300 12724 pts/3    S    15:41   0:00 /usr/bin/python /usr/local/bin/flumotion-manager /home/labo/flumotion/conf/planet.xml

Le deuxième processus (flumotion-worker) n’a pas besoin d’un fichier de configuration. Il faut juste passer en paramètre l’utilisateur user avec le mot de passe test (clair) à utiliser pour se connecter au processus flumotion-manager:

flumotion-worker -v -u user -p test

Utilisation de Flumotion 0.8

On va utiliser le programme flumotion-admin pour administrer notre serveur Flumotion:

flumotion-admin &

La fenêtre suivante devrait s’afficher :

Remarque: si vous installez Flumotion sur un serveur sans interface graphique, il faudra utiliser flumotion-admin-text en lieu et place de flumotion-admin.

On clique sur Suivant:

On clique sur Suivant puis on entre le login user et le password test:

Après avoir cliqué sur Suivant, un assistant de configuration (wizard) va s’afficher:

On arrête de cliquer quelques instant pour voir que Flumotion propose deux scénarios:

  • configuration d’un streaming « live » à partir d’une camera / webcam
  • configuration d’un streaming « on demand » à partir d’un fichier

Configuration d’un « streaming live »

Comme un des objectifs de ce billet est de tester la diffusion live en WebM/VP8, on choisi la première option dans la fenêtre suivante:

Si vous n’avez pas de caméra digitale ou de Webcam sur votre machine, vous pouvez utiliser le « test video producer »  qui est en fait une mire de test (je rappelle de Flumotion se base sur GStreamer et cette mire est en fait généré par le plugin videotestsrc).

On configure la mire:

Il est ensuite possible de configurer un texte ou un logo qui sera affiché en overlay sur la vidéo:

On passe ensuite à la configuration de la « mire audio »:

Puis on défini les paramètres du streaming: conteneur, codec vidéo et codec audio:

Au niveau du codec vidéo VP8, on peut soit définir un débit fixe (CBR) ou bien une qualité fixe (VBR). Pour du streaming live, je conseille plutôt du CBR, par exemple à 400 Kbps:

De même pour le codec audio Vorbis:

On défini ensuite si l’on veut streamer sur HTTP (seule option disponible pour l’instant) et/ou sauver le résultat du streaming dans un fichier local sur le serveur (cette option peut être intéressante pour relire la vidéo de manière offline).

Enfin, on défini le point de montage (URL) ainsi que le port TCP à partir duquel le serveur sera accessible. Il est également possible de limiter le streaming (nombre d’utilisateur max, bande passante max…):

On peut également préciser la licence de diffusion de votre streaming:

Et voilà le travail, votre serveur de streaming est opérationnel:

Pour le tester il suffit de ccopier l’URL de l’onglet Statistiques dans (attention pour voir la vidéo depuis une autre machine, il faut remplacer le nom d’hôte avant le :8800 par l’adresse IP de la machine):

  • un navigateur Web compatible WebM/VP8: Chromium
  • un lecteur multimedia compatible WebM/VP8: Totem sous Ubuntu

La vidéo devrait s’afficher:

Pour sauvegarder cette configuration de streaming, il suffit de cliquer sur Connexion > Exporter la connexion puis de sauvegarder le fichier au format XML (Connexion > Importer pour la réimporter dans Flumotion).

Les sources vidéos possibles pour un streaming live sont:

  • la mire (pour les tests)
  • webcam (j’ai rencontré un problème avec la mienne, voir le dernier chapitre de ce billet)
  • TV card
  • Loop video (prend en entrée un fichier OGG et génère une boucle infini à partir de cette vidéo)
  • Firewire

Configuration d’un streaming on-demand (VoD)

Avant de tester la vidéo à la demande, il faut disposer de fichiers vidéos encodés au format WebM (pour la VoD, la version communautaire de Flumotion supporte également le format OGG). Pour produire de tel fichier, je vous conseille la lecture de ce billet. Une fois les vidéos localisées dans un répertoire de votre machine faisant tourner le serveur Flumotion, il suffit de faire appel à l’assistant via le menu Contrôler > Lancer l’assistant de flumotion-admin.

Il faut seulement définir le répertoire ou sont stockées les vidéos:

Puis identifier la liste des vidéos disponibles et leurs URLs dans l’onglet Browser. Là encore, il faut adapter l’adresse en remplaçant le nom logique par l’adresse IP de votre machine Flumotion si vous voulez consulter ces vidéos sur d’autres machines du réseau.

Enfin, vous pouvez ouvrir cette URL soit dans un navigateur Web qui prend en charge WebM (par exemple Chromium):

Soit dans votre lecteur multimédia par défaut (par exemple Totem, ouvrir en utilisant CTRL+L):

Pour une intégration plus « web design compliant » de vos vidéos dans des pages Web (plutôt qu’un bête affichage en full-screen), il faut utiliser le tag HTML5 <video> dont j’ai donné plusieurs syntaxe d’utilisation dans ce billet.

Problèmes rencontrés…

Lors de mes tests, j’ai rencontré un problème lors de la détection de ma WebCam Logitech QuickCam Pro 4000 (qui marche très bien par ailleurs). La détection des informations n’aboutie pas…

Un autre problème est l’ouverture des fichiers VoD à partir de VLC qui supporte pourtant le format WebM. Le son passe correctement mais la vidéo reste désespérément noire…

Catégories
Developpement Open-source Planet-libre Web

Concours Prologin 2011 !

Vous chercher à occuper ce long week-end d’automne ? Vous aimez les logiciels libres ? Vous êtes un crack en algorithmique / développement ? Alors le concours Prologin 2011 est fait pour vous !

Depuis maintenant quelques années, l’association Prologin propose de participer à son concours national d’informatique. Réservé aux étudiants de vingt ans et moins, ce concours gratuit se déroule en trois étapes: qualification sur internet, demi-finale en région et  finale à Paris !

Outre le fait de faire un peu travailler vos méninges, le concours vous permettra, si vous passez la première étape de qualification en ligne, de rencontrer « in real life » des personnes partageant, comme vous la passion de l’informatique. Vous pouvez voir sur les photos des éditions précédentes que l’ambiance est plutôt sympa !

Les vainqueurs pourront ensuite valoriser ce trophée, cela fait toujours bien dans le CV :). De nombreuses écoles d’ingénieurs suivent de près ce coucours:

En bonus, ProLogin propose un site d’entrainement ouvert à tous (c’est à dire au vieux comme moi ou aux futurs participants voulant se jauger).

Pour participer au concours Prologin 2011, suivre ce lien !

Catégories
Blog Open-source Planet-libre Web

Bye bye Pino. Hello Hotot.

Dans la grande « mouvance » du Web 2.0, les systèmes de micro-blogging sont pour moi la réelle révolution pour diffuser et récolter des information.s Tout autant que mes flux RSS, mes comptes Twitter (@nicolargo) et Identi.ca forment une source constante d’informations.

A mes débuts sur Twitter (juillet 2007 :), putain 3 ans…), j’utilisais exclusivement l’interface Web Twitter, puis sont arrivés les clients de micro-blogging sous GNU/Linux avec en tête Gwibber (le client officiel sous Gnome). Après l’excitation de la nouveauté, je me suis vite rendu compte de la lourdeur et de ses bugs récurrents de ce logiciel (surtout si vous avez une version GNU/Linux non Anglaise…).

J’ai alors découvert Pino, un vrai bonheur ! Un client simple, léger, bien intégré à ma distribution Ubuntu. Je l’ai encore intégré à mon processus de publication interne. Malheureusement, début septembre 2010, Twitter décide de migrer son système d’authentification vers OAuth (un protocole ouvert). Et là patatra… A ce jour et malgré une bidouille pour permettre une authentification à Twitter par un site tiers, l’auteur de Pino n’a toujours pas fait évoluer son logiciel dans la fameuse version 0.3 sensée corriger le problème. De plus les premiers échos de cette nouvelle version ne sont pas très positifs (interface plus lourde notamment).

J’ai donc décidé d’utiliser un troisième client en lieu et place de Pino. Ce client s’appelle Hotot et il est développé par une équipe asiatique  très réactive. En plus du support de Twitter et d’Identi.ca (moyennant une petite configuration dans les menus), il promet une gestion multi-timelines (c’est à dire un mix de vos différents comptes) dans une prochaine version. Visuellement Hotot apporte son lot d’améliorations par un système de plugins (comme l’affichage des images en preview).

Update

Hotot vient juste d’être mis à jour (suite à la lecture de ce billet??? :)): support Identi.ca et multi-timelines !!!

A installer à partir des PPAs.

/Update

En attendant la suite, je choisi pour l’instant Hotot !

Et vous ?

Catégories
Blog Open-source Planet-libre Web

Booster votre site n’est pas qu’un truc de geek

Depuis la généralisation des accès hauts débits sur Internet, la rapidité de chargement d’un site est devenu un critère important à prendre en compte dès la phase de conception.

Les moteurs de recherche (Google, Yahoo, Bing…) incluent dans leurs algorithmes la vitesse d’affichage de votre site. Ainsi, Google considère qu’une page est lente si elle met plus de 4.97 secondes pour se charger. La rapidité de chargement aura donc un impact plus ou moins important (difficile d’avoir des chiffres précis) sur le référencement de votre site.

Une étude a montrée qu’un utilisateur venant sur votre site à partir d’un moteur de recherche aura une patience d’environ 4 secondes. Au delà de cette valeur le taux d’abandon devient important.

Bref, vous l’avez compris, le temps de chargement des pages est un paramètre tout aussi important que le design quand vous mettez un site en ligne.

Je me suis penché sur ce sujet lors de conception de la nouvelle version du blog de Nicolargo. Il en ressort quelques billets ciblés sur les problèmatiques de performances des blogs WordPress (basée sur des solutions libres bien sûr :)):

Au niveau des outils de tests, le Web fourmille de service en ligne. Attention lorsque vous faite vos tests de choisir des URL représentatives (pas seulement un test sur votre Home page qui ne représente que 1% de vos visiteurs…). Personnellement, j’utilise surtout:

  • GTMetrix qui permet d’automatiser le test de votre site en calculant automatiquement les valeurs Y-Slow, Page Speed.
  • WebWait: très utile pour tester les modifications que vous faites sur votre site et en mesurer l’impact en terme de vitesse de chargement.
  • Apache Benchmark (ab pour les intimes): un outil libre sous licence Apache permettant de tester la montée en charge de votre site (c’est à dire comment votre site va réagir quand beaucoup d’utilisateurs vont le consulter simultanément). Un exemple de ligne de commande que j’utilise en local sur mon serveur:

ab -t 30 -c 5 http://blog.nicolargo.com/2010/10/booster-votre-blog-wordpress-avec-varnish.html

Requests per second:    578.10 [#/sec] (mean)

Time per request:       8.649 [ms] (mean)

Time per request:       1.730 [ms] (mean, across all concurrent requests)

Transfer rate:          329.82 [Kbytes/sec] received

Et vous blogueurs, webmasters, comment prenez-vous en compte la problématique de rapidité d’affichage de vos pages ?

Catégories
Open-source Planet-libre Web

Booster votre blog WordPress avec Varnish

Varnish est un accélérateur de sites Web fonctionnant sur le principe d’un reverse proxy. Varnish va prendre en charge les requêtes HTTP venant de vos visiteurs et communiquer avec votre serveur Web en ne demandant la création des pages Web seulement quand cela est nécessaire.

C’est un projet open-source sous licence FreeBSD.

Installation

Sur un Ubuntu Server (ou une distribution Debian « like »), l’installation se résume à la commande suivante. Vous aurez ainsi la version standard maintenu par les dépôts:

sudo aptitude install varnish

Pour disposer d’une version plus récente et seulement sous Ubuntu, vous pouvez utiliser les lignes de commande suivantes:

curl http://repo.varnish-cache.org/debian/GPG-key.txt | sudo apt-key add –

sudo echo « deb http://repo.varnish-cache.org/ubuntu/ $(lsb_release -s -c) varnish-2.1 » >> /etc/apt/sources.list

sudo aptitude update

sudo aptitude  install varnish

Nous allons donc dans un premier temps tester Varnish sur la configuration initiale de notre serveur Web (qui comprend dans mon exemple deux sites virtuels sous Apache). Cette configuration de test permettra de tester les performances de Varnish sans aucun impact sur vos sites (les visiteurs continueront à passer directement par votre serveur Web Apache). Enfin, si les tests sont concluants, nous modifierons la configuration finale pour que vos visiteurs transitent de manière transparente par Varnish.

Configuration de test

Varnish appelle backend les serveurs Web qu’il doit accélérer. Il est possible de définir un ou plusieurs backends par serveur Varnish.

Ainsi, si l’on souhaite accélérer le site http://blog.nicolargo.com qui est hébérgé sur un serveur, il faut saisir la configuration suivante dans le fichier /etc/varnish/default.vcl (configuration librement inspiré de la documentation officielle sur comment optimiser son blog WordPress avec Varnish) avec une gestion du cache sur les requête POST, pas de cache pour la zone admin, gestion des cookies de Google Analytics.

Vous pouvez télécharger la configuration Varnish VCL complète pour WordPress ici.

#

# Varnish 3 configuration for WordPress

#

# On Debian OS: /etc/varnish/default.vcl

#

# Nicolas Hennion (aka) Nicolargo

#

# Set the default backend (Nginx server for me)

backend default {

# My Nginx server listen on IP address 127.0.0.1 and TCP port 8080

.host = "127.0.0.1";

.port = "8080";

# Increase guru timeout

# http://vincentfretin.ecreall.com/articles/varnish-guru-meditation-on-timeout

.first_byte_timeout = 300s;

}

# Forbidden IP ACL

acl forbidden {

"41.194.61.2"/32;

"192.54.144.229"/32;

}

# Purge ACL

acl purge {

# Only localhost can purge my cache

"127.0.0.1";

"localhost";

}

# This function is used when a request is send by a HTTP client (Browser)

sub vcl_recv {

# Block the forbidden IP addresse

if (client.ip ~ forbidden) {

error 403 "Forbidden";

}

# Only cache the following sites

#if ((req.http.host ~ "(blog.nicolargo.com)") || (req.http.host ~ "(blogtest.nicolargo.com)")) {

if ((req.http.host ~ "(blog.nicolargo.com)")) {

set req.backend = default;

} else {

return (pass);

}

# Compatibility with Apache format log

if (req.restarts == 0) {

if (req.http.x-forwarded-for) {

set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;

} else {

set req.http.X-Forwarded-For = client.ip;

}

}

# Normalize the header, remove the port (in case you're testing this on various TCP ports)

set req.http.Host = regsub(req.http.Host, ":[0-9]+", "");

# Allow purging from ACL

if (req.request == "PURGE") {

# If not allowed then a error 405 is returned

if (!client.ip ~ purge) {

error 405 "This IP is not allowed to send PURGE requests.";

}

# If allowed, do a cache_lookup -> vlc_hit() or vlc_miss()

return (lookup);

}

# Post requests will not be cached

if (req.request == "POST") {

return (pass);

}

# --- WordPress specific configuration

# Did not cache the RSS feed

if (req.url ~ "/feed") {

return (pass);

}

# Blitz hack

if (req.url ~ "/mu-.*") {

return (pass);

}

# Did not cache the admin and login pages

if (req.url ~ "/wp-(login|admin)") {

return (pass);

}

# Remove the "has_js" cookie

set req.http.Cookie = regsuball(req.http.Cookie, "has_js=[^;]+(; )?", "");

# Remove any Google Analytics based cookies

set req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", "");

# Remove the Quant Capital cookies (added by some plugin, all __qca)

set req.http.Cookie = regsuball(req.http.Cookie, "__qc.=[^;]+(; )?", "");

# Remove the wp-settings-1 cookie

set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", "");

# Remove the wp-settings-time-1 cookie

set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(; )?", "");

# Remove the wp test cookie

set req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(; )?", "");

# Are there cookies left with only spaces or that are empty?

if (req.http.cookie ~ "^ *$") {

unset req.http.cookie;

}

# Cache the following files extensions

if (req.url ~ "\.(css|js|png|gif|jp(e)?g|swf|ico)") {

unset req.http.cookie;

}

# Normalize Accept-Encoding header and compression

# https://www.varnish-cache.org/docs/3.0/tutorial/vary.html

if (req.http.Accept-Encoding) {

# Do no compress compressed files...

if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {

remove req.http.Accept-Encoding;

} elsif (req.http.Accept-Encoding ~ "gzip") {

set req.http.Accept-Encoding = "gzip";

} elsif (req.http.Accept-Encoding ~ "deflate") {

set req.http.Accept-Encoding = "deflate";

} else {

remove req.http.Accept-Encoding;

}

}

# Check the cookies for wordpress-specific items

if (req.http.Cookie ~ "wordpress_" || req.http.Cookie ~ "comment_") {

return (pass);

}

if (!req.http.cookie) {

unset req.http.cookie;

}

# --- End of WordPress specific configuration

# Did not cache HTTP authentication and HTTP Cookie

if (req.http.Authorization || req.http.Cookie) {

# Not cacheable by default

return (pass);

}

# Cache all others requests

return (lookup);

}

sub vcl_pipe {

return (pipe);

}

sub vcl_pass {

return (pass);

}

# The data on which the hashing will take place

sub vcl_hash {

hash_data(req.url);

if (req.http.host) {

hash_data(req.http.host);

} else {

hash_data(server.ip);

}

# If the client supports compression, keep that in a different cache

if (req.http.Accept-Encoding) {

hash_data(req.http.Accept-Encoding);

}

return (hash);

}

sub vcl_hit {

# Allow purges

if (req.request == "PURGE") {

purge;

error 200 "Purged.";

}

return (deliver);

}

sub vcl_miss {

# Allow purges

if (req.request == "PURGE") {

purge;

error 200 "Purged.";

}

return (fetch);

}

# This function is used when a request is sent by our backend (Nginx server)

sub vcl_fetch {

# For static content strip all backend cookies

if (req.url ~ "\.(css|js|png|gif|jp(e?)g)|swf|ico") {

unset beresp.http.cookie;

}

# A TTL of 30 minutes

set beresp.ttl = 1800s;

return (deliver);

}

# The routine when we deliver the HTTP request to the user

# Last chance to modify headers that are sent to the client

sub vcl_deliver {

if (obj.hits > 0) {

set resp.http.X-Cache = "cached";

} else {

set resp.http.x-Cache = "uncached";

}

# Remove some headers: PHP version

unset resp.http.X-Powered-By;

# Remove some headers: Apache version & OS

unset resp.http.Server;

return (deliver);

}

sub vcl_init {

return (ok);

}

sub vcl_fini {

return (ok);

}

Le port d’écoute par défaut de Varnish est  TCP/6081 (défini dans le fichier /etc/default/varnish).

Si vous avez un Firewall (iptables) sur votre serveur, il faut penser à ajouter la règle suivante:

iptables -A OUTPUT -p tcp –dport 6081 -j ACCEPT

On relance Varnish pour prendre en compte la configuration:

sudo service varnish restart

Si tout marche bien, vos sites doivent s’afficher avec les URL: http://www.nicolargo.com:6081 et http://blog.nicolargo.com:6081 (à remplacer par vos sites hein, faite pas les boulets…).

Tests sur le site statique

Test local sur le site statique (avec uniquement des éléments statiques page HTML & images). La configuration donnée ci-dessous ne montre pas l’optimisation pour ce site.

Test sur une page statique (HTML simple) sans Varnish:

ab -t 30 -c 5 http://www.nicolargo.com/

Requests per second:    651 [#/sec] (mean)

Time per request:       7.6 [ms] (mean)

Test sur une page statique (HTML simple) avec Varnish:

ab -t 30 -c 5 http://www.nicolargo.com:6081/

Requests per second:    652 [#/sec] (mean)

Time per request:       7.6 [ms] (mean)

Sur notre site Web statique, on n’a donc pas de gain au niveau de la capacité maximale de montée en charge du serveur Apache (Requests per second). Ce qui est normal vu qu’Apache n’a pas grand chose à faire pour servir ce genre de page. Par contre on observe une occupation mémoire moindre pendant le test avec Varnish (environ 10% de moins).

Tests sur le site dynamique (WordPress)

Test en local sur le site Web dynamique (WordPress, déjà optimisé en suivant ce tutoriel).

Test sur la page index d’un blog WordPress sans Varnish:

ab -t 30 -c 5 http://blog.nicolargo.com/

Requests per second:    588 [#/sec] (mean)

Time per request:       8.5 [ms] (mean)

Test sur la page index d’un blog WordPress avec Varnish:

ab -t 30 -c 5 http://blog.nicolargo.com:6081/

Requests per second:    3460 [#/sec] (mean)

Time per request:       1.5 [ms] (mean)

Sur notre site dynamique, la valeur ajoutée de Varnish est importante car on a ici un gain de plus de 488% en terme de nombre de requêtes simultanées que votre serveur peut fournir. Sur une page dynamique un peu plus lourde (par exemple un billet avec beaucoup de commentaires), le gain peut alors monter jusqu’à 650%.

Attention, cela ne veut pas dire que votre blog va s’afficher 488% plus vite avec Varnish mais « seulement » que votre serveur pourra accepter 488% de requêtes simultanées maximales en plus.

Configuration finale

Une fois votre site accéléré validé, il faut passer Varnish en production. Les actions suivantes sont à effectuer.

Configurer le serveur Apache hébergeant votre blog pour écouter sur un port différent du port TCP/80 (par exemple TCP/8080). Sous Ubuntu Server, on commence par modifier le fichier /etc/apache2/ports.conf pour lui demander d’écouter les requêtes HTTP sur le port 8080 en lieu et place du port 80:

NameVirtualHost *:8080

Listen 8080

On modifie ensuite le fichier de configuration de nos sites /etc/apache2/site-enabled/virtualhosts: (notez bien la modification du port :8080 et l’utilisation du format de log varnishcombined)

# WWW

<VirtualHost *:8080>

DocumentRoot /var/www/www

ServerName nicolargo.com

ServerAlias www.nicolargo.com

ServerAdmin contact@pasdespam.com

CustomLog /var/log/apache2/www-access.log varnishcombined

ErrorLog /var/log/apache2/www-error.log

</VirtualHost>

# BLOG

<VirtualHost *:8080>

DocumentRoot /var/www/blog

ServerName blog.nicolargo.com

ServerAdmin contact@pasdespam.com

CustomLog /var/log/apache2/blog-access.log varnishcombined

ErrorLog /var/log/apache2/blog-error.log

</VirtualHost>

On configurer le serveur Apache pour loguer les adresses sources et non pas l’adresse du serveur Varnish. Il suffit pour cela d’ajouter la ligne suivante dans le fichier /etc/apache2/apache2.conf:

LogFormat « %{X-Forwarded-For}i %l %u %t \ »%r\ » %>s %b \ »%{Referer}i\ » \ »%{User-Agent}i\ » » varnishcombined

La configuration d’Apache est maintenant fini, il faut alors configurer Varnish pour écouter sur le port TCP/80 et changer la configuration du « backend » en éditant la section suivante du fichier /etc/default/varnish:

DAEMON_OPTS= »-a :80 \

-T localhost:6082 \

-f /etc/varnish/default.vcl \

-S /etc/varnish/secret \

-p thread_pool_add_delay=2 \

-p thread_pools=4 \

-p thread_pool_min=200 \

-p thread_pool_max=4000 \

-p cli_timeout=25 \

-p session_linger=100 \

-s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G »

On change ensuite la configuration de Varnish pour pointer les backends vers le port 8080:

backend blog {

.host = « blog.nicolargo.com »;

.port = « 8080 »;

}

La dernière chose à faire si votre serveur est protégé par un Firewall IpTables est de modifier la règle ajoutée dans le premier chapitre de ce billet et d’y ajouter une nouvelle règle pour une éventuelle administration locale de Varnish à l’aide de l’utilitaire varnishadm:

iptables -A OUTPUT -p tcp –dport 8080 -j ACCEPT

iptables -A OUTPUT -p tcp –dport 6082 -s 127.0.0.1 -j ACCEPT

On prend en compte la configuration finale en relancant les deux processus (Apache et Varnish):

sudo service apache2 restart

sudo service varnish restart

A partir de ce moment là, toutes les requêtes HTTP de vos visiteurs seront d’abord prise en compte par Varnish (sur le port TCP/80) puis ensuite, si nécessaire, par votre serveur Apache (TCP/8080).

Ecrire les logs sur le disque

Update du 22/02/2012

Par défaut, Varnish n’écrit pas les logs dans un fichier. Pour forcer Varnish à générer des fichiers de logs au format NSCA dans le sous répertoire /var/log/varnishnsca, nous allons utiliser le daemon VarnishNSCA (installé en même temps que Varnish). Il faut commencer par vérifier que script de lancement du daemon VarnishNSCA (/etc/init.d/varnishnsca) ne contient pas un bug, comme c’est le cas dans ma version 3.0.2:

Remplacer la ligne suivante dans le fichier /etc/init.d/varnishnsca:

DAEMON_OPTS= »-a -w ${LOGFILE} -D -P $PIDFILE} »

par

DAEMON_OPTS= »-a -w ${LOGFILE} -D -P ${PIDFILE} »

Puis forcer le lancement du daemon en modifiant le fichier /etc/default/varnishnsca:

VARNISHNCSA_ENABLED=1

On peut ensuite lancer le daemon:

sudo service varnishnsca start

Il est alors possible d’analyser ce fichier avec vos outils de stats favoris. Par exemple en ligne de commande avec GoAccess:

goaccess -f /var/log/varnish/varnishncsa.log

Quelques commandes utiles

  • varnishlog: Affichage du log du daemon Varnish.
  • varnishstat: Affichage des statistiques d’utilisation de Varnish.
  • varnishhist: Affiche un historique sous forme de graphe des requêtes faites à votre serveur Varnish.
  • varnishadm: une interface d’administration locale de Varnish

Vous pouvez également consulter la documentation en ligne à l’adresse suivante.