04 avril 2014

Gestion de bandes passantes avec Apache

Dans le cadre d'un réseau interne, supportant des applications de natures diverses, il est intéressant, avant la mise en production d'une application WEB, d'avoir une idée sur la bande passante qui sera consommée. On peut ensuite agir en plafonnant par exemple les flux émis par cette application.

Dans ces pages, je présente un mode de gestion de bande passante  des flux émis par le serveur http Apache. Je  présente le module d’Apache conçu à cet effet, ses différents modes de paramétrage, en fonction des contraintes du réseau et du profil de l’application.
Le module de gestion de bande passante Apache permet :

-De fixer le plafond de bande passante d’un site Apache
-De limiter le nombre maximum de connexions autorisées ;
-De limiter de façon sélective, la bande passante consommée par certains types de contenus : son, vidéo, etc.

Associé à une analyse préalable de flux effectuée avec des outils spécialisés , il permet de garantir que la bande passante contractuelle ne sera pas dépassée.
  
Deux observations :

-Le module mod_bw n’a pas réellement connaissance de la vitesse effective de transfert des données pour un client ; sachant que la réduction de la bande passante réduit les temps de téléchargement.

- La limitation du nombre maximum de connexions s’applique à l’ensemble des connexions du serveur virtuel.

Le module mod_bw, largement utilisé sur le Web, permet de calibrer le flux d’un serveur Apache sur une taille de bande passante conforme aux exigences de disponibilité d’un réseau.

 Les modules d'Apache


Le serveur http Apache  se compose d’un noyau central, auquel peuvent se greffer, dynamiquement des modules effectuant des fonctions spécifiques. Toutes les fonctionnalités d’Apache sont ainsi assurées par des modules indépendants, disponibles comme Apache en Open source. Le module de gestion de bande passante fait partie de ces modules.

 Voici un exemple de la liste des modules Apache 2 :
  
Module
Fonction
http_core.c

mod_access.c
Gère le ccontrôle d'accès basé sur les noms d'hôtes ou les adresses IP du client.
Prefork.c
Permet de fonctionner en mode process.
mod_actions.c
Permet l'exécution de scripts CGI basés sur un type de média particulier ou une méthode de requête http.
mod_alias.c
Permet l'intégration de diverses parties du système de fichiers dans l'arborescence de documents servis par le serveur, et intègre le mécanisme de re direction d'URL.
mod_auth.c
Permet une authentification des utilisateurs sur la base de fichiers texte.
mod_cgi.c
Il met en place le mécanisme qui permet l'exécution de scripts CGI. Tout fichier de type MIME application/x-httpd-cgi sera traité par ce module.
mod_deflate.c
Permet de compresser les données avant transfert vers le client, économisant de la bande passante, souvent de manière considérable. Mod_deflate remplace l'ancien module mod_gzip d'Apache 1.x.

mod_dir.c
Il gère la re direction d'URL avec "slash final" et renvoie l'index de répertoire.
mod_env.c
Il procure le mécanisme pour passer des variables d'environnement à des scripts CGI/SSI.
mod_expires.c
Il gère la génération des champs d'en-têteExpires: en fonction de critères propres à l'utilisateur.
mod_include.c
Il permet la composition dynamique de documents HTML par le serveur.
mod_info.c
Il permet d'obtenir une vue d'ensemble de la configuration courante du serveur dont la liste des modules installés et des directives des fichiers de configuration du serveur.
mod_log_config.c
Gère  l'enregistrement de la trace des requêtes reçues par le serveur.
mod_mime.c
Donne à Apache la capacité de déterminer le type de document.
mod_negotiation.c
Gère la négociation de contenu, ou plus précisément, la sélection de contenu. Celle-ci consiste en la sélection d'une version de document qui correspond le mieux aux possibilités du client, parmi un ensemble de documents.
mod_proxy.c
Ce module implémente un proxy/cache pour Apache.
proxy_connect.c
Gère les fonctionnalités de proxy pour CONNECT.
proxy_ftp.c
Gère les fonctionnalités de proxy pour ftp.
proxy_http.c
Gère les fonctionnalités de proxy pour http 0.x, 1.x.
mod_rewrite.c
Fournit un interpréteur de règles dont l'action est de réécrire "au vol" les URL requises.
mod_setenvif.c
Gère la définition des variables d’environnement d’après les informations du client.
mod _so.c
Gère les fonctionnalités de chargement de modules dynamiques (EX ; plugin Web logic,  etc).
mod _ssl.c
Gestion de la sécurisation SSL.
mod_status.c
Le module d'état mod_status permet à l’ administrateur du serveur d’obtenir des informations statistiques sur le fonctionnement du serveur.
mod_userdir.c
Gère la définition de répertoires propres à un utilisateur.
mod_autoindex.c
Permet l’indexation automatique des répertoires.
mod_asis.c
Régit l'usage de fichiers .asis.
mod_imap.c
Gère les fichiers de type .map, en remplaçant les fonctionnalités du programme CGI imagemap.
mod_wl_20.so
Connecteur WebLogic Server.
mod_bw
Gestionnaire de bande passante

Dans la section qui suit, nous allons décrire le module concerné, et examiner son mode d’intégration à Apache. Ensuite nous passerons en détail les principales directives de configuration. Enfin nous présenterons des cas types de configuration testées.
  
Installation du module mod_bw
Le module de gestion de la bande passante Apache 2 se présente, comme tous les modules Apache,  sous la forme d’une dll (windows) ou d’un .dso (dynamic shared Object ) Unix.

            mod_bw.dll
            mod_bw.so

La mise en place s’effectue selon le processus suivant :


- Copie du module mod_bw dans  le répertoire des modules Apache : /modules ;
-Chargement du module dans le fichier de configuration ;
-Association du module à un virtualhost et configuration du module selon les besoins .
  

 Mise à jour du répertoire des modules Apache


Il s’agit ici d’une copie simple du module mod_bw.dll dans le sous répertoire /modules.

Chargement du module

La spécification du chargement s’effectue dans le fichier de  configuration Apache, httpd.conf, localisé dans le sous-répertoire /conf d’Apache.

Le module doit être chargé en même temps que les autres modules, dans la séquence de chargement des modules Apache.

#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule access_module modules/mod_access.so
LoadModule actions_module modules/mod_actions.so
LoadModule userdir_module modules/mod_userdir.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
#LoadModule ssl_module modules/mod_ssl.so
LoadModule bw_module modules/mod_bw.dll

 Configuration du module

Le module doit être associé à un virtualhost, étant entendu q’un virtualhost correspond globalement à un site. Sa configuration s’effectuera par conséquent dans le bloc de configuration associé. Exemple :

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@rte-france.com
    DocumentRoot /appli/http/formation02-fxe
    BandwidthModule On
    ForceBandWidthModule On
    Bandwidth all 1024000
    MinBandwidth all -1
    ServerName formation03-fxe.com
            <Directory "C:/appli/http/formation02-fxe">
            Options Indexes
            AllowOverride None
            Order allow,deny
            Allow from all
            </Directory>    
    ErrorLog c:/var/logs/formation03-fxe.com-error_log
    CustomLog c:/var/logs/formation03-fxe.com-access_log common
</VirtualHost>

Dans cet exemple de base, nous demandons la limitation de la bande passante à 1 Mo/s.

La validation s’effectue facilement en définissant deux virtualhosts accédant aux mêmes pages, l’un sans limitation de bande passante, l’autre comportant des spécifications de limitation. On peut aussi observer les trames à l’aide d’Ethereal. Exemple :

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@rte-france.com
    DocumentRoot /appli/http/formation02-fxe
    ServerName formation02-fxe.com
            <Directory "C:/appli/http/formation02-fxe">
            Options Indexes
            AllowOverride None
            Order allow,deny
            Allow from all
            </Directory>    
    ErrorLog c:/var/logs/formation02-fxe.com-error_log
    CustomLog c:/var/logs/formation02-fxe.com-access_log common
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin webmaster@rte-france.com
    DocumentRoot /appli/http/formation02-fxe
    BandwidthModule On
    ForceBandWidthModule On
    Bandwidth all 1024000
    MinBandwidth all -1
    ServerName formation03-fxe.com
            <Directory "C:/appli/http/formation02-fxe">
            Options Indexes
            AllowOverride None
            Order allow,deny
            Allow from all
            </Directory>    
    ErrorLog c:/var/logs/formation03-fxe.com-error_log
    CustomLog c:/var/logs/formation03-fxe.com-access_log common
</VirtualHost>



 Les directives de configuration

Dans cette section nous présentons quelques-unes des directives de mod_bw. Le détail de celles-ci peut être consulté sur les sites Apache.

 BandWidthModule [On|Off]


Cette directive accepte un paramètre qui doit être positionné à ON pour activer le module mod_bw. Off est la valeur par défaut.

Exemple :

              BandWidthModule On

 ForceBandWidthModule [On|Off]


Cette directive accepte un paramètre qui doit être positionné à ON pour activer le traitement de tous les flux.  Off est la valeur par défaut.
  
  
Exemple :
             
              Force BandWidthModule On


 BandWidth [From] [bytes/s]


Cette directive accepte deux paramètres:

From sert à spécifier l’origine de la connexion.  Ce paramètre peut être :
-Une adresse IP complète ;
-L’adresse d’une partie d’un domaine ;
-All pour toutes connexions.   
Bytes/s spécifie la taille maximum autorisée en nombres d’octets.

Exemple :

            BandWidth localhost 10240
            BandWidth 192.168.218.5 0


 MinBandWidth [From] [bytes/s]

Cette directive accepte deux paramètres:

From sert à spécifier l’origine de la connexion.  Ce paramètre peut être :
-Une adresse IP complète ;
-L’adresse d’une partie d’un domaine ;
-All pour toutes connexions.   
Bytes/s spécifie la taille minimum allouée à chaque connexion. Cette taille est exprimée en octets.
En spécifiant la valeur 0, le module prend 256 par défaut. La valeur –1 signifie que chaque client  disposera d’un  maximum défini par la directive bandWidth.

 Exemples :

              BandWidth    all 1024000
              MinBandWidth all 50000

Dans cet  exemple les clients se partagent une bande passante de 1Mo, avec un minimum de 50K par client (ou connexion) . L’exemple qui suit fixe à 50ko/s le flux maximum  par client.  
        
              BandWidth    all 50000
              MinBandWidth all -1


LargeFileLimit [Type] [Minimum Size] [bytes/s]


Cette directive permet de limiter à  une valeur de bande passante des fichiers donnés présentant une taille supérieure à une certaine valeur.

Le paramètre Type indique l’extension de fichier ou * pour tous types de fichiers.
Le paramètre Minimum Size spécifie la taille ( en ko) à partir de laquelle la limitation intervient.
Le paramètre bytes/s indique la valeur de bande passante appliquée.
  

  Exemple :

             LargeFileLimit .ppt 500 10240

 Cet exemple traite les fichiers .ppt de plus de 500K et limite leur bande  passante  à  10ko/s
  

   MaxConnection [From] [Max] 


Cette directive accepte deux paramètres, dont le premier spécifie l’origine de la connexion, et le second un nombre maximum de connexions simultanées.

Le paramètre From  peut être :
-Une adresse IP complète(Ex. : 192.168.0.15) ;
-L'adresse d’une partie d’un domaine (EX. :192.168.0.0/255.255.255.0) ;
-All: pour toutes connexions.  

Le paramètre Max définit le nombre maximum de connexions. Lorsque que ce maximum est atteint, les clients se connectant reçoivent le message bien connu « 503 Service Temporarily Unavailable ».
     
Exemple 1 :

              BandWidth all 0
              MaxConnection all 20
   
Exemple 2:

              BandWidth all 0
              BandWidth 192.168.0.0/24 1024000
              MaxConnection all 20
              MaxConnection 192.168.0.0/24 5


Quelques exemples de configurations testées

  
1). Limitation de la bande passante de chaque connexion à  256ko/s

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@fxe.net
    DocumentRoot /appli/http/formation02-fxe
    BandwidthModule On
    ForceBandWidthModule On
    Bandwidth all 256000
    MinBandwidth all -1
    ServerName formation03-fxe.com
            <Directory "C:/appli/http/formation02-fxe">
            Options Indexes
            AllowOverride None
            Order allow,deny
            Allow from all
            </Directory>    
    ErrorLog c:/var/logs/formation03-fxe.com-error_log
    CustomLog c:/var/logs/formation03-fxe.com-access_log common
</VirtualHost>


2). Limitation de la bande passante totale  à 1Mo/s, avec un minimum de 50ko/s par connexion ; en même temps, on limite à 50ko/s les fichiers de plus de 500K.

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@fxe.net
    DocumentRoot /appli/http/formation02-fxe
    BandwidthModule On
    ForceBandWidthModule On
    Bandwidth all 1024000
    MinBandwidth all 50000
    LargeFileLimit * 500 50000
    ServerName formation03-fxe.com
            <Directory "C:/appli/http/formation02-fxe">
            Options Indexes
            AllowOverride None
            Order allow,deny
            Allow from all
            </Directory>    
    ErrorLog c:/var/logs/formation03-fxe.com-error_log
    CustomLog c:/var/logs/formation03-fxe.com-access_log common
</VirtualHost>


3). Limitation   des fichiers avi , mpg,  mp3 à  20ko/s.

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@fxe.net
    DocumentRoot /appli/http/formation02-fxe
    BandwidthModule On
    ForceBandWidthModule On
    LargeFileLimit .avi 1 20000
    LargeFileLimit .mpg 1 20000
    LargeFileLimit .mp3 1 20000
    ServerName formation03-fxe.com
            <Directory "C:/appli/http/formation02-fxe">
            Options Indexes
            AllowOverride None
            Order allow,deny
            Allow from all
            </Directory>    
    ErrorLog c:/var/logs/formation03-fxe.com-error_log
    CustomLog c:/var/logs/formation03-fxe.com-access_log common
</VirtualHost>


 Conclusion


Le module de gestion de bande passante Apache permet :

-De fixer le plafond de bande passante d’un site Apache;
-De limiter le nombre maximum de connexions autorisées ;
-De limiter de façon sélective, la bande passante consommée par certains types de contenus : son, vidéo, etc.

Associé à une analyse préalable de flux effectuée avec des outils de mesure réseau,  le module de gestion de bande passante Apache permet de garantir que la bande passante contractuelle ne sera pas dépassée. Le paramétrage reste relativement simple et bien adapté à la problématique des sites WEB, même si certaines limitations peuvent être observées.

Toutefois, la problématique d’un site WEB ne se limite pas à l’action ponctuelle et initiale de mise en place de la bonne infrastructure d’accueil. Il conviendra aussi de suivre de façon régulière, l’activité du site.

Aucun commentaire :

Bibliographie

  • ASP.NET Data Web Controls(Scott Michell)
  • Building Custom PHP Extensions(Blake Schwendiman)
  • Développer avec CORBA en JAVA ET C++(David Acremann)
  • Java Native Interface(Sheng Liang)
  • Mastering WebLogic Server(Gregory Nyberg; Robert Patrick)
  • Oracle Database 10g RAC on Linux(Julian Dyke; Steve Shaw)
  • Test Process Improvement(Martin Pol)
Back to top