search
top

Mise en place de Monit

Monit a pour fonction de « surveiller » service et/ou les ressources système et d’exécuter une ou plusieurs actions en fonction de condition. Par exemple, il peut redémarrer Nginx si celui ci ne répond plus.

Configuration de base épuré

set daemon  60
set logfile syslog facility log_daemon

## Interface web de monit
#set httpd port 2812 and
#     allow login:motdepasse

include /etc/monit/conf.d/*

Configuration des services

Dans /etc/monit/conf.d/, j’y ai placé un fichier de configuration par service :

apache2

check process apache with pidfile /var/run/apache2.pid
    start program = "/etc/init.d/apache2 start"
    stop program  = "/etc/init.d/apache2 stop"
    if children > 149 then restart
    if totalmem > 4096 MB for 5 cycles then restart
    if 3 restarts within 5 cycles then timeout

clamd

check process clamd with pidfile /var/run/clamav/clamd.pid
   group clamav
   start program = "/etc/init.d/clamav-daemon start"
   stop  program = "/etc/init.d/clamav-daemon stop"
   if failed unixsocket /var/run/clamav/clamd.ctl then restart
   if 5 restarts within 5 cycles then timeout

dovecot

check process dovecot with pidfile /var/run/dovecot/master.pid
   group dovecot
   start program = "/etc/init.d/dovecot start"
   stop  program = "/etc/init.d/dovecot stop"
   if failed host 127.0.0.1 port 143 protocol imap then restart
   if failed host 127.0.0.1 port 993 type tcpssl sslauto protocol imap then restart
   if 5 restarts within 5 cycles then timeout

freshclam

check process freshclam with pidfile /var/run/clamav/freshclam.pid
   group clamav
   start program = "/etc/init.d/clamav-freshclam start"
   stop  program = "/etc/init.d/clamav-freshclam stop"
   if 5 restarts within 5 cycles then timeout

mysql

check process mysql with pidfile /var/lib/mysql/mysql.pid
   group mysql
   start program = "/etc/init.d/mysql start"
   stop program = "/etc/init.d/mysql stop"
   if failed host localhost port 3306 then restart
   if 5 restarts within 5 cycles then timeout

named

check process named with pidfile /var/run/named/named.pid
 start program = "/etc/init.d/bind9 start"
 stop program = "/etc/init.d/bind9 stop"
 if failed host 127.0.0.1 port 53 type tcp protocol dns then restart
 if failed host 127.0.0.1 port 53 type udp protocol dns then restart
 if 5 restarts within 5 cycles then timeout

postfix

check process postfix with pidfile /var/spool/postfix/pid/master.pid
   group mail
   start program = "/etc/init.d/postfix start"
   stop  program = "/etc/init.d/postfix stop"
   if failed host localhost port 25 protocol smtp then restart
   if 5 restarts within 5 cycles then timeout

sshd

check process sshd with pidfile /var/run/sshd.pid
   start program  "/etc/init.d/ssh start"
   stop program   "/etc/init.d/ssh stop"
   if failed port 22 protocol ssh then restart
   if 5 restarts within 5 cycles then timeout

D’apres Google, la France serait le centre du monde.

Concernant le déploiement d’IPv6 en tout cas, ci-dessous la carte :

Je vous encourage à aller directement consulter cette carte sur la page des statistiques IPv6 maintenue par Google: http://www.google.com/intl/en/ipv6/statistics/. Vous pourrez ainsi voir pour chaque pays les chiffres précis.

Réorganiser la liste des extensions PHP

Il m’est arrivé que php segfault (plante) sans raison apparente et sans logger aucune information, le script ci-dessous réorganise l’ordre dans lequel les modules sont chargé.

#!/bin/sh

# =============================================================
# Fix php/extensions.ini order
#
# Script based on the idea and information(s) of
# - http://www.pingle.org/2007/09/22/php-crashes-extensions-workaround
# - http://nerdstock.org/php_extensions
#
# Please copy your original php/extensions.ini to a save place before
# running this script!
#
# There is no guaranty the script is working for you or don't damage
# your system. Use at own Risk!
#
# 2011-04-03 olli hauer
#
# License: BSD
#  http://www.freebsd.org/copyright/freebsd-license.html

INI=/usr/local/etc/php/extensions.ini

EXT="session.so fileinfo.so crack.so ssh2.so imagick.so ldap.so
    simplexml.so dba.so ctype.so apc.so ftp.so mbstring.so tokenizer.so
    filter.so pgsql.so gmp.so mcrypt.so tidy.so xmlwriter.so mhash.so gd.so
    ncurses.so readline.so gettext.so iconv.so dbase.so calendar.so exif.so
    zlib.so curl.so mailparse.so xmlrpc.so bz2.so sysvmsg.so pdf.so openssl.so
    ming.so dom.so hash.so xmlreader.so gnupg.so bcmath.so pcre.so xsl.so
    wddx.so memcache.so soap.so spl.so sqlite.so recode.so pdo.so pdo_mysql.so
    pdo_sqlite.so mysqli.so mysql.so imap.so sockets.so pspell.so xml.so"

if [ ! -e ${INI} ] ; then
    echo "cannot find ${INI}"
    exit 1
fi

# cleanup previous run
[ -e ${INI}.new ] && rm -f ${INI}.new
cp -f ${INI} ${INI}.work

for e in ${EXT}; do
    if egrep -q "^extension=${e}" ${INI}.work ; then
        echo extension=${e} >> ${INI}.new
        sed -i '' -e "/${e}/d" ${INI}.work
    fi
done

if [ -s ${INI}.work ]; then
    echo "; additional extension(s) not known by $(basename $0)" >> ${INI}.new
    # sybase_ct needs to be loaded last.
    grep ^extension ${INI}.work | grep -v sybase_ct.so >> ${INI}.new
    grep ^extension=sybase_ct.so ${INI}.work >> ${INI}.new
    AE=1
fi
[ -e ${INI}.work ] && rm -f ${INI}.work
if cmp -s ${INI} ${INI}.new ; then
    echo "No changes found, remove ${INI}.new"
    rm -f ${INI}.new
    AE=0
fi

if [ ${AE} -ne 0 ]; then
cat << _EOF
==============================
New INI is saved as ${INI}.new

Additional extension(s) not known by $(basename $0)
are added to the end of new INI file.

Please review the new INI, and replace it on your own!
    Do some Basic tests:
    php -V
    php -m
    php -i
    apachectl graceful
    ...

_EOF
fi

cat << _EOF
If the segfault issue is not gone, or you cannot find the issue
    - ask on the ports@ mailing list
or
    - open a PR:
    Synopsys: lang/php5 Segmentation fault.
    Additional try debugging with command:
    gdb php ./php.core

http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/debugging.html

_EOF

Installer OpenPhoto sur ça FreeBSD

OpenPhoto propose d’héberger dans un « cloud » vos photos, permettant ainsi un accès dématérialisé (plus besoin d’apporter sa clé USB pour montrer les photos de vacances à ses parents/amis).

OpenPhoto propose pour cela deux solutions:

  • un service en ligne proposant de gérer vos photos (importation, catégories, tag, applications smartphones, API…) mais en les hébergeant dans votre « cloud » (Dropbox ou votre espace de stockage Amazon S3 et prochainement Google Drive).
  • une version communautaire et libre permettant d’auto-héberger son propre serveur. Cette version propose en plus un stockage local des photos (sans passer par Dropbox ou Amazon S3).

C’est sur cette deuxième configuration que nous allons nous pencher dans ce billet en proposant une procédure d’installation et de configuration de OpenPhoto sur une machine FreeBSD 9.0 avec NGinx , PHP-FPM et MySQL.

Préparation de l’installation

Je pars sur le principe ou vous avez une FreeBSD sur laquelle Nginx et PHP-FPM sont déjà installé.

Compilation de Nginx

  • HTTP_MODULE
  • HTTP_CACHE_MODULE
  • HTTP_GZIP_STATIC_MODULE
  • HTTP_REWRITE_MODULE
  • HTTP_UPLOAD_MODULE
  • HTTP_UPLOAD_PROGRESS
cd /usr/ports/www/nginx
make config install clean distclean

Compilation de PHP

  • CLI
  • FPM
  • SUHOSIN
  • MULTIBYTE
  • MAILHEAD
cd /usr/port/lang/php5-extentions
make config install clean distclean

Compilation des extentions PHP

  • BZ2
  • CALENDAR
  • CTYPE
  • CURL
  • DOM
  • FILEINFO
  • FILTER
  • GD
  • HASH
  • ICONV
  • JSON
  • MBSTRING
  • MCRYPT
  • OPENSSL
  • PDF
  • PHAR
  • POSIX
  • SESSION
  • SIMPLEXML
  • TOKENIZER XML
  • XMLREADER
  • XMLWRITER
  • XSL
  • ZLIB
cd /usr/port/lang/php5-extentions
make config install clean distclean

Dépendance Optionnel

  • net/pecl-oauth
  • graphics/pecl-imagick
  • graphics/exiftran

imagick/ImageMagick est en faite obligatoire, car GD2 ne fonctionne pas correctement avec OpenPhoto.

Installation de OpenPhoto

On créé ensuite un répertoire dans notre serveur Web (/usr/local/www) et on télécharge la dernière version de la version communautaire (libre) de OpenPhoto:

git clone git://github.com/openphoto/frontend.git /usr/local/www/openphoto

Puis on prépare l’arborescence:

mkdir /usr/local/www/openphoto/src/userdata
mkdir /usr/local/www/openphoto/src/html/photos
mkdir /var/www/openphoto/src/html/assets/cache
chown www /usr/local/www/openphoto/src/userdata
chown www /usr/local/www/openphoto/src/html/photos
chown www /var/www/openphoto/src/html/assets/cache

Enfin on génère le fichier de configuration Nginx /usr/local/etc/nginx/sites-enabled/openphoto pour le site OpenPhoto (à adapter également à votre configuration, notamment au niveau du server_name):

server {
    listen 80;
    server_name openphoto.mondomaine.com;
    root /usr/local/www/openphoto/src/html;
    index  index.php;
    client_max_body_size 25M;
    default_type text/html;
    charset utf-8;
    if (!-e $request_filename) {
        rewrite ^/([^?]*)(\?+([^?]*))*$ /index.php?__route__=/$1&$3 last;
    }
    # PHP scripts -> PHP-FPM server listening on 127.0.0.1:9000
    # Check cache and use PHP as fallback.
    location ~* \.php$ {
                 try_files $uri =404;
                 fastcgi_pass 127.0.0.1:9000;
                 fastcgi_index index.php;
                 include fastcgi_params;
         fastcgi_ignore_client_abort off;
                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    # Global restrictions configuration file.
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
    location ~ \.ini$ {
        deny all;
        access_log off;
        log_not_found off;
    }
    add_header Cache-Control "max-age=315360000";
    # Mise ne cache des ressources statiques
    location ~* ^.+\.(jpg|jpeg|gif|css|png|js|xml)$ {
        expires 30d;
        access_log off;
    }
}

On redémarre Nginx pour prendre en compte le site:

/usr/local/etc/rc.d/nginx restart

Puis on crée une nouvelle base de donnée MySQL. Notez sur une feuille, le nom de la base (openphoto), le nom de l’utilisateur (openphoto) et le mot de passe associé (openphotomdp2012):

# mysql -u root -p
Enter password:
mysql> create database openphoto;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON openphoto.* TO "openphoto"@"localhost" IDENTIFIED BY "openphotomdp2012";
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye

Configuration initiale de OpenPhoto

La suite de la configuration se fera à partir d’un navigateur Web, plus besoin de la ligne de commande :)  .

On doit dans un premier temps créer un compte sur le site OpenPhoto (même si on utilise pas la version en ligne et seulement une version auto-hébergé). Une fois le mail de confirmation reçu et la confirmation effectué, vous pouvez poursuivre l’installation en vous rendant à l’URL:http://openphoto.mondomaine.com (remplacer mondomaine.com par votre domaine que vous avez configurez dans le fichier de configuration NGinx). Si vous n’avez pas de domaine, il est possible de passer directement par l’adresse IP de votre machine.

Vous devez arriver sur la page suivante:

On entre:

  1. l’adresse email associé à votre compte OpenPhoto
  2. on laisse le thème par défaut et on clique sur « Continue to step 2″

On passe à la deuxième étape de l’installation:

On sélectionne:

  1. une base de donnée de type MySQL (que l’on a préalablement créer dans le chapitre précédant)
  2. un stockage local des photos (on peut noter qu’il est possible de mixer stockage local et Dropbox)
  3. on passe à la troisième et dernière étape

Elle permet de configurer notre base de donnée MySQL (reprendre votre petite feuille…):

A la fin de cette procédure, votre serveur OpenPhoto est prêt !

Prise en main et premières impressions

La première chose à faire est d’importer quelques photos. On peut utiliser la page Upload qui propose une importation par Drag & Drop (ou sélection plus classique dans le gestionnaire de fichiers) ou bien l’application dédiée de votre SmarthPhone (Android et iPhone). Les images sont téléchargés sur votre serveur avec une très élégante barre de progression. On note au passage qu’OpenPhoto utilise les dernières technologies HTML5.

On peut ensuite éditer les images en y ajoutant une description, des tags, des coordonnées GPS, des droits (public ou privé) et une licence. Ces informations sont bien sûr récupérées automatiquement si elles sont présentes dans les méta-données du fichier.

OpenPhoto permet de créer des groupes d’utilisateurs ayant des droits sur certaines photos. Par exemple, si vous créez un groupe Famille, alors il sera possible de classer vos photos familiales dans ce groupe afin qu’elles ne soient visibles que par vos proches. Pour grouper vos photos dans des groupes, le plus simple est d’aller dans le menu Manage, de sélectionner les photos en question (par un simple clic sur le bouton pin) puis de cliquer sur le bouton « Batch edit » et enfin de séléctionner le groupe.

Mes premières impressions sont très bonnes. OpenPhoto est rapide, stable. Le seul problème que j’ai rencontré est au niveau de l’affichage de la Gallery ou les photos sont déformées. Je vais essayer de le pousser un peu en important un grand nombre d’images (je ferai une màj du billet).

On sent une grande marge de manoeuvre au niveau des fonctionnalités proposées. Il est d’ailleurs possible de voter avec la communauté pour influencer la roadmap du logiciel sur les futures fonctions. J’aime le fait qu’OpenPhoto se concentre uniquement sur la gestion des images, contrairement à OwnCloud dont j’avais parlé dans un précédent billet.

Que pensez-vous de ce genre de service ?

Êtes vous prêts à franchir le pas et d’auto-héberger vos photos sur une de vos machines ?

Configuration du Timezone par connections

Lorsque vous voulez définir le fuseau horaire lors d’une connexion MySQL, il se peut que vous ailler les erreurs suivante lorsque vous définissez le fuseau horaire :

mysql> SET time_zone = 'Europe/Paris';
ERROR 1298 (HY000): Unknown or incorrect time zone: 'Europe/Paris'

Pour cela, il faut importer les fuseaux horaire système dans la base MySQL avec la commande mysql_tzinfo_to_sql:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -p mysql

« Articles précédents

top