Maintenant tout le monde connaît bien le Raspberry Pi (Rpi) et les nombreuses utilisations qu'on peut en faire. L'usage d'un Rpi comme serveur Web à la maison m'a plus particulièrement intéressé. Ayant un blogue chez Free, j'ai décidé de le déménager @home. Il m'a donc fallu passer en revue les nombreuses documentations du web (sites, blogues, tutoriels) sur des sujets très variés, allant de l'installation de Raspbian à la configuration de Nginx, en passant par le choix d'un CMS, le nom de domaine chez No-Ip, etc.
Après l'installation, j'ai souhaité faire mon premier tutoriel afin d'aider ceux que cette solution séduirait. Celui-ci n'est, en fait, que le rassemblement d'informations dispersées, que j'ai essayé de centraliser dans un document unique. Je cite d'ailleurs les sources qui m'ont permis de mettre au point ce texte. Les solutions choisies sont assez subjectives, donc contestables. J'ai essayé de privilégier la légèreté des applications, en refusant par exemple les blogues nécessitant une base de données SQL. Mes choix se sont donc portés vers la distribution Raspbian, le serveur Nginx, le blog Pluxml, un nom de domaine No-Ip, ainsi que les outils habituellement nécessaires à un serveur Web.
Ce tutoriel n'a rien de définitif, c'est une base de départ que vos commentaires pourraient, si vous le souhaitez, améliorer et enrichir.
- Conventions établies
- 1 Achat du rpi
- 2 Installation de Raspbian et partitionnement
- 3 Configuration de base du rpi
- 3.1 Raspi-config
- 3.2 Ip statique
- 3.3 Faisons un peu de ménage
- 3.3.1 Gestion des utilisateurs et des groupes
- 3.3.2 Les modules son
- 3.3.3 Suppression des services inutiles
- 3.3.4 Gestion des logiciels Raspbian
- 3.3.5 Suppression des paquets inutiles
- 4 Le serveur web
- 4.1 Installation de Nginx
- 4.2 Configuration de Nginx
- 5 Hello The World
- 5.1 La box internet
- 5.2 Votre nom de domaine chez noip
- 6 Installation et configuration de Pluxml
- 7 Administration du serveur
- 7.1 Le pare-feu Iptables
- 7.2 Rsyslog
- 7.3 SSH
- 7.4 Les clefs ssh
- 7.5 Logwatch
- 7.6 Logrotate
- 7.7 Sauvegarde du système
- 8 Analyse et tests
- 8.1 Awstats
- 8.2 Tests du site
- Références sans lesquelles je n'aurais pas pu faire cette installation ni ce tutoriel
Conventions établies
- adresse ip du rpi = 192.168.1.10 (nom : rpi)
- adresse ip de votre ordinateur = 192.168.1.11 (nom : pc)
- adresse ip de votre box internet = 192.168.1.1 (nom : box)
- votre compte sur le pc = votre_login_pc
- votre compte sur le rpi = votre_login_rpi
- nom du site = nomsite.sytes.net
- Je n'utilise pas sudo, donc les commandes se font par un passage en root par su ;
- Sur le rpi, la connexion est possible par wifi avec une clé usb, mais j'utilise l'ethernet ;
- Le tutoriel est entièrement basé sur linux et il n'y a pas d'interface graphique, sauf accident. J'ai testé tv+souris+clavier, je n'en ai pas trouvé l'intérêt dans le cadre choisi ici ;
- Lorsque le système sera sur la clé usb, il restera une seule sortie usb, suffisante pour une utilisation du clavier s'il y a besoin d'une connexion en mode console pour un dépannage ;
- La légèreté a été privilégiée contre toute autre considération, entraînant le choix de Nginx et de Pluxml. Nginx est réputé pour être moins lourd qu'Apache, et Pluxml n'utilise pas de bases de données. Mais d'autres choix peuvent être faits.
1 Achat du rpi
J'ai acheté les produits ci-dessous chez www.kubii.fr.
- Raspberry Pi 512Mo Model B : 32,99 euros
- Cordon d'alimentation 1.8 mètres, USB A M-MICRO B M : 3,15 euros
- Adaptateur usb euro noir : 7,90 euros
- Cable HDMI 2 mètres : 2,40 euros
- Boîtier : 6,87 euros
- Expédition : 11,95 euros
- TOTAL : 65,26 euros
Après cet achat, et après avoir fait du rangement chez moi, j'ai trouvé
un vieux mini-hub usb 4 ports avec son câble usb mâle-mini mâle(ou micro)
qui permet d'assurer l'alimentation du rpi et d'avoir plus d'entrées usb.
Mais il faut avoir la bonne tension, je n'y connais rien, donc si vous
n'êtes pas sûr, achetez tout le nécessaire. La longueur des câbles doit
être décidée en fonction de l'endroit où vous poserez votre rpi (prise de
courant, boîtier internet, tv). De plus, si vous n'en avez pas, achetez
aussi un câble ethernet. Vous aurez aussi besoin d'une carte SD et d'une
clé usb de 8 Gb. Si vous suivez ma configuration, achetez la carte SD la
plus petite et la moins moins chère, elle ne servira qu'à démarrer, le
reste étant sur la clé usb. Celle-ci servira de disque dur, elle doit donc
être robuste et rapide, mais les spécifications ne sont jamais précisées.
Je possède trois clés usb et une carte SD de classe 4, j'ai donc fait des
tests de lecture/écriture, peu fiables apparemment, mais qui donnent
peut-être des indications. J'ai tout formaté en ext4.
Tests de lecture (relancer plusieurs fois pour trouver une moyenne)
Tests d'écriture (relancés plusieurs fois pour trouver une moyenne).carte sd : hdparm -t --direct /dev/sdc = 20 MB/s
usb1 : hdparm -t --direct /dev/sdd = 29 MB/s
usb2 : hdparm -t --direct /dev/sde = 22 MB/s
usb3 : hdparm -t --direct /dev/sdf = 22 MB/s
Bien sûr, ces résultats en écriture sont délirants, mais je constate que la SD et l'usb3 sont les moins rapides, et que l'usb1 s'en sort le mieux, c'est donc celle que j'ai choisie pour installer Raspbiansync;time bash -c "(dd if=/dev/zero of=/mnt/test bs=8k count=10000; sync)"
sd = 930 MB/s
usb1 = 1.1 GB/s
usb2 = 1.1 GB/s
usb3 = 850 Mb/s
2 Installation de Raspbian et partitionnement
Plusieurs distributions sont disponibles, j'ai choisi la Raspbian Wheezy, une dérivée de la Debian Wheezy, téléchargeable ici. Elle se présente sous la forme AAAA-MM-JJ-wheezy-raspbian.img et pèse 500 Mb. Vous la dézippez sur le pc et l'installez sur la clef usb (/dev/sdc dans mon cas, mais ça peut changer chez vous) par la commande:
ATTENTION /dev/sdc doit bien être votre clef usb, et non un disque dur, sinon le contenu sera écrasé. Vous obtiendrez le partitionnement suivant :dd if=AAAA-MM-JJ-wheezy-raspbian.img of=/dev/sdc
- un espace vide de 4 Mb (taille probablement aléatoire)
- partition /dev/sdc1 en fat32 d'une taille de 56 Mb, c'est la patition /boot
- partition /dev/sdc2 en ext4 d'une taille de 1.75 Gb, la partition système /
Sur le pc vous formatez votre carte sd en fat32 (/dev/sdd dans mon cas). Ensuite vous montez la partition /boot de votre clef usb, et la partition de la carte sd, afin de copier les fichiers de démarrage de la carte usb vers la carte sd:
Il faut indiquer maintenant au rpi où se situe la partition système. Pour cela éditez le fichier cmdline.txt de la carte sd, /tmp/mnt_sd/cmdline.txt, et remplacez root=/dev/mmcblk0p2 (ce nommage de la carte sd peut être différent chez vous) par root=/dev/sda2 : ce qui se présente actuellement sous le nom de /dev/sdd2 (ou autre) sur votre ordinateur, sera nommé /dev/sda2 sur le rpi. Vous pouvez démonter la carte et la clef usb. Cette dernière peut être laissée en l'état ou repartitionnée selon vos besoins. Personnellement j'ai supprimé l'espace vide et la partition fat32, déplacé /dev/sdd2 au début du disque avec un agrandissement à 3 Gb (actuellement mon / ne dépasse pas 1.5 Gb). Il est aussi possible de créer d'autres partitions (swap, données, etc.), mais vous pourrez toujours le faire ultérieurement si besoin, et il y a un fichier de swap de 100 Mb dans le système, qu'on peut réduire ou agrandir (/etc/dphys-swapfile et /var/swap), mais n'ayant pas de problème de mémoire (mon blogue est très léger et requiert entre 200 et 250 Mb sur les 512 Mb du rpi), je n'y ai pas touché. Vous pouvez maintenant insérer la carte sd et la clef usb sur le rpi, connecter le câble ethernet et le câble d'alimentation, et enfin lancer la petite bestiole.mkdir /tmp/mnt_usb ; mount -t vfat /dev/sdc1 /tmp/mnt_usb
mkdir /tmp/mnt_sdcard ; mount -t vfat /dev/sdd1 /tmp/mnt_sdcard
cp -av /tmp/mnt_usb/* /tmp/mnt_sd/
3 Configuration de base du rpi
3.1 Raspi-config
Le rpi a démarré et devrait fonctionner. Comment vous connecter ? La première chose à faire est de consulter votre boîtier internet pour connaître l'adresse ip dynamique attribuée au rpi. Vous trouvez par exemple 192.168.1.30. La commande ssh pi@192.168.1.30 avec le mot de passe raspberry vous permet de vous identifier avec l'utilisateur par défaut pi. Cette commande ssh nom_user@adresse_ip_rpi est la seule commande vous permettant d'accéder au rpi sans interface graphique. Commencez par attribuer un mot de passe à root par sudo passwd root, vous permettant de vous identifier en root par su, afin de de configurer le rpi avec la commande raspi-config (ce menu peut changer si votre version de raspbian est plus récente que la mienne). Il est imprudent de s'indentifier directement en root par ssh, nous verrons comment l'interdire plus loin. Dorénavant nous serons presque exclusivement en root pour toute la suite des démarches.
qui affiche cet écran sur 2 colonnes, chaque ligne pouvant être sélectionnée pour modification (je mets en commentaires gras mes propres choix)ssh pi@192.168.1.30
sudo passwd root password
su
raspi-config
Vous pouvez rebooter, vous reconnecter par ssh, puis passer en root et vérifier que le surcadencement (« overclocking ») est correct de différentes manières :info Information about this tool
expand_rootfs Expand root partition to fill SD card inutile
overscan Change overscan inutile
configure_keyboard Set keyboard layout mettez fr pour avoir l'azerty en cas de connexion tv
change_pass Change password for 'pi' user votre mot de passe
change_locale Set locale je garde par défaut [*] en_GB.UTF-8 UTF-8, sinon la connexion ssh est graphiquement polluée
change_timezone Set timezone Europe/Paris
change_hostname Set hostname raspberrypi par défaut
memory_split Change memory split gpu=4 : l'utilisation de la carte graphique étant inutile, je donne au gpu la valeur minimale de 4 Mb, tout le reste étant disponible pour le cpu
overclock Configure overclocking :
- None 700MHz ARM, 250MHz core, 400MHz SDRAM, 0 overvolt
- Modest 800MHz ARM, 250MHz core, 400MHz SDRAM, 0 overvolt
- Medium 900MHz ARM, 250MHz core, 450MHz SDRAM, 2 overvolt j'ai choisi Medium
- High 950MHz ARM, 250MHz core, 450MHz SDRAM, 6 overvolt
- Turbo 1000MHz ARM, 500MHz core, 600MHz SDRAM, 6 overvolt
ssh Enable or disable ssh server enable
boot_behaviour Start desktop on boot? non
camera Enable/Disable camera addon support non
rastrack Add this Pi to Raspberry Pi Map - Rastrack non
update Try to upgrade raspi-config non (on le fera plus tard)
Il est aussi conseillé de modifier le fichier /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor en remplaçant powersave par ondemand.vcgencmd get_config int
vcgencmd get_config arm_freq
cat /boot/config.txt
Au fait, ça chauffe un rpi? /opt/vc/bin/vcgencmd measure_temp
3.2 Ip statique
Pour un serveur Web je préfère une ip statique, ce qui s'obtient en modifiant /etc/network/interfaces (j'ai diésé les options se référant au dhcp et au wifi)
Après un redémarrage, vous vous connectez par ssh pi@192.168.1.10auto lo
iface lo inet loopback
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
network 192.168.1.1
broadcast 192.168.1.255
gateway 192.168.1.1
3.3 Faisons un peu de ménage
Le rpi va nous servir uniquement à créer un blogue, et c'est tout. Pour un serveur Web, de nombreux éléments sont inutiles, ce qui va nous permettre de faire un grand nettoyage à la tronçonneuse. Pour commencer, supprimons des consoles inutiles dans notre cas. Dans le fichier /etc/inittab vous pouvez diéser les 4 dernières lignes, c'est-à-dire les consoles 3 à 6.
1:2345:respawn:/sbin/getty --noclear 38400 tty1`
2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6
3.3.1 Gestion des utilisateurs et des groupes
Je préfère supprimer l'utilisateur pi qui est connu et donc identifiable pour les intrus. Créons d'abord un nouvel utilisateur et son groupe, qui par convention auront pour nom votre_login_rpi
Vérifiez que votre nouvel utilisateur est bien créé par la commande id votre_login_rpi qui vous donnerauseradd --home-dir /home/votre_login_rpi --create-home --skel /etc/skel --user-group --uid 1000 votre_login_rpi
passwd votre_login_rpi
uid=1000(votre_login_rpi) gid=1000(votre_login_rpi) groups=1000(votre_login_rpi)
Vous devez vous déconnecter en faisant 2 fois Ctrl+d (exit de root, puis exit de pi), puis vous reconnecter par ssh votre_login_rpi@192.168.1.10, repasser en root et supprimer l'utilisateur pi:
userdel --remove pi
groupdel pi
Je décide aussi de supprimer les utilisateurs et groupes inutiles
userdel
- games
- lp
groupdel
- fax
- voice
- cdrom
- floppy
- tape
- sudo
- audio
- video
- lpadmin
- indiecity
3.3.2 Les modules son
lsmod affiche des modules de son dont nous n'aurons pas besoin. Dans le fichier /etc/modules il suffit de commenter le module son #snd-bcm2835
3.3.3 Suppression des services inutiles
Pour désactiver un service sans supprimer son script de lancement (dans
/etc/init.d/)
/etc/init.d/nom_service stop
update-rc.d -f nom_service remove
Procédez ainsi avec les services triggerhappy plymouth plymouth-log.
apt-get update
apt-get install sysv-rc-conf
sysv-rc-conf --list : liste de tous les services présents
sysv-rc-conf : interface minimale (mais ça rame) pour activer/désactiver les services
3.3.4 Gestion des logiciels Raspbian
La version de Raspbian que vous avez installée peut nécessiter une
première mise à jour, opération que vous effectuerez de temps à autre de
cette manière :
apt-get update qui réactualise le fichier répertoriant les logiciels
disponibles. RELANCEZ CETTE COMMANDE CHAQUE FOIS que
vous souhaitez rechercher, mettre à jour ou installer des paquets
apt-get dist-upgrade fait une mise à jour globale de la distribtution
Il se peut qu'une mise à jour du micrologiciel (« firmware ») du rpi
soit nécessaire, pour cela il faut lancer rpi-update. Depuis peu c'est
un paquet intégré à Raspbian, mais je ne sais pas s'il est intallé
d'office. Si la commande ne répond pas, installez ce paquet par apt-get
rpi-update
Avant cette mise à jour lancez les commandes /opt/vc/bin/vcgencmd
version et uname -a et notez les résultats.
Puis lancez rpi-update, redémarrez, et comparez les nouvelles versions
du système.
3.3.5 Suppression des paquets inutiles
Après la mise à jour, dans l'optique d'un serveur Web, de nombreux paquets sont inutiles, donc vous pouvez les supprimer par la commande aptitude purge:
Pour achever cette suppression, installez deborphan qui vous permettra de lister les dépendances devenues inutiles à supprimer, puis lancez-leaptitude purge alsa alsa-base alsa-utils cups-bsd cups-client cups-common dillo gconf-service gconf2 gconf2-common ghostscript gnome-themes-standard libgconf-2-4 gksu libgksu2-0 gnome-accessibility-themes gnome-icon-theme gnome-themes-standard gnome-themes-standard-data gpicview lxde leafpad lightdm liblightdm-gobject-1-0 libxklavier16 lightdm-gtk-greeter libsamplerate0 libqt4-network libqt4-xml libqtdbus4 libqtwebkit4 lxappearance lxde-common lxde-core lxde-icon-theme lxinput lxpanel lxpolkit lxrandr lxsession lxsession-edit lxshortcut lxtask lxterminal pistore scratch squeak-plugins-scratch squeak-vm libfm-data libfm-gtk-bin libfm-gtk1 libfm1 libmenu-cache1 lxmenu-data omxplayer pcmanfm penguinspuzzle sudo xarchiver ed galculator midori wpasupplicant xpdf libraspberrypi-doc libiw30 wireless-tools wpagui libcupsimage2 sudo
apt-get update
apt-get install deborphan
deborphan
Si vous êtes accro aux éditeurs vi, nano ou autre, passez votre chemin. Personnellement, pour la mise en place et la configuration du blogue, j'ai choisi de laisser un peu de X afin d'utiliser le petit éditeur nedit par ssh, donc apt-get install nedit
4 Le serveur web
4.1 Installation de Nginx
Tout d'abord il faut un utilisateur et un groupe dédiés au serveur web.
Raspbian l'a fait pour vous, ils se nomment www-data : uid=33(www-data)
gid=33(www-data) groups=33(www-data).
Il faut aussi un répertoire dédié au bloque : mkdir /var/www; chown -R
www-data.www-data /var/www
Tant qu'on y est, dans /etc/passwd changez
www-data:x:33:33:www-data:/var/www:/bin/sh par
www-data:x:33:33:www-data:/var/www:/bin/false afin d'empêcher une
connexion sous ce nom, ce qui est plus sécurisé, mais vous devrez tout
faire en root et penser à rétablir les propriétaires pour chaque fichier
et répertoire créé ou modifié. Pour cela :
chown -R www-data.www-data /var/www/répertoire pour la totalité du
répertoire
chown www-data.www-data /var/www/répertoire/fichier pour un fichier
Passons à l'installation proprement dite de Nginx
Avec les dépôts de Raspbian, j'ai eu la version 1.2.1-2.2 de Nginx, qui date de juillet 2012, alors que la version stable de juin 2013 est la 1.4.0. Mais rien ne vous empêche de compiler aux petits oignons la dernière version de Nginx, avec tous les modules qui vous plaisent.apt-get update
aptitude install nginx-full nginx-common geoip-database libgeoip1
Ensuite, pas de serveur web sans php :
apt-get update
aptitude install php5 php5-common php5-fpm php5-gd libonig2 libqdbm1
4.2 Configuration de Nginx
Les fichiers de configuration de Nginx sont sous /etc/nginx, les
principaux étant:
nginx.conf le fichier principal de configuration
sites-available/ répertoire contenant les fichiers de configuration du
ou des sites
sites-enabled/ répertoire contenant les fichiers de configuration du ou
des sites actifs (liens symboliques vers le répertoire site-availables)
Maintenant on va faire un peu joujou avec le serveur, ca vous fera
comprendre un peu mieux comment ça se passe. D'abord, dans le fichier
/etc/hosts du pc, ajoutez l'adresse ip du rpi et le nom du site :
192.168.1.10 nomsite.sytes.net.
Si, comme moi, vous avez un XP virtuel installé, il faut mettre la même
information dans le fichier c:\windows\system32\drivers\etc\hosts, ce
qui permettra de vérifier l'aspect du blog sur un OS qui ne marche pas
:)
Nginx a été installé, mais pas encore activé. Pour lancer un service sur
Raspbian : service nginx start (start pour démarrer le serveur, restart
pour le relancer, stop pour l'arrêter).
Ouvrez un navigateur web et entrez l'adresse ip du rpi, vous devriez
obtenir un « Welcome to nginx! »
Mais ce que vous voulez, c'est créer votre propre site, il faut donc
configurer un fichier spécifique, ce sera donc
/etc/nginx/sites-available/nomsite, avec une configuration minimale pour
tester.
server {
listen 80;
root /var/www;
server_name localhost;
location / {
index index.php index.html;
}
# enable php
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
Ce site est « available », mais pas « enabled », donc :
cd /etc/nginx/sites-enabled
rm default # suppression du lien sur le site par défaut présent à l'installation de Nginx
ln -s ../sites-available/nomsite
service nginx restart
On va maintenant créer 2 petits fichiers de test dans le repertoire
/var/www/ où seront rangées toutes les données qui apparaîtront sur
votre site. Personnellement, j'ai tout rangé à la racine du répertoire,
mais vous pouvez créer un répertoire dédié à votre site sous /var/www/.
Un premier fichier index.html avec :
Et un petit script php info.php avec :<html><body>Hello world, c'est ma page de mon nouveau site !</body></html>
<?php
phpinfo();
?>
N'oubliez pas, vous êtes en root et vous creéz des fichiers root pour
un serveur dont l'utilisateur est www-data. Les fichiers qui n'ont pas
www-data comme propriétaire ne s'afficheront pas sur le site, donc:
chown -R www-data.www-data /var/www/
ou
chown www-data.www-data /var/www/index.html /var/www/info.php
Maintenant affichez dans la barre d'adresse de votre navigateur
192.168.1.10/index.html, et vous devriez voir s'afficher son contenu.
Pour afficher les infos php de votre système, entrez
192.168.1.10/info.php.
Bon, tout fonctionne, mais le fichier
/etc/nginx/sites-available/nomsite est minimaliste. Incapable de faire
un tuto sur nginx, je vous présente tel quel mon propre fichier,
fabriqué à partir de mes recherches, et notamment des références que je
donne à la fin. Ce fichier est sûrement approximatif et très
perfectible.
/etc/nginx/sites-available/nomsite
server {
listen 80;
server_name localhost:
root /var/www;
index index.php index.html index.htm;
client_max_body_size 20M; # set maximum upload size
access_log /var/log/nginx/access.log combined; # format combined pour logwatch
error_log /var/log/nginx/error.log;
autoindex off; # pour eviter de lister les répertoires
# drop.conf
include drop.conf; # voir fichier plus bas
# default try order
location /
{
# First attempt to serve request as file, then as directory, then as /index.php?$args
try_files $uri $uri/ /index.php?$args;
}
# enable php
location ~ \.php$
{
try_files $uri =404;
fastcgi_index index.php;
fastcgi_pass php5-fpm-sock;#/etc/php5/fpm/pool.d/www.conf /etc/nginx/conf.d/php5-fpm.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
/etc/nginx/drop.conf
### protection de fichers et répertoires contenus dans /var/www/
#
# protection des fichiers caches
location ~ /\. { deny all; }
#
# protection du fichier de version de pluxml
location /version { return 404; }
#
#protection de répertoires
location ~ /(update|data)/ { deny all; }
Selon les informations du blogue
de pablo-ruth, on configure php5-fm comme suit.
Création du fichier /etc/nginx/conf.d/php5-fpm.conf :
upstream php5-fpm-sock {
server unix:/var/run/php5-fpm.sock;
}
et modification du fichier /etc/php5/fpm/pool.d/www.conf (le point-virgule indique un commentaire) :
;listen = 127.0.0.1:9000
listen = /var/run/php5-fpm.sock
Pour finir j'ai modifié le fichier /etc/php5/fpm/pool.d/www.conf, mais les valeurs dépendent de la taille du contenu de votre site, vous trouverez des informations ici.
pm = dynamic
pm.max_children = 8
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = off
;php_admin_value[error_log] = /var/log/fpm-php.www.log
;php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 32M
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
Dans /etc/nginx/nginx.conf il faut dédièser server_tokens off;, ce qui permet de cacher la version de Nginx en cas de telnet, ce que vous pouvez tester depuis votre pc par :
Ce qui affiche nginx au lieu de nginx.numversion. Pour cacher plus d'informations, il faut compliler Nginx.telnet 192.168.1.10 80
HEAD HTTP/1.1
Vous créez un répertoire pour les journaux de Nginx et redémarrez le
service:
mkdir /var/log/nginx/
service nginx restart
5 Hello The World
5.1 La box internet
Pour le moment vous êtes le seul à pouvoir accéder à votre site, mais le reste de l'univers s'impatiente. Il faut rendre votre site accessible à l'extérieur, d'abord par votre boîtier internet. Le mien est celui d'SFR, mais le principe est le même partout. Dans la partie NAT, Il faut effectuer une translation de port entre votre rpi et l'internet par le port 80. Vous entrez l'adresse ip du rpi, établissez un protocole TCP, et définissez le port 80 comme port de communication.
5.2 Votre nom de domaine chez noip
Le boîtier a ouvert une porte, mais il vous manque une adresse. Vous
pouvez acheter un nom de domaine, autour de 15 euros, mais dans ma
démarche de solutions gratuites, j'utilise un nom de domaine attribué
par www.noip.com. Bien sûr, cette
solution comporte le risque de la disparition soudaine d'un service
gratuit mais privé. Vous pouvez vous inscrire ici,
prenez l'option « Free » et créez votre compte No-IP. Vous pouvez
choisir un nom selon les disponibilités, en le faisant suivre de
.noip.me, .zapto.org, .sytes.net, etc. Attention, il y a un petit piège.
Remplissez le formulaire, avec par exemple nomsite.sytes.net, et cochez
le petit carré blanc « Create my hostname later », et ensuite validez
par un Sign Up. Ensuite confirmation par mail, vous êtes redirigé dans
votre espace membre et vous pouvez « Add a host ». Ici vous enregistrez
votre adresse nomsite.sytes.net, choisissez le type DNS Host(A), et
ajoutez l'adresse ip externe de votre boîtier internet.
Si vous avez comme moi une adresse ip dynamique, le boîtier d'SFR gère
bien le lien avec no-ip dans Menu Réseau/DynDNS. Activez le service,
sélectionnez no-ip.com, entrez vos compte et password no-ip, ainsi que
l'adresse nomsite.sytes.net. La prochaine fois que vous redémarrerez
votre boîter internet, 3 ou 4 minutes suffiront pour que votre nom de
domaine soit associé à la nouvelle adresse ip dynamique.
Si vous êtes chez un autre fournisseur d'accès, vous pouvez utiliser ce logiciel fourni pour no-ip pour mettre à jour votre DNS : http://www.noip.com/downloads.php?page=linux
Maintenant que votre nom de domaine est visible depuis l'extérieur,
dans le fichier /etc/nginx/sites-available/nomsite il faut remplacer
server_name localhost; par server_name nomsite.sytes.net;
service nginx restart
6 Installation et configuration de Pluxml
Récupérez le fichier d'installation ici, dézippez-le et copiez-le dans /var/www/ en lui donnant les droits appropriés.
Depuis votre navigateur allez à l'adresse http://nomsite.sytes.net/install.php et remplissez le formulaire:chown -R www-data.www-data /var/www/
chmod -R 770 /var/www/
service nginx restart
Après cela supprimez le fichier /var/www/install.php. Vous pourrez installer différents thèmes, ajouter des extensions, etc. Visitez le site, où vous trouverez un wiki, des thèmes, un forum, etc.langue+heure
Nom de l'administrateur
Identifiant de connexion à l'administration
Mot de passe
Installer
Un petit conseil si vous souhaitez modifier les fichiers php et css du thème du blogue (mais rien ne vous y oblige si votre thème vous satisfait). Je n'ai pas supprimé tous les paquets graphiques de Raspbian afin d'éditer ces fichiers plus confortablement avec Nedit. Pour cela vous lancerez ssh -X -Y -p 22 votre_login_rpi@192.168.1.10. Ensuite vous pouvez éditer avec nedit les fichiers concernés situés dans /var/www/themes/defaut/, defaut étant le nom du thème par défaut.
Par contre cela pose des problèmes de droit sur ces fichiers dont www-data.www-data est propriétaire. Deux possibilités s'offrent à vous :
- ajoutez votre_login_rpi au groupe www-data dans /etc/group ;
- chmod o+w *.php style.css, édition des fichiers, puis chmod o-w *.php style.css.J'ai choisi la deuxième solution, plus contraignante mais plus sécurisée.
Il y a un bogue dans Pluxml lorsque les personnes qui viennent poster un commentaire souhaitent inscrire leur site web. Le site nomsite.sytes.net est récupéré tel quel sans « http:// », donc si on clique dessus la redirection ne s'effectue pas. J'utilise le thème « defaut », peut-être que ce boque est absent des autres thèmes. Pour ajouter « http:// » par défaut dans le formulaire, il faut modifier le fichier /var/www/themes/defaut/commentaires.php et remplacer:
<input id="id_site" name="site" type="text" size="20" value="<?php $plxShow->comGet('site',''); ?>" />
par
<input id="id_site" name="site" type="text" size="20" value="<?php $plxShow->comGet('site','http://'); ?>" />
7 Administration du serveur
Maintenant vous avez un blogue, vous postez vos articles, recevez des commentaires, etc. Tout va bien. Vraiment bien ? Votre serveur est une porte ouverte sur internet, votre nom de domaine est fixé pour l'éternité, connu du plus grand nombre. Il faut donc lui prodiguer protection et surveillance, à l'aide de quelques outils à mettre en place et à configurer.
7.1 Le pare-feu Iptables
Je ne vais pas vous faire un cours, mais seulement vous montrer
mon pare-feu. Les règles iptables sont le moyen le plus simple de
filtrer les entrées/sorties de votre rpi. Attention à
cette étape, une mauvaise règle ssh peut vous faire perdre votre
connexion avec le rpi, et dans ce cas la seule solution sera de
vous connecter via la tv pour réparer le script.
Il y a 3 scripts à écrire, et pour les rendre plus lisibles,
j'emploierai cette nomenclature :
adresse.ip.rpi (192.168.1.10)
adresse.ip.pc (192.168.1.11)
adresse.ip.box (192.168.1.1)
/etc/init.d/fw
/etc/fwstop#!/bin/sh
### BEGIN INIT INFO
# Provides: fw
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: pare-feu iptables
# Description: iptables
### END INIT INFO
case $1 in
"start")
/etc/fwstart
;;
"stop")
/etc/fwstop
;;
"restart")
/etc/fwstop
/etc/fwstart
;;
esac
/etc/fwstart#!/bin/sh
# remise à zero des règles de filtrage
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# nous les faisons pointer par défaut sur ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#!/bin/sh
if=eth0
# remise a zero des règles de filtrage
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# règles par defaut
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP
# loopback
iptables -t filter -A OUTPUT -o lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
iptables -t filter -A INPUT -i lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
# règles pour droper silencieusement les transmissions internes du réseau local
iptables -I INPUT -i $if -s adresse.ip.box -d 224.0.0.1/24 -p igmp -j DROP
iptables -I INPUT -i $if -s 172.16.255.254 -d 224.0.0.1/24 -p igmp -j DROP
# dns local
iptables -A OUTPUT -o $if -s adresse.ip.rpi -d adresse.ip.box -p udp -m udp --sport 1024: --dport 53 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i $if -s adresse.ip.box -d adresse.ip.rpi -p udp -m udp --sport 53 --dport 1024: -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# ssh rpi - pc ### ATTENTION à cette règle : mal écrite, elle supprime votre connexion au rpi ###
iptables -A OUTPUT -o $if -p tcp --source adresse.ip.rpi --source-port 22 --destination adresse.ip.pc --destination-port 1024: -j ACCEPT
iptables -A INPUT -i $if -p tcp --source adresse.ip.pc --source-port 1024: --destination adresse.ip.rpi --destination-port 22 -j ACCEPT
# règles http du serveur
iptables -A OUTPUT -o $if -p tcp --source adresse.ip.rpi --source-port 80 --destination-port 1024: -j ACCEPT
iptables -A INPUT -i $if -p tcp --source-port 1024: --destination adresse.ip.rpi --destination-port 80 -j ACCEPT# règles http(s) du rpi comme client internet, à dédièser pour les mises à jour, peu fréquentes, de Raspbian et Pluxml (plugins et une partie de l'administation)
#iptables -A OUTPUT -o $if -s adresse.ip.rpi -d 0.0.0.0/0 -p tcp -m multiport --dports 80,443 -m conntrack ! --ctstate INVALID -j ACCEPT
#iptables -A INPUT -i $if -s 0.0.0.0/0 -d adresse.ip.rpi -p tcp -m multiport --sports 80,443 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# whois pour awstats
iptables -A OUTPUT -o $if -p tcp --source adresse.ip.rpi --source-port 1024: --destination-port 43 -j ACCEPT
iptables -A INPUT -i $if -p tcp --destination adresse.ip.rpi --source-port 43 --destination-port 1024: -j ACCEPT
# ntp
iptables -A OUTPUT -o $if -p udp --source adresse.ip.rpi --source-port 123 --destination-port 123 -j ACCEPT
iptables -A INPUT -i $if -p udp --source-port 123 --destination adresse.ip.rpi --destination-port 123 -j ACCEPT
# journalisation des connexions dropées
iptables -t filter -A INPUT -p all -j LOG --log-prefix="DROPIN: "
iptables -t filter -A OUTPUT -p all -j LOG --log-prefix="DROPOUT: "
Vous pouvez enregistrer votre script puis le démarrer
update-rc.d fw defaultsservice fw start
Il est recommandé d'installer nmap et de vérifier l'état des ports du rpi par : nmap -v nomsite.sytes.net.
7.2 Rsyslog
Pour obtenir une meilleure lisibilité des journaux du site, il faut modifier /etc/rsyslog.conf, au début de la partie RULES et avant les premières règles.
En lien avec les 2 dernières règles de /etc/fwstart, ceci permettra à Iptables d'envoyer les messages de drop dans des fichiers à part, à consulter régulièrement.:msg, contains, "DROPIN: " -/var/log/dropin.log
& ~
:msg, contains, "DROPOUT: " -/var/log/dropout.log
& ~
service fw restart
service rsyslog restart
7.3 SSH
Ssh est un moyen sécurisé de connexion
entre ordinateurs. Le fichier
/etc/ssh/sshd_config du rpi peut être
configuré plus finement. Attention
des erreurs vous feront perdre votre
connexion ssh avec le rpi. Améliorons le
fichier /etc/ssh/sshd_config :
Port 22 par défaut le port ssh est 22,
vous devriez en choisir un autre (et
revoir les règles ssh d'Iptables). Prenez
un port disponible (voir /etc/services et
Google).
PermitRootLogin no : il vaut mieux activer
cette option et vous loguer sur le rpi
comme utilisateur non privilégié, puis
passer en root par su
AllowUsers votre_login_pc@adresse.ip.pc :
seul l'utilisteur « votre_login_pc » de
cette machine (le nom de l'utilisateur du
pc) pourra se connecter au rpi par ssh (ne
pas confondre le nom de l'utilisateur du
rpi « votre_login_rpi » et le nom
d'utilisateur du pc « votre_login_pc »)
service ssh restart
connexion simple
ssh -p 22 votre_login_rpi@adresse.ip.rpi
connexion graphique
ssh -X -Y -p 22 votre_login_rpi@adresse_ip_rpi
nedit /var/www/themes/defaut/style.css &
depuis le pc, copie de fichier du pc vers le rpi
scp -P 22 nom_fichier votre_login_rpi@adresse_ip_rpi:/home/votre_login_rpi/
7.4 Les clefs ssh
Il y a une méthode plus sécurisée pour assurer la connexion ssh entre le pc et le rpi, par un système de clefs. Alors que la connexion classique est autorisée par un mot de passe, la connexion par clefs entrepose des données sur les 2 machines, et ssh ira vérifier la validité de ces données sur chacune, ainsi qu'un mot de passe, pour autoriser la connexion. Sur votre pc en tant qu'utilisateur votre_login_pc (je suis sur Arch mais la procédure doit être la même partout) :
Vous vous connectez comme auparavant par ssh -p 22 votre_login_rpi@adresse.ip.rpi, mais dorénavant c'est la passphrase qui vous sera demandée.ssh-keygen -t rsa : génération d'une paire de clefs, une clef privée id_rsa et une clef publique id_rsa.pub dans le répertoire par défaut /home/votre_login_pc/.ssh/
Enter passphrase (empty for no passphrase) : entrez une passphrase, c'est-à-dire un mot de passe
Your identification has been saved in /home/votre_login_pc/.ssh/id_rsa
Your public key has been saved in /home/votre_login_pc/.ssh/id_rsa.pub
Il faut maintenant envoyer au rpi la clef publique : ssh-copy-id -i ~/.ssh/id_rsa.pub votre_login_rpi@adresse.ip.rpi -p 22
7.5 Logwatch
Logwatch parcourt et analyse les fichiers journaux dans /var/log/ et envoie un courriel.
L'installation va jusqu'à sa fin, mais au moment du lancement du serveur de courriels exim, j'ai eu cette erreur:apt-get install logwatch installe les paquets exim4-base exim4-config exim4-daemon-light heirloom-mailx libdate-manip-perl libyaml-syck-perl logwatch.
C'est un problème avec ipv6 qui n'est pas présent sur le rpi, il faut donc modifier /etc/exim4/update-exim4.conf.conf en remplaçant[ ok ] Starting MTA: exim4
ALERT: exim paniclog /var/log/exim4/paniclog has non-zero size, mail system possibly broken
dc_local_interfaces='127.0.0.1 ; ::1' par dc_local_interfaces='127.0.0.1'
puis lancez update-exim4.conf
Afin de lire les courriels root sous votre compte votre_login_rpi, modifiez /etc/aliases en ajoutant root:votre_login_rpi
service exim4 restart
J'ai modifié /etc/logwatch/conf/logwatch.conf en commentant les lignes suivantes :mkdir /var/cache/logwatch
cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/
et remplacé « Detail = Low » par « Detail = 10 » afin d'avoir de plus amples informations.#MailTo = root
#MailFrom = Logwatch
#Service = "-zz-network"
#Service = "-zz-sys"
#Service = "-eximstats"
#mailer = "/usr/sbin/sendmail -t"
Un script cron lancera un script logwatch tous les jours à 6h25, l'étude se faisant sur les fichiers journaux de la journée précédente, et sur vos services activés et présents dans le fichier /usr/share/logwatch/default.conf/services. Demain, sous votre compte, vous n'aurez qu'à taper mail.
Le problème,
c'est que Nginx
n'est pas présent
dans la liste de
Logwatch, il faut
donc s'en occuper.
D'abord Logwatch
lit un certain
format de fichier,
c'est pour cela
que les fichiers
de log de Nginx
sont au format
combined dans
/etc/nginx/sites-available/nomsite
access_log
/var/log/nginx/access.log
combined;
Nginx rejette le
format combined
pour error.log, je
ne suis pas
parvenu à
l'intégrer.
On peut maintenant
configurer des
fichiers Nginx
pour logwatch, en
prenant comme
modèle les
fichiers
http.conf.
cd /usr/share/logwatch/default.conf/logfiles
cp http.conf nginx.conf et modifier ce dernier en supprimant toutes les lignes LogFile = et Archive =
puis ajoutez
LogFile = nginx/*access.log
LogFile = nginx/*access.log.1
Archive = nginx/*access.log.*.gzcd /usr/share/logwatch/default.conf/services/
cp http.conf nginx.conf et modifier ce dernier en remplaçant au début http par nginx
Title = "nginx"
LogFile = nginxcd /usr/share/logwatch/scripts/services
cp http nginx : pas de modification
En attendant les prochains courriels de Logwatch, vous pouvez le lancer en direct, en ciblant les services et en utilisant les logs de Today ou Yesterday:
logwatch --output stdout --format text --detail 10 --service cron --service iptables --service pam_unix --service sshd --service nginx --range Today --hostname raspberry
Cependant, vous comprendrez mieux ce qui se passe sur votre système en examinant directement les journaux dans /var/log/, et en particulier ceux de /var/log/nginx/, où nginx.error vous informe des problèmes du serveur, et access.log qui vous montrera la liste de vos visiteurs, les tentatives de connexions illicites, etc.
7.6 Logrotate
Logrotate fait tourner les fichiers journaux dans /var/log/, donc ceux de Nginx aussi. Mon fichier /etc/logrotate.d/nginx se présente somme suit, avec une rotation par semaine :
/var/log/nginx/*.log {
weekly
missingok
rotate 10
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
7.7 Sauvegarde du système
Bon, il y a les
méthodes subtiles
et la mienne,
genre bourin, mais
c'est efficace, en attendant mieux :
débrancher le rpi,
retirer la carte
sd et l'usb, et
les monter sur le
pc afin de les
sauvegarder dans des répertoires SD
et USB crées sur le dique dur du pc.
Chez moi, la carte sd est montée sous le nom /run/media/votre_login_pc/D07B-DA2D, et j'effectue la sauvegarde ainsi :
Ensuite je démonte la carte (umount /run/media/votre_login_pc/D07B-DA2D/) , je cherche son identifiant (chez moi /dev/sdc1) et je vérifie le système de la sd en fat32 par dosfsck -a -w -v /dev/sdc1. Vous pouvez faire la même chose avec gparted.rsync -aAXv /run/media/votre_login_pc/D07B-DA2D/ /chemin_de_sauvagarde/sd/
La procédure est similaire pour la clef usb :
Puis démontage de la clef usb (umount /run/media/votre_login_pc/raspbian/) et vérification du système : e2fsck -f -v /dev/sdc2rsync -aAXv /run/media/votre_login_pc/raspbian/ /chemin_de_sauvagarde/usb/
Attention : /dev/sdc1 et 2 sont donnés à titre indicatif, ne les lancez par sur n'importe quel filesystem. Quand la clef ou la carte sont montées, faites df pour voir le filesystem à vérifier. Par exemple, je monte une clef usb avec df et j'obtiens :
df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdc1 7890872 4 7890868 1% /run/media/devo/669C-0491
Bien sûr on peut faire les sauvegardes à distance sans arrêter le rpi, avec rsync, tar ou un logiciel dédié, sur les répertoires utiles. Mais quand tout est bien installé et finalisé, les sauvegardes deviennent rares et les seules informations à sauvegarder restent les données Pluxml dans /var/www/data/. On peut aussi connecter une 2ème clef usb sur le rpi, sur laquelle on fera une sauvegarde incrémentale quotidienne, hebdomadaire, etc. Bref, de nombreuses possibilités sont offertes.
8 Analyse et tests
8.1 Awstats
Afin de lire les
statistiques de
votre site, créez
un répertoire où
elles seront
lisibles.
mkdir
/var/www/statistiques
chown -R
www-data.www-data
/var/www/statistiques
Pour utiliser
Awstats, vous
aurez besoin de
whois, ainsi
qu'une règle
Iptables, déjà
écrite dans le
script en 7.1.
L'installation se
fait ainsi :
apt-get update
apt-get install awstats libnet-xwhois-perl whois
cp /etc/awstats/awstats.conf /etc/awstats/awstats.nomsite.sytes.net.conf avec quelques lignes à remplacer :
LogFile="/var/log/apache2/access.log" par LogFile="/var/log/nginx/access.log"
LogFormat=4 par LogFormat=1
SiteDomain="" par SiteDomain="nomsite.sytes.net"
HostAliases="localhost 127.0.0.1" par HostAliases="localhost 127.0.0.1 nomsite.sytes.net"
SkipHosts="" par SkipHosts="192.168.1.11" afin de masquer l'adresse ip de votre pc dans les statistiques, avec une modification de /usr/lib/cgi-bin/awstats.pl comme indiqué ici :
Remplacez
my @arrayunreg = map {
if (/\(\?[-^\w]*:(.*)\)/) { $1 }
} @$array;
par
my @arrayunreg = map { UnCompileRegex($_) } @$array;
Un script Cron relance régulièrement la mise à jour des statistiques en envoyant des données dans /var/lib/awstats/. C'est le fichier /etc/cron.d/awstats, avec, par exemple, une mise à jour toutes les 2 heures :
MAILTO=root
5 */2 * * * www-data [ -x /usr/lib/cgi-bin/awstats.pl -a -f /etc/awstats/awstats.nomsite.sytes.net.conf -a -r /var/log/nginx/access.log ] && /usr/lib/cgi-bin/awstats.pl -config=nomsite.sytes.net -update > /dev/null
Losrque vous
souhaitez lire les
statistiques sur
votre site, le
plus simple est de
lancer:
/usr/share/awstats/tools/awstats_buildstaticpages.pl
-dir=/var/www/statistiques/
-update-config=nomsite.sytes.net
Inscrivez
nomsite.sytes.net/statistiques/awstats.nomsite.sytes.net.html
dans votre
navigateur et vous
pourrez voir de
nombreuses
statistiques sur
le mois en cours.
Après l'ivresse de
votre succès, vous
pourrez faire rm
/var/www/stat/*
8.2 Tests du site
Des sites existent pour savoir si votre blogue fonctionne correctement :
- Vérification de la syntaxe html http://validator.w3.org/#validate_by_uri+with_options
- De bonnes infos utiles sur votre site http://www.webpagetest.org/
- Vitesse du site avec détail des fichiers http://tools.pingdom.com/fpt/#!/HsfEP et http://www.1-referencement.com/test-vitesse-site.html?
Références sans lesquelles je n'aurais pas pu faire cette installation ni ce tutoriel
- Raspberry Pi
- Achat http://www.kubii.fr
- Raspbian sur USB http://www.networkinghowtos.com/howto/raspbian-on-raspberry-pi-using-sd-card-usb-memory-stick/
- Installation, configuration et divers
- site wiki rpi http://elinux.org/RPi_Hub
- forum officiel rpi http://www.raspberrypi.org/phpBB3/
- Overclocking
- Revue en ligne http://www.themagpi.com/
- Serveur Web
Nginx
- Site Nginx (doc, wiki, etc.) http://wiki.nginx.org/Main
- Serveur Web sur rpi http://www.isalo.org/wiki.debian-fr/index.php?title=Serveur_web_%C3%A0_la_maison_:_raspberry_pi
- Installation sur Ubuntu http://blog.nicolargo.com/2011/01/installation-et-test-de-nginx-sous-ubuntu.html
- Installation et configuration http://wiki.deimos.fr/Nginx_:_Installation_et_configuration_d%27une_alternative_d%27Apache
- Optimiser Nginx + PHP-FPM + APC http://blog.pablo-ruth.fr/index.php/optimisation-web-installer-nginx-php-fpm-apc-sur-debian-squeeze/
- Sécurité
- Securing services on Debian http://www.debian.org/doc/manuals/securing-debian-howto/ch-sec-services.en.html
- Iptables http://olivieraj.free.fr/fr/linux/information/firewall/index.html
- Logs Iptables http://blog.pastoutafait.org/billets/diriger-les-logs-iptables-vers-un-fichier-specifique
- Sécuriser nginx http://fralef.me/nginx-hardening-some-good-security-practices.html
- Nginx Security http://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html
- Securing nginx http://levigross.tumblr.com/post/4488812448/10-tips-for-securing-nginx
- Sécuriser et protéger son site web http://ralph.davidovits.net/internet/se-proteger-des-pirates-et-hackers.html
- Les logs Nginx
- Doc Logwatch sur Ubuntu http://doc.ubuntu-fr.org/logwatch
- Logwatch http://blog.pastoutafait.org/billets/Analyser-les-logs-de-NGinx-avec-LogWatch
- Logrotate http://voidandany.free.fr/index.php/logs-nginx-et-logrotate/
- Awstats
- Awstats sur Ubuntu http://doc.ubuntu-fr.org/awstats
- Awstats sur Debian Squeeze http://blog.pastoutafait.org/billets/Installation-et-configuration-de-AwStats-sur-Debian-Squeeze
- Awstats sur Debian http://aitibourek.wordpress.com/2012/12/21/installation-et-configuration-dawstats-sous-debian/
- Pluxml
- Doc, plugins, themes, forum, etc. http://www.pluxml.org/
- Installation http://sorrodje.alter-it.org/index.php?article27/pluxml-un-cms-light-installation
- And a Very Big Special Dedicace to : man