Catégories
Nagios Open-source Planet-libre Reseau Web

Superviser PHP-FPM avec Nagios ou Shinken

Vous savez que j’ai un faible pour le couple Nginx / PHP-FPM que je trouve à la fois léger, rapide et simple à administrer. Suite à un message d’un follower (@JulSa_ pour ne pas le citer), je me suis intéressé à la supervision du process PHP-FPM depuis mon serveur de supervision Shinken (mais la procédure suivante fonctionne également avec Nagios).

Petite introduction

Pour superviser PHP-FPM, mieux vaut comprendre comment il fonctionne. PHP-FPM est une implémentation du langage PHP proposant, à votre serveur Web, une interface basée sur FastCGI. Contrairement à une interface CGI classique, FastCGI permet d’optimiser le nombre, la gestion et les caractéristiques des processus PHP en attente des requêtes venant de votre serveur Web.

Ma première réponse au message de @JulSa_ a été: « tu n’as qu’à surveiller si le processus est bien lancé sur ton serveur ». Bien que cette solution soit possible elle est insuffisante. En effet, comme l’on vient de le voir, l’interface FastCGI de PHP-FPM permet d’optimiser le chargement des processus en mémoire et sur certaines configuration, un fonctionnement « normal » doit se caractériser par la présence d’au moins 5 processus PHP-FPM. On se rend compte qu’il va falloir utiliser une autre méthode si l’on veut obtenir une supervision plus fine.

La solution: check_phpfpm_status

En cherchant sur la toile on tombe rapidement sur le plugin check_phpfpm_status (page officielle sur GitHub) qui propose d’utiliser les informations remontées directement par PHP-FPM (qui est quand même le mieux placé pour dire comment il va…) à travers son URL de statut.

Configuration de votre serveur à superviser

Si vous avez une installation par défaut de PHP-FPM, il y a de forte chance que cette URL de statut ne soit pas activée. Nous allons donc dans un premier temps configurer PHP-FPM et NGinx pour qu’ils répondent à cette URL.

La configuration de PHP-FPM se fait à travers le fichier /etc/php5/fpm/pool.d/www.conf (out tout autre pool utilisé par votre serveur) en éditant la ligne suivante:

pm.status_path = /status

Pour Nginx, il faut ajouter la cible /status et la rediriger vers PHP-FPM en ajoutant la section suivante à votre configuration (par exemple /etc/nginx/sites-enabled/default-site):

# PHP-FPM Status
location /status {
                 fastcgi_pass   127.0.0.1:9000;
                 fastcgi_index  index.php;
                 include fastcgi_params;
                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Note: cette configuration part sur le principe ou les processus PHP-FPM écoute sur le port 9000 (port TCP par défaut)

On doit ensuite relancer Nginx et PHP-FPM:

sudo service php5-fpm restart
sudo service nginx restart

Puis tester que votre serveur répond bien à l’URL: http://votreserveur.com/status

Installation de check_phpfpm_status sur votre serveur de supervision

On peut maintenant passer à la configuration de votre serveur de supervision (Nagios ou Shinken).

La première étape est de récupérer le script et de l’installer:

cd /tmp
wget https://raw.github.com/regilero/check_phpfpm_status/master/check_phpfpm_status.pl
chmod a+x check_phpfpm_status.pl

Sur ma configuration (Debian 6 + Shinken), j’ai dû éditer le script pour remplacer la ligne:

use lib « /usr/local/nagios/libexec »;

par

use lib « /usr/local/shinken/libexec »;

On copie ensuite le script dans le répertoire des plugins de Nagios/Shinken:

sudo cp check_phpfpm_status.pl /usr/local/shinken/libexec/

Il est possible de tester le script en ligne de commande:

$ /usr/local/shinken/libexec/check_phpfpm_status.pl -H votreserveur.com -u /status

PHP-FPM OK - www, 0.070 sec. response time, Busy/Idle 1/2, (max: 2, reached: 0), ReqPerSec 0.3, Queue 0 (len: 128, reached: 0)|Idle=2;Busy=1;MaxProcesses=2;MaxProcessesReach=0;Queue=0;MaxQueueReach=0;QueueLen=128;ReqPerSec=0.312155

Configuration de Nagios/Shinken pour surveiller PHP-FPM

La dernière étape consiste à configurer votre serveur de supervision en y intégrant ce nouveau plugin. Il y a plein de méthode possible pour cette étape.

Fichier commands.cfg:

### PHP-FPM
define command{
        command_name    check_php_fpm
        command_line    $USER1$/check_phpfpm_status.pl -H $HOSTADDRESS$ -s $ARG1$ -u $ARG2$ -w $ARG3$ -c $ARG4$
}

On voit donc que le service va prendre 3 paramètres:

  • ARG1: le nom d’host sous lequel votre serveur Web répond (par exemple votreserveur.com)
  • ARG2: l’url de status sous laquelle le serveur va répondre (par exemple /status)
  • ARG2: les 3 valeurs de PHP-FPM (MIN_AVAILABLE_PROCESSES,PROC_MAX_REACHED,QUEUE_MAX_REACHED, séparés par des virgules) qui vont déclencher une alarme WARNING
  • ARG3: les 3 valeurs de PHP-FPM (MIN_AVAILABLE_PROCESSES,PROC_MAX_REACHED,QUEUE_MAX_REACHED, séparés par des virgules) qui vont déclencher une alarme CRITICAL

Les 3 valeurs représentent:

  • MIN_AVAILABLE_PROCESSES: Working with the number of available (Idle) and working process (Busy).
  • PROC_MAX_REACHED: the fpm-status report will show us how many times the max processes were reached sinc start, this script will record how many time this happended since last check, letting you fix thresolds for alerts
  • QUEUE_MAX_REACHED: the php-fpm report will show us how many times the max queue was reached since start, this script will record how many time this happended since last check, letting you fix thresolds for alerts

Une valeur négative (-1) permet d’ignorer le paramètre.

Par exemple, l’appel à la commande suivante:

./check_phpfpm_status.pl -H votreserveur.com -s votreserveur.com -u /status -w 1,-1,-1 -c 0,2,5

va déclencher une alarme CRITICAL si vous avez 0 processus PHP-FPM ou si vous avez atteint le nombnre maximum de processus 2 fois depuis le dernier check ou bien si vous avez atteint 5 fois la taille maximale de la queue. Une alarme de type WARNING sera émise si il n’y a qu’une seul processus.

On déclare enfin le service de check sur la machine à surveiller:

define service {
        use generic-service
        host_name votreserveur.com
        service_description PHP_FPM
        check_command check_php_fpm!votreserveur.com!/status!1,-1,-1!0,2,5    
}

Le résultat:

A vos configurations 🙂

Catégories
Image Musique Open-source Planet-libre Video Web

Migrer OwnCloud vers la version 4.0.1

Voici une petite procédure « quick and dirty » pour migrer votre installation OwnCloud X (X=3 ou 4.0.0) vers OwnCloud 4.0.1.  En plus des classiques corrections de bugs, cette nouvelle version apporte notamment les fonctions suivantes:

  • le chiffrement et la gestion en version des fichiers
  • la possibilité d’utiliser le glisser-déposer pour uploader les fichiers à partir de l’interface Web
  • le partage de calendrier (via CalDAV)
  • la visualisation des fichiers OpenOffice directement dans l’interface Web

Si vous voulez une procédure d’installation détaillé de OwnCloud 4, vous pouvez suivre ma procédure pour la version 3 (valable aussi pour la version 4.0.1 à quelques adaptations près) disponible ici.

De OwnCloud 3 vers OwnCloud 4… ou 5 !

Pour les plus aventureux, il est possible de directement tester la version de développement (HEAD) de OwnCloud (actuellement en version 5). Pour cela il faut télécharger le projet directement depuis le Git officiel (hébergé sur Gitorious):

sudo git clone git://gitorious.org/owncloud/owncloud.git /var/www/owncloud4

Si vous préférez utiliser la version 4.0.1 stable, alors on télécharge l’archive sur le site officiel:

wget http://download.owncloud.org/releases/owncloud-4.0.1.tar.bz2
tar -xjf ./owncloud-4.0.1.tar.bz2
sudo mv owncloud /var/www/owncloud4

A partir de là, on peut procéder à la migration:

sudo cp -R /var/www/owncloud/config/* /var/www/owncloud4/config/
sudo cp -R /var/www/owncloud/data /var/www/owncloud4
sudo chown -R www-data:www-data /var/www/owncloud4
sudo mv /var/www/owncloud /var/www/owncloud3 ; sudo mv /var/www/owncloud4 /var/www/owncloud

Note: attention, cette procédure copie l’intégralité du répertoire et donc de vos données d’un  répertoire vers un autre… prévoir un espace disque suffisant.

Vous pouvez ensuite tester votre serveur OwnCloud pour voir si tout c’est passé correctement. Si c’est le cas, vous pouvez supprimer la version 3.0:

sudo rm -rf /var/www/owncloud3

Installation du client Linux

Cette nouvelle version intègre également la possibilité de télécharger depuis l’interface Web un client lourd pour votre machine GNU/Linux.

En fait, ce bouton télécharge simplement vers le site officiel qui explique la procédure à suivre selon votre distribution. Par exemple sous Ubuntu 12.04:

sudo sh -c "echo 'deb http://download.opensuse.org/repositories/isv:ownCloud:community/xUbuntu_12.04/ /' >> /etc/apt/sources.list.d/owncloud-client.list"
sudo apt-get update
sudo apt-get install owncloud-client

Au premier lancement, l’URL de votre serveur OwnCloud ainsi que le couple login/password vous seront demandé.

Par défaut, le client va partager un répertoire ~/ownCloud mais il est bien sur possible d’en choisir d’autres (par exemple ~/Dropbox :)). Il sera nommé sous l’alias clientsync dans votre interface Web OwnCloud.

Conclusion

Cette nouvelle version de OwnCloud devient une alternative vraiment sérieuse aux solutions alternatives et non libres comme Dropbox ou Google Drive. Le test grandeur nature que je suis en train de mener me fera peut être complètement basculer vers ce cloud libre.

Et vous déjà migré ?

Catégories
Open-source Planet-libre Web

Auto-héberger son service Web de partage de fichiers

L’échange direct de gros fichiers sur le Web, c’est à dire sans installer de client externe type FTP et en utilisant uniquement le protocole HTTP, oblige les utilisateurs à passer par des services en ligne comme Free Upload (gratuit mais avec une limite à 1 Go par fichier), YouSendIt (limite à 10 Go mais payant) ou encore les Dropbox et Google Drive (limite d’environ 300 Mo quand on passe par l’interface Web). C’est à dire des solutions propriétaires et qui peuvent regarder et exploiter les fichiers partagés.

Nous allons donc dans ce billet voir comment auto-héberger un service équivalent à partir de solutions libres. J’ai délibérément écarté les solutions de type « cloud » comme OwnCloud qui sont un peu trop lourdes, à mon goût, pour ce genre de besoin.

La liste des logiciels étudiés est la suivantes:

Au passage, merci à mes followers pour toutes ces bonnes pistes.

Jyraphe

Avec ce nom, on pouvait craindre un développement « usine à gaz » en Java (troll inside). C’est loin d’être le cas. Ce logiciel me semble effectivement le plus adapté à mon besoin. C’est pour cela que je l’ai positionné en début de billet, pour les plus pressés.

Développé en PHP, il se base sur la philosophie « Getting Real »: faire peu de chose mais le faire bien.  Cela se retrouve également dans la simplicité de mise en place. Nul besoin de base de donnée MySQL ou de module spécifique. Seul un serveur Web (Apache ou autres) avec le support de PHP est nécessaire au fonctionnement de Jyraphe.

Installation de Jyraphe

L’installation est des plus simple. Par exemple, sur une distribution Debian:

cd /tmp
wget http://download.gna.org/jyraphe/jyraphe-0.5.tar.gz
tar zxvf jyraphe-0.5.tar.gz
sudo mv jyraphe/pub /var/www/jyraphe
sudo chown -R www-data:www-data /var/www/jyraphe

On doit ensuite créer:

  • un fichier vide /var/www/jyraphe/lib/config.local.php avec les droits en écriture pour l’utilisateur www-data. C’est dans ce fichier que le script d’installation va régler les paramètres
  • un répertoire /var/www/jyraphe/var-AzErT2012/ qui contiendra vos fichiers (remplacer AzErT2012 par un nom de votre choix)

En saisissant les commandes suivantes:

sudo touch /var/www/jyraphe/lib/config.local.php
sudo chown www-data:www-data /var/www/jyraphe/lib/config.local.php
sudo chmod u+w /var/www/jyraphe/lib/config.local.php

sudo mkdir /var/www/jyraphe/var-AzErT2012
sudo chown -R www-data:www-data /var/www/jyraphe/var-AzErT2012
sudo chmod -R u+w /var/www/jyraphe/var-AzErT2012

Il ne reste plus qu’à lancer le script d’installation: http://votreserveur.com/jyraphe/install.php

On finalise l’installation en protégeant le fichier de configuration:

sudo rm /var/www/jyraphe/install.ph
sudo chmod u-w /var/www/jyraphe/lib/config.local.php

Note: Par défaut, votre configuration PHP limite la taille maximale des fichiers à uploader à 16 Mo. Pour augmenter cette valeur, il faut modifier les paramètres post_max_size et upload_max_filesize dans votre fichier de configuration php.ini. Attention, sur un système 32 bits, la limite doit être de 2147483647 octets (2 Go – 1). 

En ce qui concerne la sécurité de votre installation. Je vous conseille de protéger l’accès au script d’upload (index.php) par un mot de passe afin de limiter l’accès à votre service…

Utilisation de Jyraphe

L’accès à Jyraphe mène directement à la page d’upload:

A la fin du téléchargement, on obtient l’URL à envoyer à vos correspondants pour qu’ils puissent télécharger le fichier:

Mon avis sur Jyraphe

Les +:

  • Installation simple et rapide
  • Pré-requis système minimaliste (pas de base de donnée)
  • Stable et léger

Les -:

  • A vous de gérer la sécurité d’accès à votre service (pas de gestion d’utilisateurs)
  • Interface Web un peu « old school » (Pas de barre de progression « JS » lors de l’upload)
  • Cycle de développement un peu lent (la version 0.6 est en développement depuis juin 2009)

FileZ

FileZ est une très bonne alternative à Jiraphe. Je le place cependant en deuxième position car je trouve qu’installer une base de donnée MySQL pour ce genre de besoin est un peu lourdingue….

Développé initialement par l’université d’Avignon, il est maintenant maintenu sur GitHub par les 2 principaux contributeurs.

La procédure d’installation n’est pas des plus simple, il faut donc y aller étape par étape. Je vous propose donc de vous guider dans le tutoriel suivant:

Installation de FileZ

L’installation est des plus simple et nécessite:

  • un serveur Web Apache avec le support du module mod_rewrite ou Nginx (voir la configuration FileZ pour Nginx dans ce billet)
  • le module PHP doit être activé
  • une base de donnée MySQL pour stocker les informations sur les fichiers et pour gérer l’authentification (il est aussi possible d’utiliser un serveur LDAP pour cette tache)
  • pour une installation depuis GitHub, il faut que le package git-core soit installé sur votre serveur

On commence par créer la base de donnée FileZ:

# mysql -u root -p
Enter password:

mysql> create database filez;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON filez.* TO "filez"@"localhost" IDENTIFIED BY "filezmdp";
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> USE filez

mysql>  CREATE TABLE `filez`.`db_users` (
`uid` SERIAL NOT NULL ,
`login` VARCHAR( 20 ) NOT NULL ,
`password` VARCHAR( 40 ) NOT NULL ,
`givenname` VARCHAR( 255 ) NOT NULL ,
`sn` VARCHAR( 255 ) NOT NULL ,
`mail` VARCHAR( 255 ) NOT NULL
) ENGINE = MYISAM ;

mysql> exit
Bye

Ensuite:

sudo git clone git://github.com/UAPV/FileZ.git /var/www
sudo chown -R www-data:www-data /var/www/FileZ

Cette commande va créer un répertoire /var/www/FileZ dans le répertoire racine de votre site Web et appliquer les droits pour l’utilisateur www-data (vous pouvez bien sûr adapter cette configuration à vos besoins).

Il faut ensuite se rendre à l’URL: http://votreserveur.com/FileZ

Le wizard d’installation va se lancer et vérifier que les pré-requis de votre serveur sont bons (ce qui serait étonnant). Si ce n’est pas le cas, il faut modifier la configuration de son serveur Web et/ou de PHP.

Note: Si vous utilisez Nginx, FileZ ne trouvera jamais le module mod_rewrite (et pour cause, il n’existe pas de le monde Nginx). Il suffit juste de cliquer sur continuer et d’ignorer le message.

On passe ensuite à la phase de configuration de FileZ en remplissant un formulaire. Vous pouvez vous inspirer de cette configuration en l’adaptant à votre système. La seule chose que j’ai changé est le fait de ne pas utiliser https (pas actif sur mon serveur):

En cas de problème, vous aurez le droit à un message du style:

Dans ce cas, il faut corriger les éventuels problèmes avant de continuer par exemple en créant le répertoire d’Upload:

sudo mkdir -p /var/filez/uploads
sudo chown -R www-data:www-data /var/filez/uploads

Puis en donnant les bons droits sur le répertoire de log:

sudo mkdir -p /var/log/filez
sudo chown -R www-data:www-data /var/log/filez

Utilisation de FileZ

Une fois l’installation finalisé on peut accéder à son FileZ:

Mon avis sur FileZ

Les +:

  • Gestion des utilisateurs (droits, mail automatique…)
  • Interface Web agréable

Les –:

  • Installation lourde
  • Pré-requis important (Apache + mod-rewrite, autre module si barre de progression…)
  • Utilisation obligatoire de MySQL

Les autres solutions

Voici un panel des autres solutions que j’ai écarté (peut être à tort mais je n’avais pas le temps de tout tester).

Open Upload

Tout comme FileZ, OpenUpload propose une gestion plus fine des utilisateurs et des accès que Jiraphe. Le plus gros défaut est le manque cruel de documentation claire pour l’installation (même si on cherche sur le Wiki).

ZendTo

Développé par l’université de Southampton, c’est une solution complète. On retrouve également la gestion des utilisateurs et des droits. L’installation est plus complexe que Jiraphe mais le site officiel propose des tutoriels plutôt complets.

Si vous souhaitez élargir l’utilisation de votre service à plusieurs personnes, c’est clairement une solution à regarder.

LinShare

Cette solution semble aussi complète mais je l’ai rapidement écarté en lisant le premier des pré-requis:

« To use Linshare you need to install a suitable JDK… »

Je cherchais une solution légère et pure Web, donc exit LinShare…

Xtrafile

Un dernière solution très bien faite (vous pouvez voir un site de démonstration ici). Elle se base sur un serveur Web / PHP + MySQL. Il existe une procédure d’installation très complète (sur CentOS) sur le forum.

Conclusion

Comme nous avons pu le voir ensemble à travers ce billet, il existe de nombreuses alternatives libres pour échanger simplement des gros fichiers via le navigateur Web.

Utilisez vous une de ces solutions ?

Préférez vous les services en ligne existants (mais non libres) ?

Partagez vos expériences dans les commentaires ci-dessous !