CentOS 6, Apache & NFS

Linux Aucun commentaire »

SELinux est installé et activé par défaut sur les installations CentOS 6.

Pour mettre en place une infrastructure Web éclatée, j’ai choisis de mettre en place un serveur NFS qui héberge les fichiers de mes applications PHP.
Les serveurs Apache sont donc configurés comme des clients NFS, et le DocumentRoot point vers le point de montage NFS.

Au démarrage d’Apache :
Warning: DocumentRoot [/var/www/tld.domain/subdomains/foo/httpdocs] does not exist

Ce problème peut-être causé par un défault de configuration de SELinux,
Pour vérifier on désactive SELinux et on relance Apache.

setenforce Permissive
service httpd restart

Si Apache démarre correctement, c’est donc bien une configuration SELinux qui bloque.
Il faut modifier un booléen SELinux : httpd_use_nfs qui est à « off » par défaut.

setsebool httpd_use_nfs on

Cela fonctionnera aussi apres un reboot de votre serveur.

Mots-clefs :, , , , , ,
 

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 :, , , , , , , , , , , , ,
 

Pound HTTPS 2 HTTP – Format Certificat

Infrastructure, Linux, Sécurité 1 Commentaire »

Au niveau de la configuration, Pound peut prendre un fichier .pem contenant les certificats du serveurs ainsi que des certificats intermédiaires jusqu’à l’autorité de certification ROOT.

Ce que je ne savais pas et que j’ai eu beaucoup de mal à trouver, c’est qu’il faut inclure la clé privée du certificat pour que Pound puisse démarrer.
Sans cette clé privée, voici l’erreur que vous pouvez avoir : SSL_CTX_use_PrivateKey_file Error

Du coups, voici le format à utiliser :

—–BEGIN PRIVATE KEY—–
Server key (pasted in the new key here)
—–END PRIVATE KEY—–

—–BEGIN CERTIFICATE—–
Server certificate
—–END CERTIFICATE—–

—–BEGIN CERTIFICATE—–
Verisign Intermediate CA (for Extended Validation Certificates)
—–END CERTIFICATE—–

—–BEGIN CERTIFICATE—–
Verisign Root CA (Self signed)
—–END CERTIFICATE—–

PS : Information trouvée sur une archive Mailing List :apsis

Mots-clefs :, , , , ,
 

Linux – Trouver les fichiers contenant une chaine de caractere

Linux 2 Commentaires »

A chaque fois que j’ai besoin de chercher une liste de fichier contenant une chaine de caractere, je passe 15min à trouver la bonne commande.

Donc voici un aide mémoire :

find . | xargs grep 'string' -sl

Plus simple :

grep -lR "string" *
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 :, , , , , ,
 

Linux – Générer des fichiers binaires

Linux 1 Commentaire »

Dans la série des articles post-it, voici comment créer des fichiers binaires de tailles spécifiques.

Un fichier de 100MBytes.

dd if=/dev/zero of=100MB bs=100M count=1

Un fichier de 500MBytes.

dd if=/dev/zero of=500MB bs=500M count=1

Un fichier de 1GBytes.

dd if=/dev/zero of=1GB bs=1G count=1

Et j’ai envie de dire, ainsi de suite…

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 :, , , , , , , ,
 

Configurer une IP Alias sur Loopback – Linux

Linux 2 Commentaires »

Cette configuration peut-être utile dans bien des cas.

Sous Debian-like :
Édition du fichier /etc/network/interfaces

auto lo:0
iface lo:0 inet static
        address 192.168.3.1
        netmask 255.255.255.255

Sous RedHat-like :
Édition du fichier /etc/sysconfig/network-scripts/ifcfg-lo.0

DEVICE="lo:0"
BOOTPROTO="static"
IPADDR="192.168.3.1"
NETMASK="255.255.255.255"
NM_CONTROLLED="yes"
ONBOOT="yes"

Si vous souhaitez désactiver certaines réponses aux requêtes ARP. Ce qui peut-etre utile lorsque vous configurez un environnement HA avec par exemple LVS.

Édition du fichier /etc/sysctl.conf

net.ipv4.conf.lo.forwarding=0
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

Pour appliquer les modifications

sysctl -p
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 :, , , , ,
 

Executer Icecast sur le port 80 – Debian

Linux 1 Commentaire »

Icecast
Pour exécuter un programme qui écoute sur un port inférieur à 1024 il faut certains privilèges.

Par défaut, Icecast est configuré pour se lancer avec l’utilisateur icecast2 et le groupe icecast.

Nous allons donc modifier le fichier /etc/default/icecast

user=root
group=root

Ensuite, /etc/icecast/icecast.xml

<listen>80</listen>
 
<security>
        <chroot>0</chroot>
        <changeowner>
            <user>icecast2</user>
            <group>icecast</group>
        </changeowner>
</security>

Lorsque vous lancerez votre daemon Icecast, celui-ci sera exécuté par root. Une fois démarré, le programme se chargera de changer l’utilisateur et le groupe.

Si vous ne réalisez pas cette opération mais essayer de lancer Icecast sur le port 80, vous aurez le message – explicite – suivant :
Server startup failed.

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