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

vignette

Rédigé par P3ter - - 15 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 la dernière lettre du mot jhwtr ?

#1  - Philippe a dit :

Bonjour,

Merci pour votre site.
Après avoir lancé la commande:
sudo ./nginxautoinstall-raspbian.sh
ça plante à l'opération "Compile nginx version 1.3.10

Répondre

#2  - Pedro CADETE a dit :

@Philippe : Bonjour, pouvez-vous mettre sur pastebin le contenu du fichier nginxautoinstall-xxxxxx.log se trouvant dans /tmp, puis partager le lien en commentaire ou me l'envoyer à : contact @ p3ter.fr ?

Répondre

#3  - Pedro CADETE a dit :

J'ai modifié les virtualhosts pour corriger le problème de Philippe. Plus d'info ici : https://github.com/P3ter/RaspberryPi/issues/1.

Répondre

#4  - enPassant a dit :

Putain encore une couche sur les installs
Pourquoi faire simple ... un bon petit guide

Qui ne ferait qu'expliciter quoi ? le script

Pfff et ça encombre le net :-()

Répondre

#5  - Kogychan a dit :

Hello,

Script sympa mais il semble y avoir un manque sur le github en effet nginx n'est plus dans /Serveur/Master du coup error sur "Install the NGinx init script" et plus tard bien évidemment "start NGinx".
La version téléchargée et compilée par le script était la 1.5.0
Je ne suis qu'un débutant en linux alors je ne sais trop quoi faire manuellement.
Merci par avance.

Répondre

#6  - Pedro CADETE a dit :

@Kogychan : Bonjour. Oui j'ai fait un peu de rangement sur mon Github et j'ai oublié de mettre à jour le script. C'est chose faite, j'ai fait un test et il fonctionne. Je vous invite donc à télécharger la dernière version du script (v1.1) et à le relancer.

Répondre

#7  - Mathieu a dit :

Hello,
Super script merci, en revanche petit bug (avec Ngnix 1.4.2) lorsque lancé via sudo, au moment de définir les properties de nginx à la fin il rale sur /etc/nginx/conf.d/ comme quoi ce dernier n'existe pas .... (même après le mkdir), pour régler le problème à lancer en root et niquel.

Répondre

#8  - Jmi a dit :

Bonjour,

Merci beaucoup pour ce tutorial et pour ce script!

Malheureusement après avoir lancé le script à la fin de l'install j'ai ce message:
------------------------------------------------------------------------------
Start processes
------------------------------------------------------------------------------
[OK] Start PHP cd
[ERROR] Start NGinx

Si je vais sur mon adresse IP je n'ai rien du tout. Malgré avoir mis un fichier .html.

Aurais-tu une solution?

J'ai installé WEBIDE d'Adafruit peut-être qu'il est en concurrence?

Merci d'avance.

Répondre

#9  - Pedro CADETE a dit :

@Jmi : Bonjour, essayez de relancer NGINX avec la commande sudo /etc/init.d/nginx restart. Avez-vous un message d'erreur ? Je ne connais pas bien WebIDE mais s'il utilise déjà le port 80 alors le problème doit venir delà. Dans ce cas modifiez le virtualhost pour utiliser un autre numéro de port (ligne listen 80).

Répondre

#10  - Alex a dit :

Très bon tutoriel, mais si je veux le désinstaller, comment je fais ?

Répondre

#11  - Alex a dit :

Bonjour,

J'ai fini par faire ça à la bourrin :
sudo rm -f -R /usr/local/nginx /usr/local/sbin/nginx /etc/nginx /etc/init.d/nginx /var/www/*
J'aurais peut être dû supprimer le daemon du rc.d ><

Je l'avais désinstaller parce que le rewriting ne fonctionnait pas malgré les informations données par le wiki de PluXML mais je me suis aperçu que j'avais le même problème sous apache2... Bref, si je peux utiliser nginx, ça m'arrange, mais si quelqu'un peut m'aider pour faire fonctionner le rewriting, ça serai sympa.

Cordialement,
Alexandre.

Répondre

#12  - Pedro CADETE a dit :

@Alex : Bonjour. Effectivement le script ne permet pas de désinstaller. Donc il faut faire ce que tu as fait, c'est à dire supprimer les fichiers manuellement. Tu peux aussi supprimer sans risque le fichier /etc/rc.d/nginx.Pour l'URL rewrite il faut qu'il soit activé dans ton virtualhost (ligne 23 à 31) : Virtualhost avec URL rewrite (version PluXml). Ensuite il faut activer l'option "Réécriture d'URL" dans l'administration de PluXml.

Répondre

#13  - Alex a dit :

Bonjour,

D'accord, merci de ton aide, mais j'ai fini par y revenir mais en utilisant le paquet Debian =]

J'ai un petit soucis par contre, ça concerne mes pages statiques. Celles-ci fonctionne parfaitement bien sans la réécriture mais ne fonctionne pas une fois activée, une idée ?

Je me suis servi de ceci pour activer la réécriture : http://www.it-wars.com/url-rewriting-avec-nginx-pour-pluxml.html/#form

Cordialement,
Alex

Répondre

#14  - Pedro CADETE a dit :

@Alex : Je t'invite à poser ta question sur forum.pluxml.org, la communauté y est très actives, tu auras surement une réponse ;-)

Répondre

#15  - Julien a dit :

Super, merci man!

Répondre