lindev : administration linux , développement php

Aller au contenu | Aller au menu | Aller à la recherche

02 avr. 2010

Nginx Premiers pas

nginx-logo.png''Alors voilà , je vais essayer de présenter au mieux nginx , ou tout du moins , expliquer sont installation et utilisation .
On trouve de plus en plus de documentations sur le net , et je vais donc ici essayer de regrouper les choses , pour au final avoir un serveur HTTP digne de se nom , qui pourra sans problème remplacer son homologue Apache .
Je conseillerai même Nginx sur des machine de faible capacités en mémoire et/ou processeur .''

Présentation

Bon là je ne vais pas m'éterniser , le site NginxFr vous l'expliquera certainement mieux que moi .
En gros , c'est un serveur web ( entre autre ! ) open sources , d'origine Russe , développez pour répondre à une forte charge , grâce à une gestion des requêtes asynchrone , via des process innovants .
Ses points forts sont donc , une stabilité accrue , une faible consommation de mémoire , une simplicité de configuration , qui le rend ( je trouve ) agréable à administrer .

Notez qu'il vous est possible de tester ce serveur sans casser l'existant .. il vous suffira de le faire tourner sur un autre port , exemple , le 82 !
Aller , n'hésitez plus lancez vous dans l'aventure ...

L'installation

Comme à mon habitude , je n'utiliserai pas la version des paquet de ma distribution .
Il est pour moi important de savoir ce que j'ai sous le capot , et d'en maitriser ( ou au moins essayer ) toutes les facettes .

Récupération des sources et décompactage

cd /usr/local/src
wget http://sysoev.ru/nginx/nginx-0.7.65.tar.gz
tar xzf nginx-0.7.65.tar.gz
cd nginx-0.7.65

Nous voilà prêt à lancer la compilation de la bête ...
Commençons par éditer un fichier de configuration à la compilation , ( façon débian like comme le précise le site ) , j'ai juste ajouté l'option --with-http_stub_status_module qui permet d'avoir l'équivalent du server-status d'apache .
Pour les autres options , je vous laisse voir la description de chacun d'eux qui sont tres bien documenté à cette adresse

Fichier my_configure

vim my_configure

Et voici le contenu :

#!/bin/sh

./configure \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --pid-path=/var/run/nginx.pid \
  --lock-path=/var/lock/nginx.lock \
  --http-log-path=/var/log/nginx/access.log \
  --http-client-body-temp-path=/var/lib/nginx/body \
  --with-http_ssl_module \
  --http-proxy-temp-path=/var/lib/nginx/proxy \
  --with-http_stub_status_module \
  --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
  --with-debug \
  --with-http_flv_module \
  --with-http_stub_status_module

Rendons le exécutable et go ! :

chmod 777 my_configure
./my_configure
make
make install
mkdir -p /var/lib/nginx/body

warning.png Il vous faudra certainement installer des librairies manquantes ... les messages d'erreurs vous indiquerons lesquels .

Configuration

Nous allons maintenant nous attaquer à la configuration de la bête ... pour commencer .. ou ce trouve quoi !

Emplacements des éléments

Petit tour d'horizon , comme spécifié à la configuration , les principaux fichiers de conf se trouvent dans :

/etc/nginx/

Les fichiers de logs :

/var/log/nginx/

L'exécutable :

/usr/local/nginx/sbin/

Rotation des logs

Si vous ne voulez pas que vos fichiers de logs remplissent le disque en quelques mois , alors , il est préférable de faire une rotation journalière .
Nous allons dédier cette tâche à logrotate .

cd /etc/logrotate.d/
vim nginx

Et voici le contenu :

/var/log/nginx/*.log {
        daily
	missingok
	rotate 5
	compress
	delaycompress
	notifempty
	create 640 root adm
	sharedscripts
	postrotate
    	if [ -f /var/run/nginx.pid ]; then
    		/usr/local/nginx/sbin/nginx -s reload > /dev/null
    	fi
   	endscript

}

download.pngOu si vous préférez en format à dl : nginx_logrotatenginx

Configuration principale

Le fichier de configuration principale se trouve donc là : /etc/nginx/nginx.conf
Nous allons sauvegarder la version originale , et démarrer de 0 , enfin presque ..

cd /etc/nginx/
mv nginx.conf nginx.conf.old
vim nginx.conf

warning.png Si vous souhaitez faire tourner votre serveur nginx sur un autre port , n'oubliez pas de le modifier ( directive listen ) . De même que l'utilisateur que j'utilise www-data n'est pas forcément le même pour vous .. adaptez à votre conf.

download.pngJe vous met le fichier de conf à dispo , ici : nginx.confnginx.conf

Pour ce qui est des explications sur chaque option , les utilisateurs d'apache trouverons tres vite leurs marques , de plus la documentation est compléte ici.

les Vhosts

Vous l'avez certainement remarqué , dans nginx.conf , il y a la ligne

include /etc/nginx/site-enabled/*;

Qui permet de gérer les vhosts de façons structuré , tous les fichiers de conf présents dans ce répertoire seront analysé par nginx à sont lancement .

Préparons le terrain avant de creer notre premier vhost .

mkdir site-available
mkdir site-enabled

Voici maintenant la création d'un vhost type , le plus simple du monde .

cd /etc/nginx/site-available
vim monsite.com

Et voilà le contenu type :

server {
        listen       80;
        
        server_name  monsite.com  www.onsite.com;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

Vous pouvez donc spécifier un ou plusieurs ports par vhost , ensuite définir des options propre à chaque location .
Nous verrons par la suite comment par exemple ajouter des régles de cache pour les données statics , ou rediriger en fonction de l'ip ect ... mais ne brulons pas les étapes .
Activons notre vhost !

ln -s /etc/nginx/site-available/monsite.com /etc/nginx/site-enabled/

Start Nginx

Pour la première fois nous allons donc lancer nginx afin de tester la conf de base , pour celà il faut vous rendre dans le répertoire contenant l'exécutable .

info.pngl'executable nginx s'utilise de cette façon :

nginx -s [ stop | quit | reopen | reload ] 

Pour démarrer :

cd /usr/local/nginx/sbin/

Et go

./nginx


Il ne doit y avoir aucun message au lancement , vous pouvez vérifier au niveau des logs si tout se passe bien ,

tail -f /var/log/nginx/error.log

Si tout est ok , alors vous voilà prêt à servir des page statiques .. testez avec votre navigateur !

http://localhost:80

Démarrage automatique

Vous avec votre serveur dans sa configuration de base prêt à l'emploi , mais au prochain redémarrage , celui-ci ne sera pas automatiquement lancé , nous allons donc créer de quoi automatiser tout ça ( debian like ).

Rendez-vous dans /etc/init.d/ et éditer le fichier nginx

cd /etc/nginx
vim nginx

Je vous met donc à disposition le script de démarrage ici : nginxnginx

warning.pngLe fichier que je vous donne est adapté à la configuration donné dans ce tuto , si vous avez modifié des choses à la compilation , n'oubliez pas d'adapter ce script au besoin .

Nous allons maintenant le rendre exécutable , puis le déclarer dans les RC

chmod 777 nginx
update-rc.d nginx defaults

Fin de la première partie ..

Et oui , bilan , vous avez un serveur web http , qui peut dés à présent servir du contenu statique , vous savez créer des hôtes virtuels , et votre serveur démarre automatiquement à démarrage de votre machine .
Ouf ... et bien il nous reste plus qu'à prendre en charge les scripts php , et - ou perl , qui sera le sujet de la deuxième partie .. ( rédaction en cours )

23 mar. 2010

PHP et Clamav

PHP + Clamav = PHP ClamAV Lib

php-clamav_logo.png Passer les fichiers uploadés par un anti-virus , n'est plus marginal de nos jours . Même sur des systèmes linux , il faut se protéger ...

Etat des lieux

Nous allons donc utiliser un serveur web , avec apache et php5.x d'installé , évidemment clamav sera lui aussi installé et fonctionnel , si ce n'est pas le cas, vous pouvez vous reporter à ce tuto pour son installation .

Dans mon cas , je souhaitai vérifier les fichiers uploadés via un serveur FTP , comme j'ai mis en place un script PHP qui épluche les logs et averti les utilisateurs finaux de l'arrivée d'un nouveau fichier à traiter .

N'ayant finalement pas envi de mettre en place un serveur mandataire FTP transparent pour intégrer l'antivirus , j'ai décider d'utiliser le script de surveillance pour en plus d'avertir les personnes concernés , vérifier les fichiers et les supprimer en cas de détection positive .

PHP ClamAV Lib

Nous allons donc récupérer et décompresser l'archive , sur le site de ClamAV

wget http://sourceforge.net/projects/php-clamav/files/0.15/php-clamav_0.15.2.tar.gz/download
tar xzf php-clamav_0.15.2.tar.gz
rm php-clamav_0.15.2.tar.gz
cd php-clamav_0.15.2/

Compilation

phpize
./configure --with-clamav
make 
make install

PHP.ini

Nous allons donc changer un ou deux petits paramètres dans le php.ini
A commencer par le paramètre extension_dir si ce n'est pas encore fait .
A la fin de la compilation , le chemin à définir vous est indiqué , pour moi , ce sera :

extension_dir = "/usr/lib/php5/20060613/"

Ensuite , il nous faut lier l'extension clamav à php , pour celà nous allons ajouter à la fin du fichier php.ini ces quelques lignes :

extension=clamav.so
[clamav]
clamav.dbpath=/var/lib/clamav
clamav.maxreclevel=0
clamav.maxfiles=0
clamav.archivememlim=0
clamav.maxfilesize=0
clamav.maxratio=0

Enregistrez les fichier et redémarrez apache pour prendre en compte les derniers changements .
Pour vérifier que le module soit bien activé , vous pouvez entrer cette ligne de commande :

php -m | grep clamav

Qui doit normalement vous retourner clamav



Ou alors faire le grand standard echo phpinfo();

Utilisation

Ca y est vous avez fait le plus dur ... avouez que c'était simple !
Bon , ne nous reste plus qu'à utiliser ce module fraichement installé .

Dans les sources , vous avez peut être remarqué la présence d'un fichier php nommé phpclamav_test.php
N'hésitez pas à le tester , et l'ouvrir pour voir les fonctionnalités du module .

Voici son résultat :

test-clamav.jpeg

La fonction la plus utile est bien évidemment cl_scanfile qui prend deux arguments ,

  1. Le chemin vers le fichier à analyser
  2. La variable qui se verra attribué le nom du virus en cas de détection d'infection

La valeur de retour a deux valeur possibles :

  • 1 : détection de virus
  • 0 : pas de détection de virus

Ce qui vous donne donc un script du style , ( à adapter à votre utilisation )

$file = "/var/www/monfichier.zip";

$retcode = cl_scanfile($file, $virusname);
    if ($retcode == CL_VIRUS) {
        echo "<b>File path : </b>".$file."<b>Return code : </b> Virus found name : ".$virusname; 
    } else {
        echo "<b>File path : </b>".$file."<b>Return code : </b> Le fichier est sain"; 
    }

Faites vos test

Il ne vous reste plus qu'à tester vos scripts avec eicar , disponible sur son site.

Ch.

- page 1 de 5