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"

Sphider : patch pour connexion SQL non persistante

Sphider est un indexeur et un moteur de recherche PHP, intégrable idéalement dans de petits sites Web. J’ai remarqué que l’outil utilisait une connexion SQL persistante, ce qui est problématique dans le cas d’un serveur mutualisé.

Je propose donc ce patch chargé de gérer les connexions SQL non persistantes (option de configuration SQL_PCONNECT dans le fichier settings/database.php) :

sphider-1.3.5 # cat settings/database.php
<?php
define ('SQL_DB', 'sphider');
define ('SQL_USER', 'root');
define ('SQL_PASS', '');
define ('SQL_HOST', 'localhost');
define ('SQL_TABLE_PREFIX', '');
define ('SQL_PCONNECT', 0);

$mysql_table_prefix = SQL_TABLE_PREFIX;
?>

Le patch est à appliquer sur la version 1.3.5 de Sphider :

sphider-1.3.5 # patch -p1 < patch-sphider-sql_connect.sql
patching file admin/admin.php
patching file admin/auth.php
patching file admin/install.php
patching file admin/spider.php
patching file include/commonfuncs.php
patching file include/js_suggest/suggest.php
patching file search.php
patching file settings/database.php

patch-sphider-1.3.5-sql_connect.gz

Roundcube : plugin vacation 0.3.2

Quelques corrections mineures ont été apportées. Merci à Achim J.Latz et Zanda pour leurs rapports.

Plugin : rc-vacation-0.3.2.tar.gz
Dépôt Git : http://github.com/bhuisgen/rc-vacation

Réseau : DNS publics Google

nameserver 8.8.8.8
nameserver 8.8.4.4

Réseau : géolocalisation de votre connexion

Pour géolocaliser votre connexion Internet (au niveau du DSLAM de votre FAI), une commande sympa :

$ curl -s "http://www.geody.com/geoip.php?ip=$(curl -s icanhazip.com)" | sed '/^IP:/!d;s/<[^>][^>]*>//g'
IP: XX.XX.XX.XXX Location: Munshausen, Luxembourg   (Visual Online S.A.)

Linux : trouver la date d'installation d'un système

Une petite astuce pour obtenir la date d’installation d’un système d’exploitation Linux grâce à la commande dumpe2fs :

# dumpe2fs /dev/sda1 | grep 'created'
dumpe2fs 1.41.9 (22-Aug-2009)
Filesystem created:       Fri Jan 27 23:35:05 2006

Il est également possible d’obtenir la date du dernier et du prochain filecheck :

# dumpe2fs /dev/sda1|grep check
dumpe2fs 1.41.9 (22-Aug-2009)
Last checked:             Sat Nov 21 04:04:03 2009
Next check after:         Thu May 20 05:04:03 2010

MySQL : gestion du cache de requêtes

Le cache de requêtes de MySQL permet d’optimiser le temps d’exécution des requêtes en lecture, à savoir les SELECT. Son efficacité est d’autant plus grande que les requêtes sont fréquentes et les résultats invariants, ce qui est majoritairement le cas pour les sites Web. Son fonctionnement est simple : la sortie texte de la requête et des résultats des requêtes est mise en cache et le serveur les récupère en cas de requête identique (comparaison caractère à caractère). En cas de modification des données,  tous les résultats associés aux tables cache sont nettoyés, ce qui entraîne sur le long terme une fragmentation des blocs mémoire du cache.

Pour vérifier que le cache est activé et ses différents paramètres de configuration :

mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 33554432 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
6 rows in set (0.00 sec)

Ainsi, il est parfois utile de désactiver la mise en cache :

  • pour une requête spécifique :
mysql> SELECT SQL_CACHE id, name FROM customer;
  • pour une connexion (session client) :
mysql> SET SESSION query_cache_type = OFF;

Si query_cache_type est fixée à DEMAND (valeur 2), alors la mise en cache est forcée au niveau du serveur (GLOBAL) ou client (SESSION) :

mysql> SET GLOBAL query_cache_type=2;
mysql> SET SESSION query_cache_type=2;

Un script de maintenance journalier peut se charger de défragmenter le cache :

mysql> FLUSH QUERY CACHE;

ou encore le vider :

mysql> RESET QUERY CACHE;

Postfix : virtual alias lookup problem

Un problème courant sur les serveurs SMTP Postfix avec gestion virtuelle des utilisateurs avec backend MySQL, concerne la présence de nombreux warnings dans le log comme ceci :

Feb  5 03:02:19 srv07 postfix/cleanup[22193]: warning: 7C6E95117E: virtual_alias_maps map lookup problem for user@domain.fr

Pour le corriger, il suffit de corriger la requête SQL des alias mail :

query = SELECT goto FROM alias WHERE address=CONVERT('%s' USING latin1) AND active = '1
Haut de Page