Archives pour février, 2010

Cherokee : le serveur web qui réconcilie administrateurs et développeurs

Un serveur web rapide, léger et facilement configurable ? C’est Cherokee !

Toutes les fonctions sont présentes : TLS, FastCGI, rewrite, proxy, cache, journalisation Apache, expiration, compression, limitation du trafic … et en plus une interface web de configuration dont la simplicité est déconcertante. Cette dernière prouve son réel intérêt avec le mécanisme des règles appliquées au contenu. Des assistants sont même présents pour configurer automatiquement le support PHP, créer un hôte pour WordPress, Mailman, etc …

L’interface de configuration fonctionne dans un processus séparé, son exécution est donc indépendante et peut être arrétée à tout moment.

Voici quelques screenshots de l’interface web :

FreeBSD : RAID1 hotswap avec gestion AHCI

FreeBSD 8 gère par défaut vos disques par le driver ATA. Celui ne gère pas le hotswap disque. Si atacontrol permet bien de désactiver et débrancher un disque à chaud, la détection n’est effective qu’au prochain reboot. Pour permettre une détection à chaud, il est nécessaire d’utiliser le driver expérimental AHCI, tout en s’assurant que la gestion AHCI des disques est supportée et activée dans le BIOS.

La gestion AHCI s’appuie sur la couche CAM (déjà utilisée pour les périphériques SCSI et USB), ce qui implique un changement  de noms des disques durs. Ainsi /dev/ad0 devient /dev/ada0. La fstab est à modifier avant de redémarrer, d’autant qu’un LiveCD est nécessaire en cas d’erreur ou pour réactiver la gestion ATA. Pour éviter ces désagréments, GEOM propose comme solution les labels qui permettent de bénéficier de noms fixes pour les disques (quelque soit le mode en cours). Pour récupérer les labels de vos partitions UFS, activez l’option suivante :

# sysctl kern.geom.label.debug=1

Les labels seront alors listés au prochain boot, lesquels seront à récupérer et à placer dans la fstab. Pour la partition de swap, le label doit être créer par glabel :

# glabel label swap /dev/ad0s1b

Dans le cas d’un système déjà configuré en RAID par GEOM, les labels sont déjà configurés : GEOM les utilise implicitement. Ainsi, l’activation / désactivation de l’AHCI est transparente et un simple reboot permet de bénéficier de la gestion AHCI.

Pour rappel, voici la méthode de création d’un RAID1 sous GEOM :

# sysctl kern.geom.debugflags=16
# gmirror label -v -b round-robin gm0 /dev/ad8
# cat geom_mirror_load="YES" >> /boot/loader.conf
# ee /etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/mirror/gm0s1b      none            swap    sw              0       0
/dev/mirror/gm0s1a      /               ufs     rw              1       1
/dev/mirror/gm0s1f      /home           ufs     rw              2       2
/dev/mirror/gm0s1d      /usr            ufs     rw              2       2
/dev/mirror/gm0s1e      /var            ufs     rw              2       2
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0
# shutdown -r now
# gmirror insert gm0 /dev/ad10
# gmirror status
 Name    Status  Components
mirror/gm0  DEGRADED  ada0
                      ada1 (48%)

A présent, la gestion des AHCI peut être activée :

# cat ahci_load="YES" >> /boot/loader.conf
# shutdown -r now
# camcontrol devlist
<WDC WD2502ABYS-02B7A0 02.03B03>   at scbus2 target 0 lun 0 (ada1,pass2)
<WDC WD2502ABYS-02B7A0 02.03B03>   at scbus3 target 0 lun 0 (pass0,ada0)
<Slimtype DVD A  DS8A2S 6P5D>      at scbus5 target 0 lun 0 (cd0,pass1)

Je débranche le second disque, la pile RAID se dégrade :

(ada1:ahcich3:0:0:0): lost device
(ada1:ahcich3:0:0:0): Invalidating pack
GEOM_MIRROR: Cannot write metadata on ada1 (device=gm0, error=6).
GEOM_MIRROR: Cannot update metadata on disk ada1 (error=6).
GEOM_MIRROR: Device gm0: provider ada1 disconnected.

Une fois le disque rebranché, une détection des périphériques de masse est nécessaire (ce n’est pas automatisé) :

# camcontrol devlist
<WDC WD2502ABYS-02B7A0 02.03B03>   at scbus2 target 0 lun 0 (pass0,ada0)
<Slimtype DVD A  DS8A2S 6P5D>      at scbus5 target 0 lun 0 (cd0,pass1)
# camcontrol rescan all
Re-scan of bus 0 was successful
Re-scan of bus 1 was successful
Re-scan of bus 2 was successful
Re-scan of bus 3 was successful
Re-scan of bus 4 was successful
Re-scan of bus 5 was successful
# camcontrol devlist
<WDC WD2502ABYS-02B7A0 02.03B03>   at scbus2 target 0 lun 0 (pass0,ada0)
<WDC WD2502ABYS-02B7A0 02.03B03>   at scbus3 target 0 lun 0 (ada1,pass2)
<Slimtype DVD A  DS8A2S 6P5D>      at scbus5 target 0 lun 0 (cd0,pass1)

Le disque est à présent reconnu mais le RAID lui aussi ne se reconstruit pas automatiquement :

(ada1:ahcich3:0:0:0): Synchronize cache failed
(ada1:ahcich3:0:0:0): removing device entry
(aprobe0:ahcich3:0:0:0): SIGNATURE: 0000
ada1 at ahcich3 bus 0 target 0 lun 0
ada1: <WDC WD2502ABYS-02B7A0 02.03B03> ATA/ATAPI-8 SATA 2.x device
ada1: 300.000MB/s transfers
ada1: 239429MB (490350672 512 byte sectors: 16H 63S/T 16383C)
ada1: Native Command Queueing enabled
GEOM_MIRROR: Component ada1 (device gm0) broken, skipping.
GEOM_MIRROR: Cannot add disk ada1 to gm0 (error=22).
GEOM_MIRROR: Device gm0: rebuilding provider ada1.

Ce qui est entrepris de suite :

# gmirror forget gm0 /dev/ada1
gmirror: No such device: /dev/ada1.
# gmirror insert gm0 /dev/ada1
# gmirror status
 Name    Status  Components
mirror/gm0  DEGRADED  ada0
                      ada1 (1%)

La reconstruction RAID au final ne nécessite plus aucun redémarrage. Le driver AHCI apporte également d’autres fonctionnalités comme le support du NCQ, ce qui permet d’augmenter le débit en cas de forte charge. Pour le vérifier et obtenir des informations détaillées sur un disque, camcontrol est de rigueur :

# camcontrol identify ada0
pass0: <WDC WD2502ABYS-02B7A0 02.03B03> ATA/ATAPI-8 SATA 2.x device

protocol              ATA/ATAPI-8 SATA 2.x
device model          WDC WD2502ABYS-02B7A0
serial number         WD-WCAT1E308323
firmware revision     02.03B03
cylinders             16383
heads                 16
sectors/track         63
LBA supported         268435455 sectors
LBA48 supported       490350672 sectors
PIO supported         PIO4
DMA supported         WDMA2 UDMA6
overlap not supported

Feature                      Support  Enable    Value           Vendor
write cache                    yes    yes
read ahead                     yes    yes
Native Command Queuing (NCQ)   yes        31/0x1F
Tagged Command Queuing (TCQ)   no    no    31/0x1F
SMART                          yes    yes
microcode download             yes    yes
security                       yes    no
power management               yes    yes
advanced power management      no    no    0/0x00
automatic acoustic management  yes    yes    254/0xFE    128/0x80

Apache : empêcher l’interprétation des fichiers à extensions multiples

Pour éviter l’interprétation des fichiers à extensions multiples (par ex monimage.pl.gif) en tant que script, il est possible de forcer l’option AddHandler d’Apache à ne vérifier que la dernière extension, comme ceci :

AddHandler x-suphp-cgi   .cgi$ .pl$

La documentation ne le précise pas, mais l’extension semble bien être une regex. Ainsi le fichier monimage.pl.gif ne sera plus executé en tant que script Perl, mais affiché comme il se doit en image GIF.

Dans le cas où l’usage n’est valable que pour un seul vhost, il vaut peut être mieux se rabattre sur cette solution : http://httpd.apache.org/docs/2.2/mod/mod_mime.html#multipleext

L’effet sysadmin

Gentoo : mise à jour udev 146

Faites attention aux dernières versions d’udev car depuis la version 146, la compatibilité avec les noyaux antérieurs aux 2.6.25 est rompue. Si çà n’est pas le cas, le résultat est sans appel : votre système est incapable de booter et un joli « bloc » textuel va surgir prétextant une impossibilité de trouver le root device ! Heureusement, depuis le package udev-146-r1, un message explicite est affiché juste avant le plantage (cf le screenshot), ce qui n’était le cas du précédent … et lors de mon intervention.

On en parle ici : http://bugs.gentoo.org/292833

FreeBSD : coloriser la sortie de ls

Ajoutez dans votre fichier shell rc (~/.shrc ou autre) :

CLICOLOR="YES"
export CLICOLOR

Si vous souhaitez coloriser la sortie comme sous Linux, rajoutez celles-ci :

LSCOLORS="ExGxFxdxCxDxDxhbadExEx"
export LSCOLORS

Linux : contrôlez votre RAID software

Quelques astuces pour contrôler votre RAID sw :

# echo check > /sys/block/md3/md/sync_action
# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb1[1] sda1[0]
 128384 blocks [2/2] [UU]

md3 : active raid1 sdb3[1] sda3[0]
 40001728 blocks [2/2] [UU]
 [============>........]  check = 61.9% (24770752/40001728) finish=4.4min speed=57184K/sec

md4 : active raid1 sdb4[1] sda4[0]
 112157696 blocks [2/2] [UU]

unused devices: <none>

Pour lancer une réparation (obligatoire si le volume est dégradé) :

# echo check > /sys/block/md3/md/sync_action

Pour stopper l’une ou l’autre de ces actions :

# echo idle > /sys/block/md3/md/sync_action

FreeBSD : un MTA pratique pour les jails

Pour chaque jail, il est nécessaire de recevoir les mails (cron, periodic, etc…). Afin de préserver au mieux les ressources et éviter le recours à un vrai relais SMTP (sendmail, postfix ou autre), un MTA idéal est ssmtp (Simple SMTP Agent). Il permet de relayer tous les mails vers un SMTP, ceci par un contournement de la commande sendmail. Donc pas de démon et c’est tant mieux.

Pour l’installer :

# cd /usr/ports/mail/ssmtp
# make install
# make replace

La dernière commande va remplacer la commande sendmail par celle de ssmtp.

Au niveau de la configuration, il y a deux fichiers :

# mv /usr/local/etc/ssmtp/ssmtp.conf.sample /usr/local/etc/ssmtp/ssmtp.conf
# mv /usr/local/etc/ssmtp/revaliases.sample /usr/local/etc/ssmtp/revaliases

Pour ssmtp.conf, il faut veiller aux options suivantes :

mailhub=172.16.0.3:25
rewriteDomain=hbis.fr

La première permet d’indiquer le serveur SMTP vers qui relayer les envois de mail. Dans mon cas, c’est l’IP de ma jail SMTP. Un serveur SMTP externe peut bien sûr être utilisé  La seconde option permet de spécifier le domaine des adresses d’envoi s’il n’est pas présent,  ce qui est le cas des comptes systèmes, sous peine d’avoir un refus d’envoi.

Le second fichier revaliases permet de convertir les adresses d’envoi, bref configurer des alias, mais aussi préciser le SMTP de destination pour un mail sender donné.

Pour désactiver le démon sendmail de votre jail, n’oubliez pas de corriger votre fichier /etc/rc.conf :

sendmail_enable="NONE"

Et pour virer le nom d’utilisateur Charlie des mails envoyés par le compte root :

# pw user mod root -c ''

Nginx : rewrite rules pour le MVC d’ezComponents

Les rewrite rules nécessaires à Nginx pour faire fonctionner le composant MVC de eZComponents sont les suivantes :

server {
    listen 80;
    server_name ezmvc.my.domain;
    root /usr/local/www/ezmvc;
    index  index.php;
    location ~ "^/[^/]*\.php$" {
        set $script "index.php";
        if ( $uri ~ "^/(.*\.php)" ) {
            set $script $1;
        }

        fastcgi_pass unix:/tmp/fcgi-php.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /usr/local/www/ezmvc/$script;
        include fastcgi_params;
    }

    location / {
        rewrite "^/(?:.[^/]+/)+(stylesheets|images|javascripts|flash?)/(.*)$" "/$1/$2" break;
        rewrite "^(.*)$" "/index.php?$1" last;
    }
}

FreeBSD : jail PostgreSQL

Pour pouvoir exécuter un serveur PostgreSQL sous une jail FreeBSD, il est nécessaire d’autoriser le support de la mémoire partagée (SHM). Il convient d’activer le flag dans /etc/rc.conf :

jail_sysvipc_allow="YES"

Si cela n’est pas fait, l’initialisation de l’espace de stockage échoue de cette façon :

sql# /usr/local/etc/rc.d/postgresql oneinitdb
The files belonging to this database system will be owned by user "pgsql".
This user must also own the server process.</p>
The database cluster will be initialized with locale C.
The default text search configuration will be set to "english".
creating directory /usr/local/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 10
selecting default shared_buffers ... 400kB
creating configuration files ... ok
creating template1 database in /usr/local/pgsql/data/base/1 ... FATAL:  could not create shared memory segment: Function not implemented
DETAIL:  Failed system call was shmget(key=1, size=1622016, 03600).
child process exited with exit code 1
initdb: removing data directory "/usr/local/pgsql/data"
Haut de page