Nginx : astuces pour un hébergement mutualisé

Deux astuces dans le cadre d’un hébergement mutualisé de plusieurs sites avec Nginx.

En premier lieu, il est possible d’inclure des fichiers de configuration par l’option include. Ceci permet alors de créer un répertoire vhosts dédié aux fichiers de configuration de chaque site. Dans le fichier de configuration principal, il faut ajouter par ex :

http {
[...]
# virtual hosts
 include /usr/local/etc/nginx/vhosts/*.conf;
}

Tous les fichiers .conf du répertoire vhosts seront alors inclus. Si un vhost doit être temporairement désactivé, il suffit de changer l’extension de son fichier.

La deuxième astuce touche l’utilisation du module FastCGI. Dans chaque vhost, il faut déclarer le support FastCGI pour PHP, Perl, etc… Il est possible de limiter cette déclaration à ces lignes :

location ~ \.php$ {
 fastcgi_pass   unix:/tmp/fcgi-php.sock;
 fastcgi_index  index.php;
 include        fastcgi_params;
 }

en rajoutant la ligne suivante dans le fichier fastcgi_params :

# Virtual hosts support
fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;

RoundCube : module de gestion des vacations

RoundCube est un webmail dernier cri avec glisser-déposer, carnet d’adresses LDAP, vérificateur d’orthographe… en somme tout ce qu’il faut mais en vraiment plus beau que les autres. Il manque encore des plugins d’extension mais çà ne devrait pas tarder avec l’API prévue à cet effet pour la version 0.3.

En attendant, j’ai fait un petit module permettant de gérer un répondeur  automatique de message. L’interface est des plus simples : un onglet « Répondeur » est ajouté dans les paramètres de l’utilisateur, une case à cocher pour activer le répondeur, plus les zones de saisie pour le message et le sujet. Le module est configuré avec les requêtes SQL pour le serveur SMTP Postfix & son interface d’administration PostfixAdmin (elle même pouvant gérer les vacations). Les requêtes sont évidemment modifiables depuis le fichier de configuration du module config/vacation.inc.php.

Module vacation pour RoundCube version 0.2.2 : roundcube-module_vacation-20090528

roundcube_vacation01roundcube_vacation02

hbIRCS : version 0.2.0-UNSTABLE-20090523

Un nouveau build de développement pour hbIRCS 0.2, mon serveur IRC Java.

hbIRCS-0.2.0-UNSTABLE-20090523
- support des modes utilisateur et des modes salon (modes standards et avancés, cf RFC 2811).
- support des channels locaux et des safe channels.
- support étendu des commandes IRC client : WHO, WHOIS avec gestion de l’idle.
- paramètre de configuration du charset serveur (par défaut UTF-8).
- paramétrage complet de la gestion I/O (nombre de tâches,  recyclage des tâches, threads mini / maxi / incrément / priorité, gestion des buffers …)
- ajout d’une nouvelle implémentation du pool de threads, basée sur la classe Java ThreadPoolExecutor.

Pour tester ce build, vous pouvez essayer ce serveur : irc.hbis.fr, port 6667, salon #hbircs.

hbircs-20090524_01hbircs-20090524_02

Nginx : rewrite rules pour le CMS Joomla!

Pour utiliser les URL SEO de Joomla! sous Nginx, la configuration du virtual host est la suivante :


server {
   listen  80;
   server_name     site.fr;
   root            /opt/local/var/www/site.fr/www/html;
   index           index.php;

   location / {
      if ( !-e $request_filename ) {
         rewrite (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ /index.php last;
         break;
      }
  }

   location ~ \.php$ {
      fastcgi_pass   unix:/opt/local/var/run/nginx/fcgi-php.sock;
      fastcgi_index  index.php;
      include        fastcgi_params;
   }
}

HBIS : défaillance matérielle

Une nuit pleine de rebondissements pour le serveur HBIS : 3 plantages coup sur coup sans compter le 1er à 20 h ce dimanche. Dixit OVH : défaillance matérielle, les barrettes RAM étaient KO. Le service a été rétabli à midi après une petite bataille avec le RAID 1.

J’en ai profité pour tester le boot réseau d’OVH : le noyau rescue démarre votre serveur avec une image téléchargée par le réseau. Ce mode de démarrage vous permet de vérifier tous les filesystems et à reconstruire le RAID software. Mais le must concerne le service vKVM. L’outil vous connecte en VNC à votre serveur pour visualiser toute la séquence de boot de votre serveur comme si vous étiez devant. Cet outil est requis pour détecter tout problème lié au montage de votre partition racine ou encore un crash noyau … Bref c’est sympa, çà marche bien sous FreeBSD (et pas que sous GNU/Linux & OuinOuin) mais un petit bémol : les noms de périphériques ne sont pas identiques. Il m’a fallu saisir  manuellement la partition de boot (ce fut d’ailleurs un moment passionnant avec mon clavier).

La réinstallation n’était donc pas si loin …

vkvm1vkvm2

Java : analyser le heap d'une application

La version 1.6 de la machine Java de Sun intégre un outil permettant d’analyser le heap d’une application : jhat. Il permet par exemple de vérifier quelles sont les instances vivantes des objets dans le heap, le nombre de créations d’instances pour un object donné, un historique de création … Bref, un outil simple pour profiler un minimum son soft et éviter les messages de ce genre (c’est pour l’exemple) :

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

En premier lieu sous Mac OS X, cet outil ne fonctionne pas out of the box, il faut installer un moteur JavaScript (celui d’Apple lance une exception au lancement de jhat). Pour installer un autre moteur JS, téléchargez les 2 archives suivantes :
- JSR-223′s engines : https://scripting.dev.java.net/files/documents/4957/37593/jsr223-engines.zip
- Rhino : http://www.mozilla.org/rhino/download.html

$ sudo cp ~/Desktop/jsr223-engines/javascript/build/js-engine.jar
 /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/lib/ext/
$ sudo cp ~/Desktop/rhino1_7R2/js.jar
 /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/lib/ext/

Le nouveaux moteur JS Rhino doit à présent être listé par jrunscript :

$ /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Commands/jrunscript -q
Language EmbeddedECMAScript 1.6 implemention "Mozilla Rhino" 1.6 release 2
Language AppleScript 2.0.1 implemention "AppleScriptEngine" 1.0
Language ECMAScript 1.6 implemention "Mozilla Rhino" 1.6R7

Pour lancer l’analyse du heap d’une application, il est nécessaire de récupérer son PID par jps, pour le passer à jmap qui va dumper le heap dans un fichier. Une fois créé, on peut l’analyser avec jhat :

$ /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Commands/jps
22746 Jps
22716 Application
45737

$ /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Commands/jmap
 -dump:format=b,file=dump.dat 22716
Dumping heap to /Users/bhuisgen/dump.dat ...
Heap dump file created

$ /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Commands/jhat -J-Xmx512m dump.dat
Reading from dump.dat...
Dump file created Sun May 17 18:22:24 CEST 2009
Snapshot read, resolving...
Resolving 160010 objects...
Chasing references, expect 32 dots................................
Eliminating duplicate references................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

Rendez-vous @ http://127.0.0.1:7000 pour consulter les résultats : nombres d’instances créées, histogramme de création, et un query browser OQL qui permet de faire ses propres requêtes d’analyse (à tester absolument).

Quelques screenshots de démo :

jhat-main

jhat-instance_counts

jhat-heap_histogram

jhat-oql1

jhat-oql2

VMware Server 2 : erreur d'accès 503 avec la console Web

Suite au passage sous un noyau 2.6.28 Grsecurity/PAX (niveau de sécurité Hardened Gentoo [server]), la console d’accès Web de VMware Server est inaccessible, avec pour message d’erreur « 503 Service unavailable ». Or si pas de console, plus de serveurs virtuels !

Le problème se situe au niveau du serveur Tomcat, qui refuse de se lancer. La JVM Sun 1.5  utilisée par VMWare plante suite aux protections de PAX. Pour le vérifier :

# cd /usr/lib/vmware/webAccess/java/jre1.5.0_15/bin
# ./java -version
Killed

Pour y remédier, un header PAX doit être ajouté et le flag MPROTECT doit être désactivé sur l’ensemble des binaires :

# cd /usr/lib/vmware/webAccess/java/jre1.5.0_15/bin
# paxctl -C *
file keytool got a new PT_PAX_FLAGS program header
file kinit got a new PT_PAX_FLAGS program header
file klist got a new PT_PAX_FLAGS program header
file ktab got a new PT_PAX_FLAGS program header
file orbd got a new PT_PAX_FLAGS program header
file pack200 got a new PT_PAX_FLAGS program header
file policytool got a new PT_PAX_FLAGS program header
file rmid got a new PT_PAX_FLAGS program header
file rmiregistry got a new PT_PAX_FLAGS program header
file servertool got a new PT_PAX_FLAGS program header
file tnameserv got a new PT_PAX_FLAGS program header
file unpack200 got a new PT_PAX_FLAGS program header
# paxctl -m *

Par exemple, pour le binaire java, les flags doivent être fixés de cette façon :

# paxctl -v java
PaX control v0.5
Copyright 2004,2005,2006,2007 PaX Team <pageexec@freemail.hu>

- PaX flags: -----m-x-e--
    MPROTECT is disabled
    RANDEXEC is disabled
    EMUTRAMP is disabled

Ceci vaut depuis la version 1.5 de Java.

The goal of MPROTECT is to help prevent the introduction of new executable
code into the task’s address space. This is accomplished by restricting the
mmap() and mprotect() interfaces.

The restrictions prevent
- creating executable anonymous mappings
- creating executable/writable file mappings
- making an executable/read-only file mapping writable except for performing
relocations on an ET_DYN ELF file (non-PIC shared library)
- making a non-executable mapping executable

Présentation de PAX :

http://www.unixgarden.com/index.php/securite/le-fonctionnement-de-pax-protection-against-execution

HBIS : mise à jour du serveur

Le serveur HBIS a été mis à jour sous FreeBSD 7.2-STABLE. Noyau estampillé HBIS pour l’occasion !

FreeBSD 7.2-STABLE (HBIS) #1: Mon May 11 14:13:38 CEST 2009

L’ensemble des services est opérationnel.

Linux : historique des distributions

Un historique graphique des distributions GNU/Linux :

http://upload.wikimedia.org/wikipedia/commons/e/ed/LinuxDistroTimeline.png

Java : analyse de code et détection de bugs

S’il y a bien un logiciel à conserver dans sa boite à outils, il s’agit d’un analyseur de code. En phase de stabilisation d’un de mes logiciels, j’en ai profité pour passer un coup de FindBugs!, l’analyseur et détecteur de bugs open-source pour Java. Il opère directement sur le byte-code à la recherche d’erreurs de programmation et si les sources sont disponibles, il marque son  endroit exact. Il dispose de son propre frontend graphique, mais un plugin Eclipse existe. L’intégration à un projet peut également se faire par le biais d’une tâche Ant.

Je me suis donc retrouvé avec à peu près 80 problèmes tous types confondus (sur les 40 000 lignes du projet, je trouve çà honnête), sachant qu’il y a toujours des faux-positifs (au nombre de 60). Pêle-mêle, il a réussi à détecter :

  • des nettoyages de ressources inutiles dans des blocs de traitement d’exception.
  • des itérateurs inadaptés par exemple lors d’une itération de Map, en me conseillant l’utilisation du bon (screenshot 1).
  • des problèmes de synchronisation d’ accès concurrents.
  • un bloc synchronized vide, dans mon cas un faux-positif (screenshot 2).
  • un appel à wait () hors d’une boucle d’itération, idem faux-positif.
  • l’utilisation de variables inutiles.

Bref, l’outil relève des faux-positifs – c’est quelque peu obligatoire – mais son utilité n’en n’est pas atteinte !

Site officiel : http://findbugs.sourceforge.net/
Source de téléchargement du plugin Eclipse : http://findbugs.cs.umd.edu/eclipse/
Autres outils du même type : MPD, CheckStyle…

findbugs_01findbugs_02

Haut de page