Tuto : Installation d’un serveur LEMP – Debian, Nginx, MariaDB, PHP 5 FPM, APC-cache

Attention : si vous lisez cet article après 2017, il risque d’être obsolète.

Voici un petit tuto sur comment installer un serveur web sur une machine Debian server 7 (Wheezy, mais vu la stabilité de la distro, ca devrait fonctionner aussi pour les futures releases) 64bits.

Au lieu d’utiliser le classique Apache/MySQL (architecture LAMP), je préfère utiliser Nginx/Mariadb, beaucoup plus performant selon moi. Par contre, avec nginx, fini les .htaccess compliqués, cette config se fait au niveau des vhost (et est beaucoup plus intuitive, même si ca nécessite un réapprentissage !).

Dans les lignes suivantes, je vais faire quelques manipulations que tu n’es pas obligé de suivre, comme par exemple la suppression du service apache ou l’installation de git. Tu peux sauter ces étapes si tu préfères. Ce guide est bien sûr destinés aux utilisateurs confirmés, qui savent comment utiliser linux en ligne de commande, aptitude, ouvrir et enregistrer un fichier texte et le principe de fonctionnement d’un serveur web.

Je te conseille aussi de te connecter en tant que « root » pour cet installation.

Partitions

premiere question, ou stocker les ressources fichiers pour un site web. Ca fait un peu débat dans l’univers linux.
La plupart des gens mettent ca dans /var/www car ce directory est déja créé dans la plupart des releases Debian. avec les bons droits (j’explique coment les configurer dans un autre réptoire de tout façon).
Le truc, c’est qu’il est plutot destiné a servir du cache que les sources. /var par terminologie est un directory pour des fichiers temporaires.

Dans le vrai esprit Linux, les fichiers devraient être dans /srv/www. Cette convention est assez récente.

D’autres préfère le mettre dans /opt, L ‘origine ce dossier est destiné a stocker des programmmes commerciaux indépendant du système.
Il est très souvent vide maintenant, et quand il ne l’est pas, il contient des programmes très importants. Souvent ces programmes installeront automatiquement leurs fichiers ici, sans te demander votre avis.

Maintenant, il faut aussi penser à partionner votre système. L’idéal est de créér monter /var ou /opt ou /srv comme une partition de taille indépendante, qui sera conservé meme si te réinstaller le système.

Utiliser la racine de /var pour monter une partition indépendante peut être une bonne idée, car c’est ici que la plupart des fichiers temporaires et logs sont créée. (et donc, que la taille du système va varier).
Etant donné que c’est un fichier utilisé pour écrire beaucoup de choses, on pourra choisir un système de fichier adapté pour cela.
Point négatif : si tu réinstalle le système, tu ne veux peut-être pas te récupérer tous les fichiers de cache et temporaire de l’ancien système. Ca pourrait peut-être faire des crash d’ailleurs.

Des personnes suggèrent d’utiliser /home/www-data et de paramétrer cet user avec un home, mais je trouve ça pas pratique ni évolutif dans le case d’un serveur web.

Dans ce tuto, je vais donc utiliser /srv comme répertoire racine pour stocker les sites web dans mes exemples. Si tu préfères /opt, à toi d’adapter les lignes de commande qui suivent.
Je monte mes partitions ainsi, sur une capacité de stockage de 500 Go (ne pas monter de partitions sur un hébergement ayant moins de 200 Go, l’espace devient compliqué a gérer à cause du cloisonnement) :

/ : 100 Go
/var : 150 Go (si ca dépasse, c’est qu’il y a trop de logs stockés)
/srv (ou /var/www ou /opt suivant ton choix) : le reste (250 Go)
Si vous utilisez différents users et stockez des fichiers dans /home, faite aussi une partition dédiée. Mais pour un serveur web, ca à peu d’intérêt. Pour un serveur de stockage par FTP, c’est par contre là qu’il faut mettre le maximum d’espace.

Et tout en ext4, si tu n’est pas famillier avec les types de systèmes de fichiers.

Note : Si tu utilises /opt on pourra de toute façon créer un lien symbolique vers /srv/www à la fin avec cette commande : ln -s /opt/www /srv/www

Préparation installation

apt-get update

apt-get install zip unzip htop vim

#Quelques programmes utilitaire optionnels : editeur texte, gestionnaire de tache avancé (htop). Tu peux remplacer vim par nano (déja installé) ou gedit si tu préfères. Dans ce tuto, j’utilise la commande vim pour éditer les fichiers.

apt-get install vim htop

#installation optionnelle : git

apt-get install git

#exécuter la commande suivante si tu as déja un serveur apaché installé et que tu veuille le désinstaller pour utiliser seulement nginx :

apt-get autoremove --purge apache2

Installation du serveur HTTP : nginx

apt-get install nginx

Installation de PHP 5 FPM et CLI

Pour nginx il faut utiliser php5-fpm au lieu de la librairie php5 standard. Cli, c’est pour faire du php en ligne de comma,de. Le php.ini à éditer pour votre config nginx sera /etc/php5/fpm/php.ini ; celui du php-cli sera /etc/php5/cli/php.ini

apt-get install php5-cli

apt-get install php5-fpm

apt-get install php5-mysql curl php5-curl php5-intl php5-tidy php5-xsl php5-mcrypt php5-imap

php5enmod mcrypt

php5enmod imap

service nginx restart

service php5-fpm restart

Installation de MariaDB

Mariadb est la version « libre » de MySQL, depuis son rachat par Oracle, gérée par le fondateur de Mysql lui-même (petite anecdote, ses deux filles s’appellent My et Maria). Pour garder une compatiblité complète avec toutes les librairies utilisant mysql, elle en garde les mêmes noms de commandes.
A tel point que tes applications, ne verront pas la différence à l’utilisation. Ces lignes de comandes sont spécifiques a la version 10.0, qui était la dernière version stable au moment ou j’ai écrit ce tuto. T devrais jeter un oeil ici pour actualiser ces lignes de commandes. Dans ce cas vérifier avant quelle est la dernière version stable sur le site officiel, histoire de pas installer une version beta.

sudo apt-get install python-software-properties

apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

add-apt-repository 'deb http://ftp.heanet.ie/mirrors/mariadb/repo/10.0/debian wheezy main'

apt-get update

apt-get install mariadb-server

service mysql restart
mysql_secure_installation 
     (ensuite répondre à chaque question par "Y". Bien noter le mot de passe root choisi, et le choisir très complexe, au moins 15-20 charactères)

Montage de votre premier sites web et vhost

Je te suggères de toujours garder cette hiérarchie :
/srv/wwww/(nom du domaine ou projet)/(nom du sous-domaine ou site, ou ‘site’ par defaut)/(fichiers)
Ainsi par exemple le répertoire mondomaine/www contiendra le site racine pointé par mondomaine.com et www.mondomaine.com ; tandis que le répertoire mondomaine/phpmyadmin sera pointé par phpmyadmin.mondomaine.com, etc.
Ces différents sous-dossiers vont te permettre par exemple de faire cohabiter des sites apaches, tomcat et nginx, et des « versions » ou backup de sites web

mkdir -p /srv/www
cd /srv/www

Remplace mondomaine par le nom de ton site (généralement le nom de domaine sans l’extension).

<

pre>mkdir -p mondomaine/site
cd mondomaine/site

Ensuite il te restera plus qu’a copier dans www/ les fichiers de ton site (une simple page index.php affichant « bonjour » peut faire l’affaire).

chown -R www-data:www-data /srv/www
chmod -R g+rwX /srv/www
chmod -R o-rwx /srv/www

find /srv/www -type d -exec chmod g+s '{}' \;

cd /etc/nginx/sites-available

vim /etc/nginx/sites-available/mondomaine

Voici un vhost basique que je te propose de copier-coller (en adaptant les premières lignes au nom de ton site) :

server {
    listen   80;
    root /srv/www/mondomaine/site;
    index index.php index.html;
    server_name mondomaine.com www.mondomaine.com *.mondomaine.com

    location / {
        try_files $uri $uri/ /index.php;
    }
    
    client_max_body_size 3M;

    error_page 403 /index.php;

    # pass the PHP scripts to FastCGI server listening on /var/run/php5-fpm.sock
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    access_log   /var/log/nginx/www.mondomaine.access.log;
    error_log   /var/log/nginx/www.mondomaine.error.log;
}

Enregistre et active le vhost :

ln -s /etc/nginx/sites-available/mondomaine /etc/nginx/sites-enabled/mondomaine

service nginx restart

Bonus : Installation de phpMyAdmin

Ce n’est pas recommandé pour un serveur de production en raison des possibles failles de sécurité. Mais sinon c’est un outils pratique pour « dépanner », pouvoir accéder à votre base de donnée de n’importe ou.

Je ne peux que te recommander cet article si ca t’intéresses. Il faudra adapter votre répertoire nginx lors du lien symbolique :

sudo apt-get install phpmyadmin

Je te recommande ensuite de laisser tout les choix par défaut, sauf quand l’assistant te demandera le mot de passe root, et quand il te sera demandé d’adapter phpmyadmin à apache ou lighthttpd, faites TAB-TAB Cancel.

Ensuite il restera plus qu’a pointer un lien symbolique entre votre dossier web et phpmyadmin, puis créer un vhost nginx


ln -s /usr/share/phpmyadmin /srv/www
vim /etc/nginx/sites-available/phpmyadmin

Si tu n’es pas familier avec nginx, je te propose de remplir le fichier comme ceci :

server {
    listen   80;
    root /srv/www/phpmyadmin;
    index index.php;
    server_name pma.mondomaine.com;

    location / {
        try_files $uri $uri/ /index.php;
    }

    error_page 403 /index.php;

    # pass the PHP scripts to FastCGI server listening on /var/run/php5-fpm.sock
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    access_log   /var/log/nginx/phpmyadmin.access.log;
    error_log   /var/log/nginx/phpmyadmin.error.log;
}

PS : pour des raisons de sécurité, je te déconseille de faire pointer votre installation sur un sous-domaine facile à deviner, comme phpmyadmin.mondomaine.com ou pma.mondomaine.com. Change-le au niveau de server_name. Ensuite il reste plus qu’à activer le vhost :

ln -s /etc/nginx/sites-available/phpmyadmin/etc/nginx/sites-enabled/phpmyadmin
service nginx restart

Et à te rendre à l’adresse que tu as indiquée dans server_name voir si tout marche bien…

Gestionnaire de cache : APC Cache

Maintenant on va installer un gestionnaire de cache. Mon préféré est APC Cache.

sudo apt-get install php-apc
vim /etc/php5/fpm/php.ini

Chercher dans le fichier le titre Module settings (sous vim, tapez /Module S) , écrivez extension=apc.so juste avant ce titre cela permet d’indiquer à nginx qu’il doit utiliser cette extension.

Et juste après le Module settings, écrivez

[APC]
apc.enabled=1
apc.shm_size=256
apc.stat=0

Met plutôt apc.stat = 1 si tu développe directement sur ce serveur. Ainsi APC va vérifier si la page a changé a chaque requête, auquel cas il va régénérer le cache. C’est bien plus plus lent. Le fichier doit donc ressembler maintenant à ça :

extension=apc.so

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;


[APC]
apc.enabled=1
apc.shm_size=128M
apc.stat=0

Enregistrer le fichier et redémarrer les services http et php pour prendre en compte les modifications. Pour plus de détails sur la configuration d’APC, je te suggères de regarder la doc officielle.

service php5-fpm restart
service nginx restart

Bonus : créer des alias et enregistrer l’historique de commandes

je te suggères maintenant créer quelques alias de lignes de commande, pour accéder facilement aux répertoires des sites, backuper votre base de donnée ou redémarrer les services web par exemple.

vim /root/.bashrc

Copier-coller ceci en fin du fichier :

#l = ls -lhA colorized:
export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias l='ls $LS_OPTIONS -lhA --author $1'

#b = cd ..
alias b='echo "^ Back to parent dir:" ; cd .. ; pwd'

#www = cd on sites directory
alias www='cd /srv/www/ ; l'

#sqldumpall  = create a sql dump of all db with timestamp in the name
alias sqldumpall='mysqldump - host localhost -u root -p -A | gzip > ~/mariadump-alldb-`date +"%Y-%m-%d-%H%M%S"`.sql.gz'

alias phpini='vim /etc/php5/fpm/php.ini' 

alias restart-http='service nginx restart'
alias restart-php='service php5-fpm restart'
alias restart-db='service mysql restart'
alias restart-all='restart-php ; restart-http ; restart-db'

#az = edit this file
#za = compile the changes
alias az='vim /root/.bashrc'
alias za='source /root/.bashrc'
source /root/.bashrc

Tu peux bien sûr adapter ces alias sur d’autres utilisateurs que root. il te faudra donc éditer leurs fichier ~/.bashrc, installer sudo et préfixer certains alias par cette commande.

#Garder une trace de toutes ces commandes d’install

history > /root/install_lemp.txt

Il ne te reste plus qu’à bien configurer tes sites-available, et bien sûr faire/transférer tes sites web et pointer leurs noms de domaine sur cette machine.

On peut également optimiser cette config avec un proxy-cache comme Polipo ou squid, installer un serveur de mail (comme Postfix pour un serveur de production, ou Mailcatcher pour un serveur de test) et renforcer la sécurité. J’y viendrais dans un prochain article, mais tu as déja un serveur web totalement fonctionnel et opérationnel !

5 réflexions sur « Tuto : Installation d’un serveur LEMP – Debian, Nginx, MariaDB, PHP 5 FPM, APC-cache »

  1. pas mal le tuto, merci !
    attention quelques oublis :
    – ici ; à la fin :
    server_name mondomaine.com http://www.mondomaine.com *.mondomaine.com
    server_name mondomaine.com http://www.mondomaine.com *.mondomaine.com;
    – ici un espace manquant :
    ln -s /etc/nginx/sites-available/phpmyadmin/etc/nginx/sites-enabled/phpmyadmin
    ln -s /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enabled/phpmyadmin
    bonne continuation

    1. C’est exact Bud, merci beaucoup pour tes observations, je viens de rectifier 😉

  2. Super tuto! Merci beaucoup pour le partage! 🙂 Tout marche très bien, et mes sites n’ont jamais été aussi rapides! 😀

  3. Salut, merci encore pour ton super tuto!
    Cependant je rencontre un bug avec le dump sur la base de données. J’ai le message d’erreur suivant :

    -bash: –all-databases | gzip > /opt/dumps/mariadump-alldb-`date + »%Y-%m-%d-%H%M%S »`.sql.gz: No such file or directory

    Aurais-tu une idée d’où cette erreur pourrait venir ? 🙂

  4. Salut !

    Merci c’est cool de partager, ça m’intérresse mais à ce niveau c’est un peu pourri sur le net.

    J’aurais bien aimé que tu développes un peu plus mais ça pourrait être prise de tête… En tout cas merci pour ton partage, tu m’as bien aidé !

Les commentaires sont fermés.