Installer un environnement de développement PHP/MySQL sous Linux Ubuntu

jeudi 10 septembre 2009

Cet article explique en images comment installer et configurer un environnement de développement Web sous Linux Ubuntu : le serveur web Apache 2, avec un moteur PHP, et le serveur de base de données MySQL accompagné de quelques outils graphiques d'administration.

Cet article explique en images comment installer et configurer un environnement de développement Web sous Linux Ubuntu : le serveur web Apache 2, avec un moteur PHP, et le serveur de base de données MySQL accompagné de quelques outils graphiques d’administration.

Le tutoriel est agrémenté de nombreuses images qui, souvent, se suffisent à elles-mêmes pour expliquer l’étape qu’elles représentent. C’est notamment le cas des images représentant une fenêtre de terminal : tapez la commande telle qu’elle apparaît sur l’image, et validez avec la touche entrée. Afin de faciliter la lecture des captures d’écran les plus complexes, un cadre bleu entoure la zone qui doit retenir votre attention.

La première chose à faire est de récupérer et d’installer les paquets des serveurs. Nous allons installer Apache2, Php5 et MySQL5.

NB: si vous n’avez pas accès à l’interface graphique, que vous passiez par une connexion SSH ou que vous n’ayez tout simplement pas installé de serveur graphique -Ubuntu Server-, installez LAMP avec l’instruction suivante : sudo tasksel install lamp-server

Pour ce faire, lancez le Gestionnaire de paquets Synaptic (menu Système → Administration) puis choisissez Sélectionner des paquets par tâche… dans le menu Édition. Vous verrez alors la fenêtre suivante :

screenshot_001

Sélectionnez LAMP Server, comme indiqué sur l’image. Validez ensuite votre choix. Il vous sera demandé d’installer d’autres paquets, dont dépendent les paquets LAMP :

screenshot_002

Cliquez sur Ajouter à la sélection, puis appliquez les changements en cliquant sur Appliquer :

screenshot_003

Un fenêtre vous demandera de confirmer l’installation des paquets, et vous confirmerez :

screenshot_004

Les paquets seront ensuite téléchargés (nécessite une connexion Internet) :

screenshot_005

Avant que les paquets soient installés, il est possible que le script d’installation vous demande de saisir un mot de passe MySQL, puis de le confirmer. Si tel est le cas, entrez un mot de passe (dont vous vous souviendrez…) et confirmez :

screenshot_006

screenshot_007

Les paquets s’installent ensuite sans que vous ayez à intervenir :

screenshot_008

screenshot_009

Lorsque l’installation est terminée, fermez le gestionnaire de paquets Synaptic et lancez votre navigateur (dans ce tutoriel, j’utilise Opera, mais Firefox, Chrome, Konqueror ou n’importe quel autre navigateur feront aussi bien l’affaire). Dans la barre d’adresse, entrez http://localhost/ ou cliquez sur ce lien.

screenshot_010

Si vous voyez le message It Works! c’est que le serveur Apache fonctionne. La première étape est terminée. Il reste maintenant à rajouter à Apache la gestion des scripts PHP. Pour ce faire, commencez par ouvrir une fenêtre de terminal et entrez la commande gksu gedit /var/www/index.php :

screenshot_014

Quelques remarques :
1) A partir de maintenant, pour ce tutoriel, lorsque vous verrez une image représentant une fenêtre de terminal, comme ci-dessus, lisez la commande et utilisez-la. Les commandes ne seront plus écrites dans le corps du texte du tutoriel.
2) J’utilise Gnome et, par conséquent, le logiciel gedit et la commande gksu pour passer en root. Si vous utilisez KDE, remplacez gksu gedit par kdesu kate (ceci est également valable pour la suite).
3) Les commandes passées en root (avec gksu ou sudo) nécessiteront parfois que vous entriez le mot de passe administrateur. Avec Ubuntu, il s’agit du mot de passe de votre compte utilisateur (celui que vous entrez pour accéder à votre bureau). Rien n’apparaît à l’écran lorsque vous tapez votre mot de passe : c’est normal, il s’agit d’une mesure de sécurité. Entrez simplement le mot de passe lorsqu’il est demandé, puis validez avec la touche Entrée.

La commande précédente a eu pour effet d’ouvrir une fenêtre de l’éditeur gedit et de créer le fichier index.php dans le répertoire /var/www. Recopiez le code <?php phpinfo(); ?> dans la zone d’édition, comme ceci :

screenshot_015

Enregistrez les changements et fermez la fenêtre de gedit. Il faut maintenant éditer le fichier de configuration d’Apache, pour lui indiquer de prendre en compte les fichier PHP comme des scripts à exécuter. Tapez la commande suivante :

screenshot_011

Rendez-vous à la fin du fichier, et ajoutez les deux lignes indiquées :

screenshot_012

Fermez gedit et relancez Apache à l’aide de la commande sudo /etc/init.d/apache2 restart :

screenshot_013

Apache se relance avec un message d’erreur («Could not reliably…») qui n’a pas d’incidence sur son fonctionnement. Apache nous dit seulement qu’aucun nom de domaine n’est associé à l’adresse locale 127.0.0.1 : nous réglerons cela plus tard.

Pour vérifier si cela fonctionne, chargez l’adresse http://localhost/index.php dans votre navigateur ou cliquez sur ce lien.

screenshot_016

Vous pouvez constater, en haut de la page, que peu d’extensions sont chargées. Nous allons donc en installer quelques unes parmi les plus utiles. Entrez la commande indiquée dans l’image suivante, puis confirmez (en appuyant sur Entrée) lorsque cela vous est demandé :

screenshot_017

Le message complet qui est affiché est le suivant :

guillaume@netbook:~$ sudo apt-get install php-pear php5-cli php5-gd php5-sqlite php5-xsl php5-mcrypt php5-curl php5-imap
Lecture des listes de paquets… Fait
Construction de l’arbre des dépendances
Lecture des informations d’état… Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
linux-headers-2.6.28-11 linux-headers-2.6.28-11-generic
Veuillez utiliser « apt-get autoremove » pour les supprimer.
Les paquets supplémentaires suivants seront installés :
libc-client2007b libcurl3 libgd2-xpm libmcrypt4 libt1-5 mlock
Paquets suggérés :
uw-mailutils libgd-tools libmcrypt-dev mcrypt php5-dev php4-dev
Les paquets suivants seront ENLEVÉS :
libgd2-noxpm
Les NOUVEAUX paquets suivants seront installés :
libc-client2007b libcurl3 libgd2-xpm libmcrypt4 libt1-5 mlock
php-pear php5-cli php5-curl php5-gd php5-imap php5-mcrypt
php5-sqlite php5-xsl
0 mis à jour, 14 nouvellement installés, 1 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 4420ko dans les archives.
Après cette opération, 11,4Mo d’espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ? o
Réception de : 1 http://fr.archive.ubuntu.com jaunty/universe mlock 8:2007b~dfsg-1.1 [31,4kB]
Réception de : 2 http://fr.archive.ubuntu.com jaunty/universe libc-client2007b 8:2007b~dfsg-1.1 [747kB]
Réception de : 3 http://fr.archive.ubuntu.com jaunty-updates/main libcurl3 7.18.2-8ubuntu4.1 [220kB]
Réception de : 4 http://fr.archive.ubuntu.com jaunty/main libgd2-xpm 2.0.36~rc1~dfsg-3ubuntu1 [211kB]
Réception de : 5 http://fr.archive.ubuntu.com jaunty/universe libmcrypt4 2.5.7-5ubuntu1 [81,2kB]
Réception de : 6 http://fr.archive.ubuntu.com jaunty/main libt1-5 5.1.2-3 [154kB]
Réception de : 7 http://fr.archive.ubuntu.com jaunty-updates/main php5-cli 5.2.6.dfsg.1-3ubuntu4.2 [2488kB]
Réception de : 8 http://fr.archive.ubuntu.com jaunty-updates/main php-pear 5.2.6.dfsg.1-3ubuntu4.2 [330kB]
Réception de : 9 http://fr.archive.ubuntu.com jaunty-updates/main php5-curl 5.2.6.dfsg.1-3ubuntu4.2 [23,9kB]
Réception de : 10 http://fr.archive.ubuntu.com jaunty-updates/main php5-gd 5.2.6.dfsg.1-3ubuntu4.2 [32,5kB]
Réception de : 11 http://fr.archive.ubuntu.com jaunty/universe php5-imap 5.2.6-0ubuntu5 [38,3kB]
Réception de : 12 http://fr.archive.ubuntu.com jaunty/universe php5-mcrypt 5.2.6-0ubuntu2 [15,3kB]
Réception de : 13 http://fr.archive.ubuntu.com jaunty-updates/main php5-sqlite 5.2.6.dfsg.1-3ubuntu4.2 [34,8kB]
Réception de : 14 http://fr.archive.ubuntu.com jaunty-updates/main php5-xsl 5.2.6.dfsg.1-3ubuntu4.2 [12,8kB]
4420ko réceptionnés en 4s (973ko/s)
dpkg : libgd2-noxpm : problème de dépendance, mais suppression comme demandé :
libgraphviz4 dépend de libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg) ; cependant :
Le paquet libgd2-noxpm doit être supprimé.
Le paquet libgd2-xpm n’est pas installé.
(Lecture de la base de données… 135076 fichiers et répertoires déjà installés.)
Suppression de libgd2-noxpm …
Traitement des actions différées (« triggers ») pour « libc6 »…
ldconfig deferred processing now taking place
Sélection du paquet mlock précédemment désélectionné.
(Lecture de la base de données… 135067 fichiers et répertoires déjà installés.)
Dépaquetage de mlock (à partir de …/mlock_8%3a2007b~dfsg-1.1_i386.deb) …
Sélection du paquet libc-client2007b précédemment désélectionné.
Dépaquetage de libc-client2007b (à partir de …/libc-client2007b_8%3a2007b~dfsg-1.1_i386.deb) …
Sélection du paquet libcurl3 précédemment désélectionné.
Dépaquetage de libcurl3 (à partir de …/libcurl3_7.18.2-8ubuntu4.1_i386.deb) …
Sélection du paquet libgd2-xpm précédemment désélectionné.
Dépaquetage de libgd2-xpm (à partir de …/libgd2-xpm_2.0.36~rc1~dfsg-3ubuntu1_i386.deb) …
Sélection du paquet libmcrypt4 précédemment désélectionné.
Dépaquetage de libmcrypt4 (à partir de …/libmcrypt4_2.5.7-5ubuntu1_i386.deb) …
Sélection du paquet libt1-5 précédemment désélectionné.
Dépaquetage de libt1-5 (à partir de …/libt1-5_5.1.2-3_i386.deb) …
Sélection du paquet php5-cli précédemment désélectionné.
Dépaquetage de php5-cli (à partir de …/php5-cli_5.2.6.dfsg.1-3ubuntu4.2_i386.deb) …
Sélection du paquet php-pear précédemment désélectionné.
Dépaquetage de php-pear (à partir de …/php-pear_5.2.6.dfsg.1-3ubuntu4.2_all.deb) …
Sélection du paquet php5-curl précédemment désélectionné.
Dépaquetage de php5-curl (à partir de …/php5-curl_5.2.6.dfsg.1-3ubuntu4.2_i386.deb) …
Sélection du paquet php5-gd précédemment désélectionné.
Dépaquetage de php5-gd (à partir de …/php5-gd_5.2.6.dfsg.1-3ubuntu4.2_i386.deb) …
Sélection du paquet php5-imap précédemment désélectionné.
Dépaquetage de php5-imap (à partir de …/php5-imap_5.2.6-0ubuntu5_i386.deb) …
Sélection du paquet php5-mcrypt précédemment désélectionné.
Dépaquetage de php5-mcrypt (à partir de …/php5-mcrypt_5.2.6-0ubuntu2_i386.deb) …
Sélection du paquet php5-sqlite précédemment désélectionné.
Dépaquetage de php5-sqlite (à partir de …/php5-sqlite_5.2.6.dfsg.1-3ubuntu4.2_i386.deb) …
Sélection du paquet php5-xsl précédemment désélectionné.
Dépaquetage de php5-xsl (à partir de …/php5-xsl_5.2.6.dfsg.1-3ubuntu4.2_i386.deb) …
Traitement des actions différées (« triggers ») pour « man-db »…
Paramétrage de mlock (8:2007b~dfsg-1.1) …
Paramétrage de libc-client2007b (8:2007b~dfsg-1.1) …

Paramétrage de libcurl3 (7.18.2-8ubuntu4.1) …

Paramétrage de libgd2-xpm (2.0.36~rc1~dfsg-3ubuntu1) …

Paramétrage de libmcrypt4 (2.5.7-5ubuntu1) …

Paramétrage de libt1-5 (5.1.2-3) …

Paramétrage de php5-cli (5.2.6.dfsg.1-3ubuntu4.2) …

Creating config file /etc/php5/cli/php.ini with new version

Paramétrage de php-pear (5.2.6.dfsg.1-3ubuntu4.2) …
Paramétrage de php5-curl (5.2.6.dfsg.1-3ubuntu4.2) …

Paramétrage de php5-gd (5.2.6.dfsg.1-3ubuntu4.2) …

Paramétrage de php5-imap (5.2.6-0ubuntu5) …
Paramétrage de php5-mcrypt (5.2.6-0ubuntu2) …
Paramétrage de php5-sqlite (5.2.6.dfsg.1-3ubuntu4.2) …

Paramétrage de php5-xsl (5.2.6.dfsg.1-3ubuntu4.2) …

Traitement des actions différées (« triggers ») pour « libc6 »…
ldconfig deferred processing now taking place
guillaume@netbook:~$
</code>

Rechargez ensuite la configuration du serveur (ou relancez le avec apache2 restart) :

screenshot_018

Rachraîchissez la page dans votre navigateur pour voir la liste des extensions installées :

screenshot_019

Réglons maintenant le problème de l’adresse 127.0.0.1 qui n’est associée à aucun domaine. Éditez à nouveau le fichier apache2.conf (avec la commande : gksu gedit /etc/apache2/apache2.conf) et rajoutez la ligne suivante en fin de fichier :

screenshot_020

Relancez ensuite Apache, et constatez que le message d’erreur a disparu :

screenshot_021

Apache et PHP fonctionnent. Passons à MySQL. La première chose à faire est de sécuriser le serveur. Pour cela, un script est fourni. Tapez dans le terminal la commande suivante et suivez les instructions : sudo mysql_secure_installation.

Il vous faudra le plus souvent répondre par Y et Entrée pour oui ou par N et Entrée pour non. Il vous sera demandé :

1) De définir un mot de passe administrateur si cela n’a pas été fait (v. ci-dessus, lors de l’installation des paquets). Si vous avez déjà défini un mot de passe, tapez N, sinon tapez Y, Entrée, entrez votre mot de passe, puis tapez encore une fois Entrée ;
2) D’empêcher les connexions anonymes (tapez Y) ;
3) D’empêcher les connexions distantes (taper Y est conseillée pour un environnement de développement ; pour la production, tapez N si vous voulez autoriser les accès distants à l’aide d’utilitaires tels que Navicat, SequelPro, etc.) ;
4) Supprimer la table test si elle existe (tapez Y) ;
5) Recharger la configuration immédiatement (tapez Y).

Voici le détail :


guillaume@netbook:~$ sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we’ll need the current
password for the root user. If you’ve just installed MySQL, and
you haven’t set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: NO)
Enter current password for root (enter for none):
OK, successfully used password, moving on…

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

You already have a root password set, so you can safely answer ‘n’.

Change the root password? [Y/n] n
… skipping.

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
… Success!

Normally, root should only be allowed to connect from ‘localhost’. This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
… Success!

By default, MySQL comes with a database named ‘test’ that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
- Dropping test database…
ERROR 1008 (HY000) at line 1: Can’t drop database ‘test’; database doesn’t exist
… Failed! Not critical, keep moving…
- Removing privileges on test database…
… Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
… Success!

Cleaning up…

All done! If you’ve completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!
</code>

Cela étant fait, nous allons maintenant déplacer les fichiers qui composent les bases de données vers un emplacement plus sûr que l’emplacement par défaut. En principe, Ubuntu monte le répertoire racine / et ses enfants sur une partition et le répertoire /home sur une autre partition. Si vous devez réinstaller le système, le répertoire racine sera effacé et vos bases de données disparaîtront. En les déplaçant vers le répertoire /home, on évite qu’elles soient effacées lors de la réinstallation du système.

Commencez par taper la commande suivante :

screenshot_022

Un fichier datadir.cnf est créé dans le dossier conf.d. Vous pouvez choisir un autre nom pour ce fichier, mais il doit impérativement porter l’extension .cnf.

Remplissez le fichier comme ceci :

screenshot_023

Fermez la fenêtre, et créez le dossier destiné à contenir les fichier des bases de données :

screenshot_024

Arrêtez le serveur MySQL :

screenshot_025

Copiez le contenu de l’ancien dossier de stockage des fichiers des bases de données dans le nouveau dossier :

screenshot_026

Supprimez (éventuellement) les fichiers parasites (première commande) et attribuez (obligatoirement) le dossier à l’utilisateur MySQL (seconde commande) :

screenshot_027

A partir de la version 9 d’Ubuntu, il est nécessaire d’indiquer à apparmor que le dossier de stockage de MySQL a changé (si vous n’êtes pas sûr de votre version d’Ubuntu, essayez de relancer le serveur MySQL – v. plus bas pour la commande – : en cas d’échec, suivez ces étapes) :

screenshot_028

Trouvez les deux lignes suivantes :

screenshot_029

Et remplacez-les par ces lignes-là :

screenshot_030

Rechargez ensuite apparmor avec la commande sudo /etc/init.d/apparmor restart, puis lancez MySQL avec la commande sudo /etc/init.d/mysql start :

screenshot_031

Si le serveur se lance correctement, c’est qu’en principe tout fonctionne. Quelques tests permettront de vous en convaincre. Ouvrez une session MySQL à l’aide de la commande mysql -u root -p et entrez le mot de passe administrateur (celui que vous avez défini plus tôt, soit lors de l’installation des paquets, soit lors de l’exécution du script de sécurisation).

Exécutez ensuite quelques requêtes. Par exemple, SHOW DATABASES; pour voir les bases installées. Créez une nouvelle base, si vous voulez : CREATE DATABASE ca_marche;.

screenshot_032

Parfait, MySQL fonctionne ! Si vous n’êtes pas un adepte de la ligne de commande, vous pouvez installer MySQLAdministrator et MySQLQueryBrowser qui sont fournis par MySQL :

screenshot_033

Des raccourcis vers ces logiciels se placeront automatiquement dans le menu Applications → Programmation d’Ubuntu.

MySQLAdministrator permet de paramétrer et d’administrer un serveur MySQL :

screenshot_034

screenshot_035

screenshot_036

MySQLQueryBrowser permet de manipuler les bases et les tables, et d’effectuer des requêtes. On le lance depuis le menu Applications d’Ubuntu, ou depuis la ligne de commandes :

screenshot_037

On se connecte ensuite au serveur :

screenshot_038

Et on constate que la base créée un peu plus tôt s’affiche dans le navigateur :

screenshot_039

En faisant un clic-droit sur le nom de la base, on peut y ajouter de nouvelles tables. Ici, je crée une table ok_cool avec une colonne id/int/auto_increment/primary_key et une colonne blabla/text :

screenshot_040

On peut également changer le moteur de MyISAM vers InnoDB, ou vice-versa, très simplement :

screenshot_041

Finalement, on valide les changements pour que le logiciel forme la requête et l’exécute :

screenshot_042

screenshot_043

Une fois la table créée, on peut y ajouter des enregistrements :

screenshot_044

… et les afficher :

screenshot_045

Si MySQLQueryBrowser n’est pas assez complet pour vous, sachez qu’il existe une version lite gratuite de Navicat pour Linux. Vous pouvez la télécharger à l’adresse suivante : http://www.navicat.com/en/products/navicat_mysql/mysql_detail_linux.html. Elle fonctionne avec une version embarquée de Wine.

Nous avons maintenant Apache, PHP et MySQL qui fonctionnent. L’installation est terminée. Restent cependant encore quelques petites opérations de configuration à effectuer. Nous allons d’abord sécuriser l’accès au répertoire racine Apache, puis déplacer les fichiers des sites vers le répertoire utilisateur.

Ouvrez le fichier de configuration des répertoires d’Apache :

screenshot_046

Trouvez les lignes suivantes :

screenshot_047

Et remplacez-les par celles-ci :

screenshot_048

Ces nouvelles lignes refusent l’accès au répertoire racine du serveur (/var/www/) depuis l’extérieur de votre réseau local (donc depuis Internet).

Nous allons installer nos fichier à un autre endroit : dans le dossier /home/votre_nom/www.

On commence par créer le dossier :

screenshot_049

On va installer un wiki, pour l’exemple. Créons donc le dossier wiki :

screenshot_052

Créons un fichier index.php dans ce dossier wiki :

screenshot_053

Et écrivons un petit script tout simple :

screenshot_054

Il fait maintenant éditer le fichier de configuration d’Apache (rien de nouveau…) :

screenshot_050

On rajoute les lignes suivantes :

screenshot_051

Elles indiquent au serveur que l’alias wiki désigne le dossier /home/votre_nom/www/wiki. Ainsi, lorsque l’utilisateur entrera l’adresse http://localhost/wiki, les fichier affichés seront ceux qui se situent dans le dossier /home/votre_nom_www/wiki.

Apache ne pourra pas forcément lire les fichiers de ce dossier, car ces fichiers vous appartiennent et que vous n’êtes pas Apache (Sioux, peut-être ?). Les deux commandes suivantes permettent, respectivement, d’attribuer le contenu du dossier www à Apache, et d’autoriser les lectures et écritures sur les fichiers qui le composent :

screenshot_056

Il ne reste plus qu’à recharger la configuration d’Apache :

screenshot_055

Et on peut voir si cela fonctionne :

screenshot_057

Il existe d’autres manières de déplacer les fichiers de vos sites. Vous en trouverez le détail à ces deux adresses :
http://doc.ubuntu-fr.org/lamp
http://doc.ubuntu-fr.org/tutoriel/lamp_repertoires_de_travail

J’ai choisi cette méthode car elle me semble être la plus résistante aux changements : les liens symboliques et les volumes montés changent plus facilement que le contenu d’un fichier de configuration. Pour sauvegarder la structure de votre site, il vous suffit de sauvegarder le fichier /etc/apache2/sites-available/default. Vous pouvez aussi le recopier sur un autre ordinateur, afin de recréer le même serveur (ne pas oublier de lancez chown et chmod dans ce cas !). En outre, les Alias Apache peuvent être paramétrés plus finement que les alias ou les volumes montés : par exemple, en interdisant les connexions venant d’une certaine plage IP.

Voilà, c’est terminé ! J’espère que ce tutoriel vous aura été utile !