derrien.me | blog

Virtualiser son serveur de développement

Posté le 15 octobre 2009 dans Développement web, Systèmes et réseaux

debian_splashAprès avoir migré sous Mac OS X, je me suis demandé quelle solution était la plus flexible et fiable pour développer dans un environnement xAMP (Apache-MySQL-PHP, ou x restait à définir). Après avoir eu de brefs échos (plutôt mauvais) sur Twitter à propos de MacPorts (Lien externe) et MAMP (Lien externe), j’ai décidé de continuer à virtualiser mon serveur de développement.

C’est une technique que j’avais déjà expérimentée sous Windows. Lorsque l’on travaille avec un framework web tel que Symfony (Lien externe), la ligne de commande est omniprésente. Et soyons honnête, la ligne de commande sous Windows, c’est pas ça (malgré l’existence d’outils comme Cygwin (Lien externe)).

Virtualiser mon serveur de développement sous Linux m’est apparu comme le meilleur choix : On peut ainsi profiter de son système de prédilection (Mac OS X dans mon cas) pour développer ses projets web tout en disposant de la robustesse d’une architecture LAMP pour les tester. Cela permet aussi de tester son application dans des conditions proches de celles de l’environnement de production, et il est même possible de tester son projet sous différentes configurations en installant, au besoin, plusieurs machines virtuelles.

Dans cet article, nous allons voir comment configurer une machine virtuelle sous Debian (Lien externe) adaptée au développement avec le framework Symfony (Lien externe).

Installation d’une machine virtuelle Debian

Je ne vais pas détailler pas à pas l’installation de la machine virtuelle. J’ai utilisé Parallels Desktop (Lien externe), et la netinstall de Debian Lenny (Lien externe). Lors de l’installation, je choisis l’installation en mode console, et me contente de sélectionner l’option « Système standard », nous installerons les paquets nécessaires par la suite.

N’oubliez pas de décocher « Environnement graphique de bureau », nous n’en avons pas besoin ici. Même si la RAM ne coûte plus très cher, vous me remercierez au moment où il vous faudra démarrer vos VM Windows pour tester vos sites sous Internet Explorer…

Configuration du système

Nous allons commencer par installer sudo pour éviter de se logger en root à l’avenir ainsi qu’un serveur SSH (c’est bien plus pratique d’utiliser le terminal de son système plutôt que de basculer en permanence sur la VM). Connectez-vous en root, et allons-y :

# apt-get install sudo
# visudo

La commande visudo permet d’éditer le fichier /etc/sudoers, qui contient les utilisateurs autorisés à utiliser la commande sudo. Il suffit d’ajouter l’utilisateur voulu (dans mon cas jl), comme ceci :

jl	ALL=(ALL) ALL

On installe maintenant le paquet openssh-server :

# apt-get install openssh-server

Avant d’utiliser SSH pour se connecter au serveur, on va attribuer une adresse IP fixe à l’interface réseau de notre machine virtuelle. Pour connaître le sous-réseau utilisé par votre machine virtuelle, et l’adresse IP de la passerelle par défaut, utilisez les commandes suivantes :

# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:1c:42:f4:80:28
          inet adr:10.211.55.7  Bcast:10.211.55.255  Masque:255.255.255.0
          adr inet6: fe80::21c:42ff:fef4:8028/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4515 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2971 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000
          RX bytes:6337760 (6.0 MiB)  TX bytes:224514 (219.2 KiB)
          Interruption:10 Adresse de base:0x8200 
 
# netstat -rn
vmdev:~# netstat -rn
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic   MSS Fenêtre irtt Iface
10.211.55.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
0.0.0.0         10.211.55.1     0.0.0.0         UG        0 0          0 eth0

Editez le fichier /etc/network/interfaces à l’aide de vim (par exemple), et configurer eth0 comme ceci (en prenant soin de modifier les adresses et masques) :

 allow-hotplug eth0
 iface eth0 inet static
         address 10.211.55.7
         netmask 255.255.255.0
         network 10.211.55.0
         broadcast 10.211.55.255
         gateway 10.211.55.1

Pour prévenir tout problème, l’idéal serait de réduire la plage d’adresses IP du serveur DHCP aux adresses qui n’ont pas été attribuée de façon statique.

Configuration du fichier hosts de votre système principal

Pour accéder plus facilement à votre machine virtuelle, nous allons éditer le fichier hosts de votre système principal. Sous Mac OS X et autres systèmes Unix, éditez /etc/hosts, sous Windows éditez C:\windows\system32\drivers\etc\hosts et ajoutez-y la ligne suivante :

10.211.55.7      vmdev

Vous pouvez maintenant vous connecter à votre machine en SSH :

$ ssh jl@vmdev

Installation d’Apache, MySQL et PHP

On va commencer par ajouter les dépôts dotdeb.org (Lien externe). Ces dépôts permettent d’installer des versions plus récentes de PHP et de MySQL que celle proposées par défaut dans les dépôts officiels. Il suffit d’ajouter les deux lignes suivantes dans /etc/apt/sources.list :

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

Puis de mettre à jour la liste des paquets :

$ sudo apt-get update

On va maintenant installer MySQL, Apache, PHP5 ainsi que quelques modules pour PHP5 (vous pourrez en ajouter d’autres par la suite) :

sudo apt-get install mysql-server-5.1
sudo apt-get install apache2
sudo apt-get install php5 php5-cli php5-mysql php5-gd php5-xsl php5-apc php5-mcrypt

En ce qui concerne MySQL, à vous de créer les utilisateurs (Lien externe) dont vous avez besoin.

On va maintenant ajouter l’utilisateur jl au groupe www-data :

$ sudo usermod -g www-data jl

On modifie aussi le masque de création de fichiers pour notre utilisateur. Ainsi, on va donner au groupe www-data les droits de lecture, d’écriture et d’exécution. Dans le fichier ~/.profile, il suffit d’ajouter la ligne suivante :

umask 002

De cette façon, Apache et donc PHP auront accès en lecture et en écriture à notre homedir. Cela ne pose pas de problème dans notre contexte (un serveur de développement personnel).

Installation et configuration de Samba

Vous aurez sûrement besoin d’accéder aux données de votre serveur. Nous allons installer Samba (Lien externe), mais vous auriez très bien pu opter pour NFS (Lien externe) si votre système principal le supporte (pour ma part, je n’ai jamais testé NFS avec des systèmes tels que Mac OS X ou Windows). Samba a l’avantage de permettre le partage de documents entre la plupart des systèmes d’exploitation.

Nous allons installer Samba, et créer le mot de passe pour l’utilisateur jl (qui doit être un compte système valide) :

$ sudo apt-get install samba
$ sudo smbpasswd -a jl

Configurons la section [homes] du fichier de configuration de Samba (/etc/samba/smb.conf) :

[homes]
   comment = Home Directories
   browseable = no
   read only = no
   create mask = 0664
   directory mask = 0775
   valid users = %S
   force group = www-data
   force create mode = 0664
   force security mode = 0664
   force directory mode = 0775
   force directory security mode = 0775

Pour que la nouvelle configuration soit prise en compte, redémarrez Samba :

$ sudo /etc/init.d/samba restart

Vous pouvez à présent vous connecter au home directory de votre machine virtuelle via le protocole SMB, et y copier des fichiers. Pour ma part, voici l’arborescence que je me suis créée :

|-- dev
    |-- frameworks
    |   `-- symfony-1.2.9
    |-- projects
    |   |-- monprojet1
    |   |   `-- web
    |   `-- monprojet2
    |      `  -- web
    `-- utils
        `-- web
            |-- phpmyadmin
            `-- phpinfo.php

Configuration d’Apache et de PHP pour Symfony

Nous avons pratiquement terminé la configuration de notre serveur de développement. Il reste néanmoins à configurer Apache et PHP pour Symfony.

Commençons par PHP. On va simplement désactiver les directives short_open_tag et magic_quotes_gpc dans /etc/php5/apache2/php.ini mais également dans /etc/php5/cli/php.ini.

short_open_tag = Off
magic_quotes_gpc = Off

Il est aussi intéressant d’afficher les notices :

error_reporting = E_ALL

On va maintenant configurer Apache. Pour le moment, les fichiers hébergés par notre serveur web sont situés dans /var/www/. Nous venons de créer une arborescence dans notre homedir pour accueillir nos projets web, il va donc falloir configurer Apache en conséquence. Nous allons utiliser une fonctionnalité intéressante d’Apache : les vhosts dynamiques (mod_vhost_alias (Lien externe)). Créez un nouveau fichier dans /etc/apache2/sites-available/, par exemple vmdev, contenant la configuration suivante :

ServerName vmdev
 
<VirtualHost *:80>
        ServerAlias vmdev utils.vmdev
        VirtualDocumentRoot /home/jl/dev/utils/web/
</VirtualHost>
 
<VirtualHost *:80>
	ServerAlias phpmyadmin.vmdev
	VirtualDocumentRoot /home/jl/dev/utils/web/phpmyadmin/
</VirtualHost>
 
<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	ServerAlias *.vmdev
	VirtualDocumentRoot /home/jl/dev/projects/%1/web
	DirectoryIndex index.php
 
	<Directory /home/jl/dev/projects/>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride All
		Order allow,deny
		Allow from all
	</Directory>
 
	Alias /sf /home/jl/dev/frameworks/symfony-1.2.9/data/web/sf
	<Directory "/home/jl/dev/frameworks/symfony-1.2.9/data/web/sf">
		AllowOverride All
		Allow from All
	</Directory>
 
	ErrorLog /var/log/apache2/error.log
	LogLevel debug
	CustomLog /var/log/apache2/access.log combined
</VirtualHost>

Grâce à cette configuration, nous avons deux vhosts statiques (vmdev, accessible également depuis utils.vmdev, et phpmyadmin.vmdev), et un vhost dynamique. Nous aurons ainsi vhost par projet qui sera créé dynamiquement, par exemple monprojet1.vmdev.

Pour terminer, nous allons activer mod_rewrite et mod_vhost_alias, désactiver la configuration du site par défaut d’Apache, activer la configuration que l’on vient de créer, et redémarrer Apache :

$ sudo a2enmod rewrite
$ sudo a2enmod vhost_alias
$ sudo a2dissite default
$ sudo a2ensite vmdev
$ sudo /etc/init.d/apache2 restart

Installation de Symfony et configuration d’un premier projet

Nous n’avons pas encore installé Symfony mais le moment est venu. On commence par créer le répertoire ~/dev/frameworks/, si ce n’est déjà fait, puis on télécharge et décompresse l’archive de Symfony dans le répertoire nouvellement créé :

$ mkdir -p ~/dev/frameworks && cd ~/dev/frameworks/
$ wget http://www.symfony-project.org/get/symfony-1.2.9.tgz
$ tar -xvzf symfony-1.2.9.tgz
$ rm symfony-1.2.9.tgz

On va maintenant démarrer le projet Jobeet (Lien externe). On commence par créer le répertoire ~/dev/projects/jobeet, puis l’on crée un lien symbolique vers le répertoire où nous avons décompressé Symfony précédemment :

$ mkdir -p ~/dev/projects/jobeet/lib/vendor && cd ~/dev/projects/jobeet/lib/vendor
$ ln -s ~/dev/frameworks/symfony-1.2.9 symfony
$ cd ~/dev/projects/jobeet

On va maintenant vérifier si Symfony est correctement installé, et si notre configuration de PHP est adaptée :

$ php lib/vendor/symfony/data/bin/symfony -V
symfony version 1.2.9 (/home/jl/dev/frameworks/symfony-1.2.9/lib)
$ php lib/vendor/symfony/data/bin/check_configuration.php
********************************
*                              *
*  symfony requirements check  *
*                              *
********************************
 
php.ini used by PHP: /etc/php5/cli/php.ini
 
** WARNING **
*  The PHP CLI can use a different php.ini file
*  than the one used with your web server.
*  If this is the case, please launch this
*  utility from your web server.
** WARNING **
 
** Mandatory requirements **
 
  OK        PHP version is at least 5.2.4
 
** Optional checks **
 
  OK        PDO is installed
  OK        PDO has some drivers installed: mysql
  OK        PHP-XML module is installed
  OK        XSL module is installed
  OK        The token_get_all() function is available
  OK        The mb_strlen() function is available
  OK        The iconv() function is available
  OK        The utf8_decode() is available
  OK        A PHP accelerator is installed
  OK        php.ini has short_open_tag set to off
  OK        php.ini has magic_quotes_gpc set to off
  OK        php.ini has register_globals set to off
  OK        php.ini has session.auto_start set to off
  OK        PHP version is not 5.2.9

Il est judicieux de vérifier également le php.ini utilisé par Apache, comme le précise le warning ci-dessus. Il ne devrait cependant pas y avoir de problème, vu que nous avons fait les modifications nécessaires dans les deux fichiers php.ini.

On va maintenant démarrer le projet Jobeet, ainsi qu’une première application :

$ php lib/vendor/symfony/data/bin/symfony generate:project jobeet
$ ./symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend

Lors de la création de chaque nouveau projet, il faut veiller à modifier le fichier hosts de notre système principal en conséquence. J’ai pour ma part deux lignes dans /etc/hosts, une première pour les vhosts statiques, et une deuxième pour chacun de mes projets qui utilise un vhost dynamique :

10.211.55.7     vmdev utils.vmdev phpmyadmin.vmdev
10.211.55.7     jobeet.vmdev monprojet1.vmdev monprojet2.vmdev

Il nous reste un dernier détail à régler. Si vous ouvrez http://jobeet.vmdev/, vous vous trouverez face à une erreur 500. Il faut décommenter la ligne suivante dans le fichier ~/dev/projects/jobeet/web/.htaccess :

RewriteBase /

Pour accéder à l’environnement de développement de Symfony, pensez à ajouter l’adresse IP de l’interface virtuelle de votre système principal dans web/frontend_dev.php. Par défaut, seule l’adresse IP 127.0.0.1 est autorisée à y accéder.

Cette fois, c’est la bonne ! Si vous vous rendez sur http://jobeet.vmdev/, vous devriez avoir l’écran suivant :

screen-jobeet

Vous disposez désormais d’un serveur LAMP fonctionnel pour vos tests. À vous de l’adapter selon vos besoins : vous pouvez par exemple installer les utilitaires dont vous avez besoins dans ~/dev/utils/web/ (notamment PhpMyAdmin (Lien externe) pour lequel nous avons créé un vhost précédemment mais dont je n’ai détaillé l’installation), installer des modules PHP supplémentaires…

Pour finir, une recommandation : lorsque vous arrêterez votre machine virtuelle, n’oubliez pas de fermer votre éditeur de texte et d’éjecter votre lecteur réseau au préalable.

Commentaires

vjousse, le 16 octobre 2009 à 11h58

A part tester son appli symfony sous debian, j’ai du mal à voir l’intérêt de développer des sites symfony dans une machine virtuelle sous Mac OS X.
Tu as déjà tout ce qu’il te faut sous OS X : Apache, Mysql, PHP, un terminal sexy.

J’aurais loupé quelque chose ?

Frédéric de Villamil, le 16 octobre 2009 à 12h12

J’ai fait la même chose pendant un moment, et finalement j’ai installé le Zend Server community edition pour Mac.

jrmarmelade, le 16 octobre 2009 à 13h12

Super intéressant comme article ! Dans mes « fav », et application à la fin du mois :)

Ishiro, le 16 octobre 2009 à 13h25

@vjousse: À vrai dire, si tu es satisfait de ton installation actuelle, et que tu ne vois pas de réel avantage à virtualiser, c’est sans intérêt pour toi en effet.

Mais comme je le dis en intro, j’avais déjà utilisé cette technique sous Windows, et lors de mon passage sous OS X j’ai vu pas mal de personnes sur Twitter râler à propos de PHP sous OS X, ce qui m’a un peu effrayé. J’ai donc décidé de continuer comme sous Windows.

@Frédéric de Villamil: Je n’ai pas encore regardé du côté de Zend Server, mais peut-être une bonne alternative… Merci pour l’info !

@jrmarmelade: Merci ! Très content que ça puisse servir. En plus, c’est là pour ça. ;)

vjousse, le 16 octobre 2009 à 14h51

Je te conseille d’essayer MAMP ou les distributions PHP de Marc Liyanage ( http://www.entropy.ch/software/macosx/ ) tu verras c’est sympathique et ça pourrait peut être te sauver un peu de RAM ;)

Poster un commentaire