Sometimes I write things, sometimes I don't.

To content | To menu | To search

Tag - Debian

Entries feed - Comments feed

Saturday 25 June 2011

Apache 2 : mod_macro

internet.pngIl y a des logiciels, des outils, des modules ou on sait directement que l’on ne pourra plus s’en passer. Soit parce que c’est génial et révolutionnaire soit par ce que c’est très pratique et qu’il fallait y penser. C’est exactement ce que je me suis dis en découvrant le mod_macro pour Apache 2. Il y a quelques semaines je ne soupçonnais par l’existence d’un tel module. On m’en a parlé, j’ai laissé mariner et puis j’ai finalement mis la main à la pâte. Et là j’en ai eu la larme à l’œil. Combien de fois je me suis arraché les cheveux sur ma configuration de Apache, combien de copier/coller de virtual hosts j’ai fait… Avec mod_macro tout ça c’est terminé.

Pour résumer, ce module permet de factoriser sa configuration de Apache. On définit des macros puis on les appelle un peu comme les fonctions avec un langage de scripts. On peut faire des macros pour plus ou moins tout ainsi en organisant bien son système et en sachant factoriser sa configuration correctement on peut grandement se simplifier la vie.

Pour installer le mod_macro sur Debian et dérivées, rien de plus simple :
# aptitude install libapache2-mod-macro
# a2enmod macro


Ensuite, il s’agit de ne pas faire n’importe quoi. Afin de gérer mes macros, j’ai créé un fichier macro.conf dans le répertoire /etc/apache2/conf.d/ qui est chargé au démarrage de Apache. Comme je l’ai dit précédemment, on peut se servir des macros pour faire énormément de choses donc je n’aborderai pas tout ici.

Admettons que nous disposons des 2 hôtes virtuels suivants (exemple bidon mais c’est pour montrer le principe) :
<VirtualHost [ipv6]:80 ipv4:80>
  DocumentRoot /var/www/toto
  ServerName   toto.domaine.tld
  ServerAlias  toto.domaine.tld
  ServerAdmin  admin@toto.com

  ErrorLog     /var/log/apache2/toto_error.log
  TransferLog  /var/log/apache2/toto_access.log
</VirtualHost>


<VirtualHost [ipv6]:80 ipv4:80>
  DocumentRoot /var/www/titi
  ServerName   titi.domaine.tld
  ServerAlias  titi.domaine.tld
  ServerAdmin  admin@titi.com

  ErrorLog     /var/log/apache2/titi_error.log
  TransferLog  /var/log/apache2/titi_access.log
</VirtualHost>


Il y a quand même pas mal de points communs entre ces 2 hôtes virtuels. Imaginez s’il y en avait 20 comme ça, la configuration devient vite lourde à gérer. Avec une seule et unique macro on va bien se simplifier la vie. Dans le fichier /etc/apache2/conf.d/macro.conf on écrit donc la macro suivante :
<Macro Domain $sub $domain $root>
  DocumentRoot /var/www/$root
  ServerName   $sub.$domain
  ServerAlias  $sub.$domain
  ServerAdmin  admin@$domain

  ErrorLog     /var/log/apache2/$domain_error.log
  TransferLog  /var/log/apache2/$domain_access.log
</Macro>


Vous voyez le principe. On regroupe les éléments communs aux hôtes virtuels pour les mettre dans une macro qui s’appelle Domain et qui prend 3 paramètres sub, le sous-domaine à utiliser, domain, le domaine à utiliser, et root le répertoire où se trouve les fichiers à rendre disponible sur le web.
Le fichier contenant les virtual hosts peut alors se simplifier en :
<VirtualHost [ipv6]:80 ipv4:80>
  Use Domain toto domaine.tld rep_toto
</VirtualHost>

<VirtualHost [ipv6]:80 ipv4:80>
  Use Domain titi domaine.tld rep_titi
</VirtualHost>


L’utilisation de la macro se fait avec la syntaxe très script-like Use NomMacro [paramètres]. Il faut impérativement donner tous les paramètres à la macro sans quoi la vérification de la configuration échouera.

L’exemple d’utilisation donné ici est simple mais on peut faire des choses plus complexes en utilisant des macros dans d’autres macros, etc… Il faut juste trouver la configuration qui convient le mieux pour son serveur. En tout cas je ne me séparerai plus du mod_macro que je trouve vraiment intéressant pour gérer les hôtes virtuels (chose que je trouve très ennuyante).

Tuesday 12 April 2011

Apache 2 en mode multithreadé

internet.pngVous le savez (ou pas) les installations classiques d’Apache 2 (avec PHP et MySQL bien souvent) sur Ubuntu (et même Debian) se basent sur une version bien spécifique du serveur web : la version prefork. Son comportement est donc de créer des processus (lourds) pour traiter les différents clients qui veulent accéder aux pages web. L’inconvénient c’est que la multiplication des processus pour le système d’exploitation c’est … lourd. Pour le soulager un peu, on peut utiliser une version d’Apache pas forcément ultra connue s’appelant worker. Cela permet de traiter les clients avec des threads (processus légers) et c’est particulièrement intéressant pour les processeurs récents (ou même assez vieux en fait).

Pour installer la version worker d’Apache, rien de plus simple :
# aptitude install apache2-mpm-worker

Ah ouais, mais il veut me virer le mod PHP5 ? Ça y est le voici l’inconvénient, le mod PHP5 n’est pas thread safe. On ne peut donc pas l’utiliser avec la version multithread de Apache. Mais comme PHP est quand même ultra répandu sur le web et que l’on ne peut se passer de ce magnifique blog (j’entends quelqu’un qui me dit que je devrais mettre plus de contenu pour qu’il soit magnifique), il existe tout de même une solution pour faire l’interprétation des scripts PHP.

On va utiliser la technique FastCGI. À la base CGI était utilisé pour faire du contenu dynamique sur le web avec plein de langages de programmation (Perl, C, script shell, etc…). En fait, il n’y a pas vraiment de limite de langages. FastCGI peut donc parfaitement interpréter du PHP. Pour activer cela, on installe alors 2 petits paquets :
# aptitude install libapache2-mod-fcgid php5-cgi

Si mod_fcgid n’est pas automatiquement activé dans Apache 2, on fera aussi un petit :
# a2enmod fcgid

Dans le cas où on a besoin de faire des modifications dans la configuration de PHP, on ira plus voir /etc/php5/apache2/php.ini mais plutôt /etc/php5/cgi/php.ini.

L’inconvénient c’est que, contrairement à mod_php5 pour apache2-mpm-prefork, les pages PHP ne seront pas interprétées sans modifier les différents VirtualHost qui peuvent servir des scripts PHP. Il faudra donc ajouter dans chaque directive Directory contenant désignant des répertoires avec du PHP les directives suivantes :
AddHandler fcgid-script .php
FCGIWrapper /usr/lib/cgi-bin/php5 .php
Options ExecCGI


La ligne AddHandler permet de spécifier quelle extension de fichier est à exécuter via FastCGI. FCGIWrapper donne le programme à exécuter pour traiter l’extension donnée. Et il ne faut pas oublier l’option ExecCGI sans quoi le PHP ne sera pas interprété.

Au final, cela pourra donner un VirtualHost dans le genre de celui-ci :
<VirtualHost *:80>
  DocumentRoot /var/www/mon_site

  <Directory "/var/www/mon_site">
    AddHandler fcgid-script .php
    FCGIWrapper /usr/lib/cgi-bin/php5 .php
    Options ExecCGI Indexes FollowSymLinks MultiViews
  </Directory>
</VirtualHost>


Comme vous pouvez le voir, ça peut vite être lourd si on a beaucoup de VirtualHost à changer. C’est pour ça que je vous encourage donc d’utiliser le mod_macro (merci Romain pour l’astuce) pour vous simplifier votre future administration du serveur web. Une fois tous les VirtualHost modifiés, il faudra redémarrer le serveur Apache.
# /etc/init.d/apache2 restart

Et là, si votre Apache avait l’habitude d’être un gros consommateur de ressources, il devrait se calmer.

Saturday 15 November 2008

Réalisation du paquet Debian pour notre application

Lors du billet précédent, nous avons réalisé un générateur de mot de passe en Java avec une interface GTK+. Maintenant, nous allons enfermer tout ça dans un joli paquet Debian afin de diffuser et d’installer plus facilement notre application. Nous allons aussi en profiter de l’installation du paquet pour créer une entrée dans le menu GNOME, ce qui est toujours utile et plus sympa à voir.

Continue reading...