CentOS 6 – Varnish & GeoIP

Linux Aucun commentaire »

centosNous allons voir comment déporter le système de géo-localisation IP sur Varnish.
L’objectif final est de permettre à vos backends de récupérer le Pays de l’utilisateur au sein de la requête HTTP.

Par défault, Varnish n’intègre pas de système de géo-localisation par IP, en revanche il existe quelques plugins qui permettent l’utilisation de GeoIP de MaxMind.

Voici les parties de l’article :

  • Installation de Varnish
  • Installation de GeoIP pour Varnish
  • Configuration du Varnish Module
  • Configuration de SELinux

A noter que nous avons opter pour le VMOD Geoip-vmod par leed25d. Contrairement aux autres plugins, celui-ci ne travail pas le header HTTP de manière autonome. Ce sera à vous de le faire, et grâce à cela vous allez pouvoir choisir comment…

Varnish

Pour compiler le VMOD, il vous faudra récupérer les sources de Varnish et les compiler même si vous choisissez l’installation par YUM.
De mon coté, je n’utilise pas en production la version que je compile mais la version provenant du dépot varnish-cache.org. A vous de voir.

Commençons par l’installation de Varnish via YUM (cf. Doc officielle):

rpm --nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el5/noarch/varnish-release-3.0-1.noarch.rpm
yum install varnish

Pour compiler Varnish nous allons avoir besoin de quelques outils et des sources.

yum install pcre-devel make
cd && curl -o varnish-source.tar.gz http://repo.varnish-cache.org/source/varnish-3.0.2.tar.gz
tar -xvzf varnish-source.tar.gz

On lance la compilation de Varnish.

cd varnish-3.0.2/
./configure
make

Normalement, Varnish a été compilé dans votre repertoire $HOME/varnish-3.0.2/.

GeoIP VMOD

On récupère les sources sur github.

Après l’installation de quelques outils dont GeoIP, on lance la compilation du VMOD.
Attention, pour les version 32Bits utiliser VMODDIR=/usr/lib/varnish/vmods/.

yum install unzip automake autoinstall libtool geoip geoip-devel
unzip leed25d-geoip-vmod-[REVISION].zip
cd leed25d-geoip-vmod-[REVISION]
./autogen.sh
./configure VARNISHSRC=$HOME/varnish-3.0.2/ VMODDIR=/usr/lib64/varnish/vmods/
make
make install

Suite à l’installation Varnish, penser à ouvrir votre firewall.

#/etc/sysconfig/iptables
-A INPUT -m tcp -p tcp --dport 80 -j ACCEPT
service iptables restart

De même, il faut configurer Varnish pour écouter sur le port 80 à la place du 6081.

#/etc/sysconfig/varnish</strong>
VARNISH_LISTEN_PORT=80

Ensuite, on va vérifier que l’on peut lancer Varnish en chargeant le plugin GeoIP.

#/etc/varnish/default.vcl
#Top of file.
import geoip;

On va lancer le processus en debug pour voir si tout se passe bien :

varnishd -d -f /etc/varnish/default.vcl
start

Si vous n’avez pas d’erreur, c’est une bonne chose. Sinon, vérifier les étapes ci-dessus.

On va donc pouvoir inclure le pays de l’utilisateur dans le Header HTTP en suivant l’exemple de l’auteur du VMOD

#/etc/varnish/default.vcl
import geoip;
 
sub vcl_recv {
    set req.http.X-Forwarded-For = client.ip;
    set req.http.X-GeoIP = geoip.country(req.http.X-Forwarded-For)
}

Maintenant on va pouvoir mettre Varnish en démarrage automatique.

chkconfig varnish on
service varnish start

Attention:
Sachant que vous êtes sous CentOS, SELinux est surement activé et bloquera l’access au fichier de données /usr/share/GeoIP/GeoIP.dat. Vous pouvez le désactiver ou aller voir à la fin de l’article comment le configurer aux petits oignons.

setenforce 0

Et pour finir, un peu de ménage.

cd && rm -Rf varnish-* && rm -Rf leed25d-*
yum remove pcre-devel make unzip automake autoinstall geoip-devel

Pour aller plus loin

Avec la configuration ci-dessus,
Si un client de France se connecte directement à Varnish, lorsqu’une requête sera générée pour atteindre vos backends elle contiendra : X-GeoIP: FR

Vous pourrez donc récupérer le pays de l’utilisateur en analysant le contenu de la requête HTTP.
Il est à noter que GeoIP retourne le code pays « AA » lorsqu’il ne parvient pas à faire la détection.

Voici comment vous pouvez exploiter le contenu du header en PHP :

$headers = apache_request_headers();
$code = null;
 
if ($headers && is_array($headers) && array_key_exists("X-GeoIP", $headers)) {
    $code = $headers["X-GeoIP"];
}
 
if ((null == $code)||("AA" == $code)) {
    $code = $this->getDefaultCountry();
}
 
$code = strtoupper($code);

Retournons du coté de Varnish.
Comment les choses vont se passer si vous ajoutez un Proxy en amont de Varnish. Par exemple, Pound pour gérer le protocole HTTPS.

La detection du pays ne fonctionnera plus normalement car la valeur contenu dans le script VCL ‘client.ip‘ correspondra à l’IP de votre serveur Pound.

Nous allons donc devoir travailler avec un autre Header HTTP: X-Forwarded-For. Celui-ci permet de conserver l’historique des différents point de passage d’une requête HTTP et contient l’IP du client qui a initié la connection HTTP.

Lorsque les différents Proxy implementent correctement ce standard, le champs X-Forwarded-For contient l’IP du client, le proxy A, le proxy B, etc.. le tout séparé avec des virgules.

Voici comment en tenir compte au sein de votre configuration VCL :

sub vcl_recv {
    //...
 
    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;
        }
    }
 
    set req.http.X-GeoIP = geoip.country(regsub (req.http.X-Forwarded-For, "(,.*)", ""));
 
    //...
}

Maintenant parlons un peu du système de cache de Varnish.
Si vous avez besoin de connaitre le pays de l’utilisateur, il y a donc fort à parier que le contenu retourné à l’utilisateur sera different en fonction de son Pays.

En résumé, pour une URL : /mon-url, en fonction du Pays utilisateur le contenu sera different.
Si on conserve la spécification par défaut de Varnish qui consiste à mettre en cache les données provenant d’une même URL, vous allez avoir quelques mauvaises surprises.

Voici comment tenir compte du pays de l’utilisateur pour gérer les données qui sont mises en cache.

sub vcl_hash {
    //...
 
    hash_data(req.url);
    hash_data(req.http.X-GeoIP);
 
    //...
 
    return (hash);
}

SELinux

Sous Centos, il y a SELinux.
Si vous n’êtes pas un expert en sécurité Linux. Voici comment faire fonctionner Varnish & GeoIP sans désactiver SELinux.
Le processus Varnish fait parti d’un contexte SELinux different du fichier GetIP.dat qui est installé avec GeoIP.
Du coup, nous allons faire un module pour SELinux afin d’autoriser varnish_t à lire les contextes de type usr_t.

mkdir ~/myvarnish; cd ~/myvarnish;
echo "policy_module(myvarnish, 1.0.0) optional_policy(\` gen_require(\` type varnishd_t; ') files_read_usr_files(varnishd_t) ')" > myvarnish.te
make -f /usr/share/selinux/devel/Makefile myvarnish.pp
semodule -i myvarnish.pp

Pour le coup, cette partie provient d’une discussion avec une personne sur #SELinux on freenode.

Mots-clefs :, , , , , , , , , , , , ,
 

CentOS 6 – Installer APC

Linux Aucun commentaire »

centosApres avoir installé et configuré correctement votre environnement LAMP sous CentOS 6 vous souhaitez installer APC.

Ce dont vous avez besoin avant de commencer :
- PEAR,
- les interfaces de développement de PHP, Apache & PCRE,
- un compilateur C & l’outil Make.

yum install php-pear php-devel httpd-devel pcre-devel gcc make

Ensuite, on lance la compilation de l’extension APC.

pecl install apc

Voici les questions qui vous seront posées, personnellement j’ai utilisé les valeurs par défaut.

Enable internal debugging in APC [no] : 
Enable per request file info about files used from the APC cache [no] : 
Enable spin locks (EXPERIMENTAL) [no] : 
Enable memory protection (EXPERIMENTAL) [no] : 
Enable pthread mutexes (default) [yes] : 
Enable pthread read/write locks (EXPERIMENTAL) [no] :

On active l’extension PHP

echo "extension=apc.so" > /etc/php.d/apc.ini

Et on redémarre Apache.

service httpd restart

Vous pouvez vérifier que vous avez correctement installé APC via phpinfo().

Aussi, n’hésiter pas à utiliser le script PHP d’administration de APC.
Ici, nous le copions dans notre répertoire HTTP.

cp /usr/share/pear/apc.php /var/www/apc.php
Mots-clefs :, , , , , ,
 

Actionscript – NetStream & P2P

AIR, Flash Aucun commentaire »

Ce petit programme permet d’afficher la camera d’une personne qui se connecte. Cela est fait grâce à l’utilisation d’un flux NetStream lui même utilisant une connexion P2P sans serveur.

A noter que cela n’est absolument pas optimisé. Si vous avez des conseils à donner sur la configuration du NetStream, NetConnection, NetGroup ou encore du GroupSpecifier pour améliorer les performances, n’hésitez pas..

private var nc			: NetConnection;
private var group		: NetGroup;
private var connected	: Boolean;
private var sendStream	: NetStream;
private var listenStreams	: Object;
private var groupspec	: GroupSpecifier;
private var listenStream	: NetStream;
private var id 			: String;
 
public function WebcamP2P()
{
	super();
 
	stage.align 		= StageAlign.TOP_LEFT;
	stage.scaleMode 	= StageScaleMode.NO_SCALE;
 
	id	= String ( ( new Date () ).time * int ( Math.random() * 1000 ) );
 
	nc = new NetConnection ();
	nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus);
	nc.connect("rtmfp:");
}
 
private function netStatus (event:NetStatusEvent):void
{
	switch(event.info.code){
		case "NetConnection.Connect.Success":
			setupGroup();
			break;
		case "NetGroup.Connect.Success":
			connected = true;
			break;
		case "NetGroup.MulticastStream.PublishNotify":
			trace ( "name of the detected stream : " + event.info.name);
 
			var _video			: Video;
			var _listenStream	: NetStream;
 
			_video 	= new Video ( 320, 240 );
			_listenStream	= new NetStream ( nc, groupspec.groupspecWithoutAuthorizations() );
			_listenStream.play ( event.info.name );
 
			_video.attachNetStream ( _listenStream );
 
			addChild ( _video );
			break;
	}
}
 
private function setupGroup():void
{
	groupspec = new GroupSpecifier("myGroup/groupOne");
	groupspec.postingEnabled 	= false;
	groupspec.multicastEnabled 	= true;
	groupspec.ipMulticastMemberUpdatesEnabled = true;
	groupspec.routingEnabled	= false;
	groupspec.addIPMulticastAddress("225.225.0.1:30303");
 
	group = new NetGroup(nc,groupspec.groupspecWithoutAuthorizations());
	group.receiveMode			= NetGroupReceiveMode.NEAREST;
	group.replicationStrategy		= NetGroupReplicationStrategy.RAREST_FIRST;
	group.addEventListener(NetStatusEvent.NET_STATUS,netStatus);
 
	sendStream = new NetStream (nc, groupspec.groupspecWithoutAuthorizations() );
	sendStream.addEventListener(NetStatusEvent.NET_STATUS, netStreamHandler);
	sendStream.multicastAvailabilitySendToAll	= true;
	sendStream.attachAudio ( Microphone.getMicrophone() );
	sendStream.attachCamera ( Camera.getCamera () );
	sendStream.publish ( id );
}
Mots-clefs :, , , , , , , , , , , , ,
 

Debian – Installer le module h264 streaming pour Lighttpd

Linux 1 Commentaire »

Ce tutoriel est un condensé de mes recherches sur Internet pour l’installation du module h264 streaming pour Lighttpd.

Voici les deux principales ressources : h264.code-shop.com & Debian root ( allemand ).

L’objectif des prochaines commandes est de recompiler Lighttpd pour récupérer les modules h264-streaming et les copier dans le Lighttpd qui est géré par votre gestionnaire de paquet.

Installation des paquets utiles à la compilation de Lighttpd.

apt-get install build-essential automake autoconf libtool pkg-config libpcre3-dev zlib1g-dev libbz2-dev libfam-dev

Les paquets : libpcre3-dev zlib1g-dev libbz2-dev libfam-dev ne sont pas nécessaires. Si vous ne souhaitez pas les installés, penser à invoquer la commande ./configure avec les options –without-pcre –without-zlib –without-bzip2 –without-fam

S’il n’est pas déjà présent sur votre Debian, installons Lighttpd.

apt-get install lighttpd

Téléchargeons les sources de Lighttpd 1.4.18 contenant le module h264 streaming.

cd /tmp
wget http://h264.code-shop.com/download/lighttpd-1.4.18_mod_h264_streaming-2.2.9.tar.gz
tar -zxvf lighttpd-1.4.18_mod_h264_streaming-2.2.9.tar.gz

Téléchargeons les sources de Lighttpd géré par votre gestionnaire de paquet. Lors de la rédaction de l’article, Debian Lenny utilise Lighttpd version 1.4.19.

apt-get source lighttpd

Copions les quelques fichiers sources utiles à la compilation du module h264 streaming.

cd /tmp/lighttpd-1.4.18/src/
cp mod_h264_streaming.c mod_streaming_export.h moov.* mp4_io.* mp4_process.* \
mp4_reader.* mp4_writer.* output_bucket.* output_mp4.* /tmp/lighttpd-1.4.19/src/

Nous allons modifier le fichier Makefile.

cd /tmp/lighttpd-1.4.19/src/
vim Makefile.am

Vous pouvez rajouter les lignes suivantes après la définition du module mod_flv_streaming.

lib_LTLIBRARIES += mod_h264_streaming.la
mod_h264_streaming_la_SOURCES = mod_h264_streaming.c \
                                mod_streaming_export.h \
                                moov.c moov.h \
                                mp4_io.c mp4_io.h \
                                mp4_reader.c mp4_reader.h \
                                mp4_writer.c mp4_writer.h \
                                mp4_process.c mp4_process.h \
                                output_bucket.c output_bucket.h \
                                output_mp4.c output_mp4.h
mod_h264_streaming_la_CFLAGS = $(AM_CFLAGS) -DBUILDING_H264_STREAMING
mod_h264_streaming_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_h264_streaming_la_LIBADD = $(common_libadd)

On lance la compilation. Le résultat sera enregistré dans /opt/lighttpd.

cd /tmp/lighttpd-1.4.19
./autogen.sh
./configure --enable-maintainer-mode --prefix=/opt/lighttpd
make && make install

Copions les binaires du module h264 dans l’installation de Lighttpd géré par votre gestionnaire de paquet.

cd /opt/lighttpd/lib/
cp mod_h264_streaming.so mod_expire.so mod_secdownload.so /usr/lib/lighttpd/

Éditer le fichier /etc/lighttpd/lighttpd.conf et rajouter :

server.modules = ( 
  ...,
  "mod_h264_streaming",
  ...
)
h264-streaming.extensions = ( ".mp4" )

Maintenant que tout est fini, vous pouvez relancer votre serveur HTTP et profiter.

Mots-clefs :, , , , , , , ,
 

Linux – Monitoring network via SNMP

Linux, Réseau 1 Commentaire »

debianLes distributions Debian utilisant un Kernel inférieur à la version 2.36 sont touchées par ce problème.

Parce que SNMPD n’est pas lancé avec l’utilisateur Root, celui-ci n’est pas capable de connaitre la vitesse réelle des interfaces réseaux.
Voici le résultat que l’on obtient après une requête SNMP.

IF-MIB::ifSpeed.1 = Gauge32: 10000000
IF-MIB::ifSpeed.2 = Gauge32: 10000000

D’après SNMP, nous avons donc affaire à des cartes 10Mbps, or il s’agit de carte 100Mbps.

Ce bug est identifié #609226 chez Debian.

Afin d’obtenir la bonne vitesse de vos cartes réseaux, soit vous attendez que le Kernel 2.36 soit intégré à Debian soit vous appliquez le patch et re-compiler un noyaux.

Voici le fichier diff contenant le patch :

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
 
 
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index d2c4da5..970eb98 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -1423,6 +1423,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
 
 	/* Allow some commands to be done by anyone */
 	switch (ethcmd) {
+	case ETHTOOL_GSET:
 	case ETHTOOL_GDRVINFO:
 	case ETHTOOL_GMSGLVL:
 	case ETHTOOL_GCOALESCE:
Mots-clefs :, , , , ,
 

Un compilateur Php ?

Système Aucun commentaire »

Ceux qui me traite de geek ne peuvent pas comprendre.. Ce matin, sous la douche m’est venu une idée, pourquoi ne pas compiler le code php ?

En effet, j’utilise Drupal depuis quelques semaines maintenant, et je m’appercois qu’il nécessite plus de temps à l’affichage que pour des sites plus simples. En effet, quand on connai un peu le code du CMS, on comprend vite qu’il fait appel à de nombreux traitements, que se soit des inclusions, ou de simple vérification de condition.. au final, on obtient quelques choses de plus lent qu’un site classique.

J’ai donc été faire un tours du coté de google, et j’ai découvert eAccelerator, et Zend Optimizer.

Le principe étant que le code php est interprété par votre serveur à chaque demande de visiteur. Durant cette interprétation, le code est analysé (syntaxe, grammaire..) puis compiler pour être exécuter (on parle quand même d’interprétation, même si on est bien loin de l’interprétation HTML de votre navigateur).

Le petit eAccelerator se propose de conserver en mémoire vive le code compiler pour le réutiliser si un utilisateur souhaite consulter à nouveau la page.

Quand à Zend Optimizer; il me semble qu’il compile le code et ensuite une machine Zend permet de ‘exécuter.
Deux avantages à cette solution, optimisation dans certain cas de la vitesse d’exécution, et chiffrement du code source vu qu’il est transformé en byte code.

Article connexe : Javascript et PHP sont-ils des sources de ralentissements ?

Edit 11 Janvier 2010 : Roadsend à développer un compilateur PHP qui fournit du Bytecode exécutable directement par votre système d’exploitation.
Il existe une version Unix, FreeBSD et Windows.

Mots-clefs :, , ,
 
Designed by NattyWP Wordpress Themes.
Images by desEXign.