Installer Debian 10 avec Apache/PHP/MySQL sur Windows via WSL

Article mis à jour le 21/11/2019.

Depuis la build 14316 de Windows 10, il est possible d’installer une distribution GNU/Linux sur Windows (parmi les distributions disponibles sur le Store: Ubuntu, Debian, OpenSuse, …) et d’y accéder via l’invité de commande.

Cette fonctionnalité, appelée WSL (Windows Subsystem for Linux), est très intéressante pour le développement web sur Windows car elle permet d’avoir un environnement de travail Linux complet et nous évite donc d’avoir à installer une machine virtuelle, d’utiliser Cygwin ou des logiciels comme WAMP Server.

Le but de cet article est d’installer un serveur Apache/PHP/MySQL sur une distribution Debian via WSL et d’avoir accès au répertoire /var/www de cette distribution sur Windows.

Assez souvent, on entend parler d’Ubuntu sur Windows car c’est avec cette distribution que tout à commencé mais comme je l’ai dis précédemment plusieurs distributions sont disponibles. J’utilise personnellement Debian, ce tuto sera donc basé dessus. A l’heure ou j’écris ces lignes, la version disponible est Debian 10 Buster.

Ces informations proviennent de plusieurs essais et recherches personnelles, j’espère donc qu’elles vous seront utiles.

 

Activation de WSL et installation de Debian 10

Commençons par l’installation de Debian sur Windows. Pour cela, on va activer la fonction WSL de Windows en ouvrant le PowerShell en mode administrateur et en tapant la commande suivante:

Ensuite, il suffit de télécharger la distribution Debian via le Windows Store. Une fois fait, il vous suffira de suivre les instructions du terminal.

 

Configuration serveur LAMP

Passons maintenant aux choses sérieuses !
L’installation d’Apache/PHP/MySQL se fait de façon assez classique, seules quelques manipulations supplémentaires seront nécessaires pour pouvoir travailler avec ce serveur sous Windows.

Apache

  1. Mettez à jour la liste des packages:
  2. Installez Apache2 et ses dépendances
  3. Pour éviter l’erreur Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT, ajoutez les lignes suivantes à la fin du fichier de configuration d’Apache ( sudo nano /etc/apache2/apache2.conf):
  4. Maintenant, activez le mode rewrite et démarrez Apache2:
  5. Par défaut, Apache met ses fichiers dans /var/www/html. Afin de simplifier la structure des répertoires, on va tout mettre dans /var/www.
    Pour cela, on va d’abord déplacer le fichier index.html de /var/www/html dans /var/www:
    Puis supprimer le répertoire html:
    Ensuite, il va falloir dire à Apache que la structure à changé. Pour cela, il faut modifier le fichier VirtualHost de base ( sudo nano /etc/apache2/sites-available/000-default.conf) et remplacer tout son contenu par le suivant:
  6. Un petit sudo service apache2 restart et votre serveur est prêt ! 😀
    Pour tester rendez-vous sur l’adresse http://127.0.0.1 dans votre navigateur. Si tout se passe bien, It works !

PHP

  1. Passons maintenant à PHP ainsi que quelques modules (tous les modules ne sont pas obligatoires mais fortement recommandés):
  2. Redémarrez Apache2:

MySQL (MariaDB)

  1. C’est maintenant au tour de la base de données MySQL (C’est MariaDB qui est à présent installé par défaut sur Debian):
  2. Lors de l’installation, MariaDB ne demande pas de créer de mot de passe et ce pour une bonne raison: dans Debian, l’utilisateur root de MariaDB est lié à des scripts de maintenance automatisés. Ajouter un mot de passe au compte root casserait le fonctionnement de ces scripts. La méthode est donc d’une part d’interdire l’accès au compte root de MariaDB en dehors du local et d’autre part de créer un utilisateur qui servira à la manipulation de la base de données.
    Pour cela, la première étape est d’utiliser le script de sécurisation fourni avec MariaDB en tapant la commande:
    Cette commande va tout d’abord vous demander de saisir le mot de passe actuel de la base de donnée. N’en ayant pas, appuyez juste sur la touche entrée. Ensuite, il vous demandera si vous voulez changer le mot de passe root, question à laquelle il faudra répondre non. Il va vous poser plusieurs questions auxquelles il faudra toutes répondre par oui. Voici les questions:
  3. Maintenant, créons notre utilisateur. Pour cela, se connecter au client MySQL via la commande sudo mysql -u root et y taper les commandes suivantes (bien évidemment, remplacez utilisateur_mysql et mot_de_passe_mysql par un nouveau login et mot de passe):

  4. Enfin, lancez MySQL:
  5. En bonus, pour se connecter via une interface web à notre base de données, nous pouvons installer Adminer (phpMyAdmin n’étant pas présent dans les packages de Debian 10).
    Pour cela, dans le répertoire /var/www, lancer la commande:
    (Note: si la commande wget retourne une erreur, installer celle-ci via sudo apt-get install wget et recommencer).
    Ensuite dans le navigateur, tapez: http://127.0.0.1/adminer.php, y renseigner l’utilisateur (celui que vous venez de créer) et son mot de passe.

 

Accéder aux fichiers Linux via Windows

Notre serveur LAMP est maintenant installé et fonctionnel mais nous aimerions pouvoir accéder à ses fichiers pour commencer à développer.
Deux méthodes sont possibles ici:

  • En passant par le réseau, c’est la méthode officielle
  • En passant par un lien symbolique

Laquelle choisir ? A vous de choisir, voici les informations à savoir:

  • La méthode officielle fonctionne sans problème et permet de gérer les droits d’écriture, les fichier étant sur la partition Linux. L’accès via Windows se fait via un serveur 9P sur Debian dont Windows est le client. Les fichiers de Debian sont donc accessibles via les périphériques réseau. Cette méthode présente cependant deux inconvénients: d’une part si Debian n’est pas lancé il est impossible d’accéder aux fichiers, d’autre part l’accès est lent (par exemple PhpStorm va mettre du temps à scanner les fichiers et va afficher des messages d’erreur tandis qu’un client Git comme Fork ou SourceTree mettrons beaucoup de temps à réagir à chaque action).
  • La méthode officieuse qui est de créer un répertoire sur Windows ou les projets seront stockés, donc accessibles à tout moment et sans ralentissement et de faire un lien dans Debian entre ce répertoire et /var/wwww. L’inconvénient c’est qu’il est dès lors impossible de gérer les droits d’accès, les fichiers étant stockés sur le système de fichiers Windows qui ne gère pas les droits Unix.

Dans les deux cas, il faudra commencer par ajouter à votre utilisateur Debian le groupe www-data:

 

A – Méthode réseau

Depuis l’update 1903 de Windows publiée en octobre 2019, il est possible d’accéder facilement aux fichiers de la distribution via l’explorateur de fichiers Windows en tapant dans la barre d’adresse \\wsl$\Debian.
De plus dans le terminal Debian, à l’intérieur d’un répertoire la commande explorer.exe . ouvrira l’explorateur de fichiers Windows dans ce répertoire.

Afin de faciliter l’accès au répertoire /var/www à votre IDE, le plus simple d’utiliser la fonction “Connecter un lecteur réseau” en renseignant une lettre et en indiquant \\wsl$\Debian dans “Dossier“.

Régler les droits d’écriture

Vous remarquerez bien assez rapidement que vous pouvez écrire dans le répertoire /var/www depuis l’explorateur de fichiers Windows mais pas depuis le terminal, en tout cas pas sans taper la commande sudo.
En fait, les fichiers créés via l’explorateur de fichiers sont considérés comme édités par l’utilisateur root sur Debian, utilisateur qui a donc tous les droits sur la machine, alors que dans le terminal c’est votre utilisateur perso qui est utilisé (qui lui, n’a pas tous les droits).
Pour régler le problème d’écriture avec votre compte perso sur Debian, voici les étapes à suivre:

  1. Changer le groupe propriétaire du répertoire par www-data (le groupe de l’utilisateur qui gère Apache)
  2. Donner au groupe www-data le droit d’écriture dans le répertoire /var/www:
  3. Déconnectez votre utilisateur Debian via la commande exit afin que l’ajout du groupe soit opérationnel et reconnectez vous ensuite.

Normalement vous pourrez créer et modifier des fichiers dans le répertoire /var/www et ses sous répertoires ! (Pour tester, créer un fichier de test via la commande touch test).

B – Méthode lien symbolique

  1. Il faut tout d’abord créer dans Windows le répertoire qui accueillera vos projets. Par exemple: C:\www. Debian pouvant accéder aux fichiers Windows via le point de montage /mnt/c, il va être facile de créer un lien.
    Dans le terminal Debian il faut renommer le répertoire /var/www original puis créer un lien vers le répertoire C:\www:
    Vous pourrez constater via la commande ls -ail /var qu’il existe dès lors dans le répertoire /var un lien www qui mène vers le répertoire /mnt/c/www correspondant sur Windows à C:\www. Ce lien est accessible comme un répertoire traditionnel.
  2. Cependant, Apache/PHP n’auront pas les droits sur les fichiers ce qui peut poser un problème à vos applications. Pour régler ce problème, nous allons indiquer à Apache qu’il doit se lancer via votre utilisateur. Pour cela, ouvrez le fichier /etc/apache2/envvars en sudo, repérez les deux lignes suivantes et modifiez www-data avec votre nom d’utilisateur Linux :
  3. L’utilisateur d’Apache ayant changé, il faut aussi changer les droits d’accès du répertoire des sessions php à savoir /var/lib/php/sessions:

Redémarrez Apache et à priori il ne devrait y avoir aucun problème.
 

Note

Les distributions WSL ne peuvent pas charger de processus automatiquement à leur démarrage. Il faudra donc relancer à chaque fois tous les services que vous installerez.
Par exemple ici, pour Apache2 et MySQL il faudra taper à chaque démarrage sudo service apache2 start && sudo service mysql start.
Pour palier à ça, le plus facile est de créer un alias qui va permettre de lancer ces deux commandes via une seule. Pour cela, dans le fichier ~/.bash_aliases (le créer si il n’existe pas), ajouter la ligne suivante:

Redémarrez votre terminal pour que la nouvelle commande soit chargée.
Maintenant, à chaque lancement de votre terminal vous n’aurez plus qu’à taper la commande lamp (ou tout autre alias que vous aurez choisi) pour démarrer Apache2 et MySQL en même temps.
 

Astuces

  • Vous pouvez aussi ajouter un nom de domaine fictif pour accéder à un de vos projets (ex: http://monprojet.local).P our cela une fois le VirtualHost créé dans Apache il faut juste ajouter la ligne suivante au fichiers hosts Windows (C:\Windows\System32\drivers\etc): 127.0.0.1 monprojet.local.
    Perso, pour modifier rapidement et facilement le fichier hosts dès que je commence un projet, j’utilise Hosts File Editor qui est un petit logiciel bien pratique.
  • L’application Windows Terminal de Microsoft (disponible sur le Windows Store)
  • est un terminal plus agréable à utiliser, léger et hyper-configurable (via un fichier JSON pour le moment).
    Il propose de base l’intégration avec Debian en WSL ainsi que le CMD et PowerShell, le tout avec un système d’onglets.
    Il est possible de lui configurer des couleurs spécifiques pour chaque terminal, des raccourcis clavier pour par exemple faire des écrans splittés, rajouter un fond d’écran animé,… les possibilités sont multiples et les informations se trouvent en fouillant sur le net.
    Perso, voici ma configuration (Terminal Debian lancé au démarrage, utilisateur directement placé dans le répertoire /var/www, fond de fenêtre transparent):

0 0 vote
Article Rating
S'abonner
Me notifier des
guest
5 Commentaires
plus anciens
plus récents plus de votes
Inline Feedbacks
View all comments
Tomolimo

Bonjour,
La commande mysql_secure_installation ne doit-elle pas être passée en sudo ?
Merci,
Cordialement
Tomolimo

Neo1976_

Merci pour ce tuto très bien fait !
J’ai une remarque et une question :
1/ avant de lancer “sudo mysql_secure_installation” j’ai dû lancer “sudo service mysql start’, sinon je ne pouvais pas lancer “mysql_secure_installation” sans lessage d’erreur
2/ mon http://127.0.0.1 ne fonctionne pas, et je ne sais pas où trouver d’éventuelles logs d’erreur. J’ai bien essayé d’aller voir dans “${APACHE_LOG_DIR}/error.log”, mais ma variable ${APACHE_LOG_DIR} est vide : j’ai oublié quelque chose ?
Merci d’avance pour votre aide !

Neo1976_

Merci Benjamin pour votre réponse.
Apache semble bien lancé : [ ok ] apache2 is running.
Dans le rép de log, je ne trouve pas grand chose d’exploitable à mon niveau :
/var/log/apache2$ ls -ltr
total 4
-rw-r—– 1 root adm 0 Mar 18 22:09 access.log
-rw-r—– 1 root adm 0 Mar 18 22:09 other_vhosts_access.log
-rw-r—– 1 root adm 2221 Mar 21 13:46 error.log
Dans error.log :
[Sat Mar 21 13:46:33.656723 2020] [mpm_prefork:notice] [pid 33] AH00163: Apache/2.4.38 (Debian) configured — resuming normal operations
[Sat Mar 21 13:46:33.657144 2020] [core:notice] [pid 33] AH00094: Command line: ‘/usr/sbin/apache2’

Tout me semble en ordre…