11/mai/2012 Posté dans Software | 2 commentaires 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
4/mai/2012 Posté dans FreeBSD | 0 commentaire 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 2/mai/2012 Posté dans FreeBSD, Nginx | 0 commentaire 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:
- l’adresse email associé à votre compte OpenPhoto
- 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:
- une base de donnée de type MySQL (que l’on a préalablement créer dans le chapitre précédant)
- un stockage local des photos (on peut noter qu’il est possible de mixer stockage local et Dropbox)
- 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 ?
2/mai/2012 Posté dans MySQL | 0 commentaire 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