Raspberry Pi - Installation et configuration automatique d'un serveur web NGINX

Rédigé par P3ter - - 18 commentaires

Grâce au peu d'énergie qu'il consomme, le Raspberry Pi et parfait pour jouer le rôle de serveur chez soi. J'ai donc fait un fork du script de Nicolas Hennion (blog.nicolargo.com) qui permet d'installer et de configurer automatiquement un serveur web sous Debian et j'ai adapté ce script pour les Raspberry Pi tournant sous Raspbian.

Composants du serveur

Le choix de NGINX est évident par rapport à celui d'Apache, car ce dernier est beaucoup plus gourmand, alors que les performances du Raspberry Pi sont assez limité. NGINX étant très léger en ressource, constitue un serveur web parfait pour notre mini-serveur ARM.

Le deuxième composant essentiel : PHP, obligatoire pour créer un site dynamique (par opposition à un site statique entièrement en HTML). Pour faire communiquer PHP et NGINX, on utilisera PHP-FPM. Une alternative possible est d'utiliser PHP FastCGI, mais celui ci est plus difficile à configurer. Dernière élément important : un moteur de site de web. Les plus connus étant Wordpress, Joomla, Drupal, Spip, mais pour notre Raspberry Pi je vous conseil plutôt une solution sans base de données comme Dotclear ou PluXml. J'en reparlerai plus bas dans l'article.


Installation et configuration : Le script

Le script installe NGINX depuis les sources. Il est possible d'installer la version de développement ou bien la version stable en modifiant le script. Par défaut c'est la version de développement qui est installé.

Installation de la version développement :

NGINX_VERSION="1.3.10" # The dev version
#NGINX_VERSION="1.2.7" # The stable version

Installation de la version stable :

#NGINX_VERSION="1.3.10" # The dev version
NGINX_VERSION="1.2.7" # The stable version

Pour info, j'ai toujours utilisé la version de développement et je n'ai jamais rencontré de problème.

Voici en détail les étapes du scripts :

  1. Mise à jour des dépôts
  2. Installation des pré-requis (build-essential et librairies)
  3. Téléchargement de NGINX
  4. Décompression des sources
  5. Configuration pour la compilation
  6. Compilation
  7. Installation
  8. Configuration de NGINX
  9. Démarrage des services


Remarque : j'utilise la commande "sudo" par commodité et pour utiliser le /home avec le .bashrc de mon utilisateur.

Passons à des choses plus concrètes et lançons le script :

wget --no-check-certificate https://raw.github.com/P3ter/RaspberryPi/master/nginxautoinstall-raspbian.sh
chmod a+x nginxautoinstall-raspbian.sh
sudo ./nginxautoinstall-raspbian.sh

Des fichiers de logs sont créés dans /tmp.

Important : Avec ce script, NGINX est configuré pour être lancé avec l'utilisateur "www-data". Ce qui implique que les dossiers contenant vos pages web doivent donner des droits suffisants à "www-data". Dans le virtualhost "default", le dossier racine est /var/www, il faut donc passer les commandes suivantes :

sudo chmod -R 770 /var/www
sudo chown -R www-data:www-data /var/www

Pour éditer les fichiers, il faut ajouter votre utilisateur au groupe www-data, sinon il n'aura pas les droits suffisants.

sudo adduser pedro www-data

Pour tester votre serveur web, créez un fichier index.html, contenant le texte de votre choix, à la racine de votre site (/var/www/). Lancer un navigateur est tapez l'adresse IP ou le nom DNS s'il y en a un. Le texte du fichier index.html devrait apparaître.

Lorsque je fais des développements sur mes sites web, je me connecte à distance au serveur en sftp. Les fichiers sont téléchargés en local et renvoyer en enregistrant depuis l'éditeur. A ce moment là l'utilisateur et les droits sur le fichiers ne sont plus corrects pour NGINX. Je dois donc, relancer les deux commandes ci-dessus. Pour que ce soit plus simple, j'ai créé deux alias dans mon .bashrc sur le serveur.

alias chmod-www='sudo chmod -R 770 /var/www'
alias chown-www='sudo chown -R www-data:www-data /var/www'

Mise à jour de NGINX avec le script

La mise à jour de NGINX est très simple il suffit de changer le numéro de version dans le script et de le relancer de la même manière que pour l'installation (voir ci-dessus). J'essai de maintenir le script à jour avec les dernières versions de NGINX.


PluXml : un CMS léger et sans base de données

Un CMS, pour faire simple et rapide, c'est un moteur de site web qui va vous permettre de créer, via un backoffice, des pages, des articles, il vous permettra de gérer des utilisateurs, des catégories, etc. Comme je le disait en introduction, les CMS sont multiples et s'adressent à des projets différents. Pour notre Raspberry Pi, il faut une solution simple, légère et surtout sans base de données. Un MySQL est tout de même trop gourmand pour notre serveur et c'est d'autant plus dommage que nous avons installé NGINX qui se veut lui même très léger.

En tant que CM du projet PluXml, je ne peux que vous le conseiller pour auto-héberger vote site web sur un Raspberry Pi. Ce CMS fonctionne sans base de donnée, et se veut très léger. On télécharge un nouveaux virtualhost et on installe PluXml dans /var/www/pluxml/.

sudo wget --no-check-certificate -O /etc/nginx/sites-enabled/default_pluxml https://raw.github.com/P3ter/RaspberryPi/master/nginx/default_pluxml
mkdir /var/www/pluxml/
cd /var/www/pluxml/
wget --content-disposition http://telechargements.pluxml.org/download.php
unzip pluxml-latest.zip
cp -r PluXml/* .
rm -rf PluXml pluxml-latest.zip
sudo chown -R www-data:www-data /var/www/
sudo chmod -R 770 /var/www/
sudo service nginx restart

Pour accéder au site web on lance un navigateur on tape dans la barre d'adresse l'IP du Raspberry Pi. Attention aux conflits de virtualhost. Si deux virtualhost utilisent le même numéro de port ou le même "ServerName", Nginx les ignorera. Il faut donc, par exemple, modifier le numéro de port ("80" par defaut) de l'un des deux virtualhost, puis de redémarrer Nginx. Enfin, pour vous connecter au site par le port 88 (par exemple), tapez dans la barre d'adresse : "@ip:88" (en remplaçant "@ip" par l'adresse IP du Raspberry Pi).

Pour plus d'information (documentation, forum, etc), je vous renvoi au site officiel : pluxml.org


Rendre accessible à Internet, son site auto-hébergé

La première chose à faire, c'est de placer son Raspberry Pi dans la DMZ de sa box Internet. Ainsi, tous le trafic arrivant d'Internet sur votre box est ouvert et redirigé vers l'adresse IP de votre Raspberry Pi.

On ne bénéficie pas tous d'une adresse IP public statique et interroger sa DMZ avec une adresse IP public dynamique, il n'y a rien de plus fastidieux. L'astuce c'est de configurer sur sa box un compte DynDNS. Celui-ci va permettre d'associer un DNS (du type p3ter.dyndns.org) à l'adresse IP de la box, et chaque fois que cette IP changera, l'association avec le DNS sera mis à jour. Commencez donc par créer un compte (gratuit) sur dyndns.org, puis configurer un "host" (DNS + IP actuelle de la box), avant de reporter votre identifiant et mot de passe dans la configuration de votre box.

Enfin, si vous avez acheté un DNS pour votre site web, il suffit dans la configuration de votre compte chez votre registrar (exemple : OVH) de faire une redirection vers votre nom DynDNS.La mise à jour des

serveurs DNS publics peut prendre quelques heures avant d'enregistrer vos IP et nom DNS.


Sécurité

Rapidement, quelques points de sécurité à mettre obligatoirement en place si on ne veut pas compromettre son serveur web.

Configurer SSH
Une petite chose simple à faire c'est de désactiver la possibilité de se connecter en SSH avec l'utilisateur root

sudo vim /etc/ssh/sshd_config
    PermitRootLogin no

Firewall
Pour notre firewall, le plus simple reste un script avec des commandes iptables (moteur Netfilter). La aussi, je vous propose mon fork d'un script de Nicolargo.

sudo wget --no-check-certificate -O /etc/init.d/firewall https://raw.githubusercontent.com/P3ter/Serveur/master/debian/initscripts/firewall
sudo chmod a+x /etc/init.d/firewall
sudo update-rc.d firewall defaults 20
sudo /etc/init.d/firewall start

Attention : la commande "sudo /etc/init.d/firewall start" bloque tous les accès au serveur. Pour tout autoriser il faut lancer la commande "sudo /etc/init.d/firewall clear"

Un autre outil de sécurité qui faut installer : fail2ban. Installez simplement le paquet, la configuration par défaut suffit pour une protection minimale. Le rôle de fail2ban est de bloquer (par défaut) les adresses IP qui tentent des connexions SSH en brute force sur votre serveur. Attention, car avec la configuration par défaut, si vous vous trompé trois fois de mot de passe SSH (en connexion depuis Internet), vous serez banni par fail2ban pendant 1 heure.

Pour plus d'informations sur fail2ban, je vous conseil cet article de Nicolargo.

Si vous avez des questions, des remarques, des problèmes ou autre, n'hésitez pas à intervenir en commentaire ou sur Github.

Photo : David Jones (Creative Commons)

Fil RSS des commentaires de cet article

Écrire un commentaire

Quelle est le deuxième caractère du mot zlc86 ?