LAMA et LAMP – ASP.NET MVC 4.0 sur Ubuntu avec Mono

Faire tourner une application web ASP.NET MVC 4.0 sur Linux ? Dans quel but ?

Lamas  Bien sûr, il y a plusieurs réponses possibles a ces questions, aussi je vais vous donner les miennes. Tout d’abord, je suis bien plus familier avec C# que je ne les suis avec PHP, même si j’ai écrit quelques applications avec, et plus particulièrement en MVC avec le Framework “Cake”. Le pattern MVC est pour moi la manière la plus logique d’aborder une application Web, d’en faciliter les extensions et maintenances futures, et l’implémentation ASP.NET de ce pattern est pour moi simple et logique. Seulement, a priori, .Net et C# requièrent Windows comme OS. La difficulté est que la plupart des applications web que j’écris sont destinées à être hébergées sur des serveurs virtuels externes. Les hébergeurs savent offrir des solutions Linux très flexibles, évolutives et bon marché, ce qui n’est pas le cas avec Windows, où les solutions sont souvent plus chères, et où l’on ne peut pas toujours installer ce dont on peut avoir besoin. De plus, pour mon cas personnel, il me semble logique d’éviter de multiplier les serveurs, or mon blog utilise WordPress sur un serveur Ubuntu, et j’aimerais bien (nombre de mes clients aussi) pouvoir héberger sur le même serveur certaines applications ASP.NET MVC 4.0. C’est possible, grâce à Mono, qui progresse à pas de géant et est maintenant compatible avec MVC 4.0 et Entity Framework 6.0, nous allons voir comment.

Pour commencer, je vais partir du fait que vous avez accès à un serveur Ubuntu 12.04 LTS, disponible ici: http://www.ubuntu.com/download/server , et d’une console PuTTY pour le gérer. Si vous n’avez pas d’hôte distant, vous pouvez créer une machine virtuelle très facilement avec Windows 8 et Hyper-V. D’ailleurs, même si vous avez un serveur distant, il peut être judicieux de créer une machine virtuelle locale pour expérimenter.

Voyons donc comment construire notre pile LAMA en remplacement/association avec LAMP. LAMP étant l’acronyme de Linux, Apache, MySql, PHP, et LAMA étant l’acronyme de Linux, Apache, MySQl, ASP.NET

Préparation

Les distributions d’Ubuntu ont déjà Mono directement installé, mais le décalage avec l’évolution actuelle de Mono est importante, puisque la version installée par défaut est 2.10.8, compatible MVC 3, alors que la version actuelle est 3.2.3 et est compatible avec .Net 4.5 et MVC 4.0. Puisque nous voulons pouvoir faire fonctionner des applications MVC 4.0, et qu’il n’existe pour l’instant pas de distribution compilée pour Ubuntu, nous allons télécharger, compiler et installer Mono directement depuis le code source. Cela prend un peu de temps et de soin, mais il n’y a rien de bien sorcier si vous suivez pas à pas.

Après avoir pu se connecter avec SSH, la toute première chose à faire est de vérifier que nous sommes à jour des dernières versions sur tout ce qui est déjà installé:

(Si vous utilisez PuTTY, sélectionnez le texte des commandes dans l’article et copiez-le dans le presse-papier par CTRL-C, positionnez le curseur de la souris dans PuTTY et faites un clic droit, le texte sera inséré à la position du curseur.)

Ensuite, nous installons les outils minimum nécessaires à la compilation:

Il est utile de créer, depuis notre répertoire home, un répertoire contenant les sources que nous allons charger puis compiler:

libgdiplus

La première librairie qu’il nous faut installer est libgdiplus. Elle fournit une librairie compatible GDI+ pour les plates-formes non Windows, et est utilisée par la librairie System.Drawing.

Nous commençons par cloner le dépôt Git, puis nous en extrayons la version:

(Il est important d’extraire la dernière version marquée dans l’onglet release de Git, que vous pouvez vérifier en mettant tout simplement l’URL, ici https://github.com/mono/libgdiplus.git, dans votre navigateur. En effet, le dépôt peut très bien être dans un état de pré-version qui n’est pas encore validée.)

Maintenant que le répertoire est dans la bonne version, nous chargeons des dépendances nécessaires pour de nombreux formats d’images:

Nous préparons le script de compilation, en spécifiant que nous voulons programmes et librairies compilées depuis le source dans /usr/local:

Ensuite, si vous avez déjà compilé sous Linux, vous êtes déjà familier avec ces commandes, sinon, vous allez vite le devenir:

une fois la compilation terminée, il faut simplement installer dans /usr/local, puis revenir à notre racine des sources pour le paquet suivant:

 

Mono

Le second des 3 paquets a compiler et installer est Mono lui-même. Au moment où j’écris ce billet, la dernière release est 3.2.3, c’est donc celle-ci que nous allons installer. Comme précédemment, nous allons tout d’abord cloner le répertoire Git avant d’extraire la version qui nous concerne:

Nous configurons la compilation de la même manière que pour libgdiplus:

MonoSetupCompileOK

Lorsque la configuration est terminée, vous devriez voir quelque chose comme montré ci-dessus. Bien que l’utilitaire nous indique que l’on peut lancer make maintenant, nous allons d’abord effectuer une étape supplémentaire, spécifique à Mono. Puisque nous allons compiler Mono à partir de rien, et que Mono est en fait écrit en C#, il nous faut une version minimale du compilateur. Il y a dans le projet Mono un mini compilateur appelé “monolite” destiné à cet usage. Pour l’installer, lançons la commande:

Une fois ce mini-compilateur installé, il est temps de construire Mono lui-même. Une chose différente du make standard dans la construction de mono est qu’il nous faut indiquer au processus de construction où trouver le compilateur C# MonoLite, à l’aide la variable EXTERNAL_MCS. Notez qu’il s’agit d’une variable de make, et non d’une variable d’environnement:

Il nous reste à installer tout cela comme précédemment:

 

XSP

Pour installer les modules d’hébergement de Mono, il nous faut installer XSP, qui est aussi un mini serveur. Nous allons pouvoir tester notre installation avec lui, même si nous n’avons pas encore fini, puisque pour l’instant, Apache et Mod_Mono ne sont pas encore installés.

Nous allons taper la séquence de commandes dont vous commencez à avoir l’habitude:

 

Lancer XSP

Nous avons maintenant installé, version 3.2.3 (pour vérifier vous pouvez taper la commande “mono –V”), et un serveur, certes minimal, mais néanmoins fonctionnel. Pour tester nous allons effectuer un déploiement “file system” d’une petite application test, soit par FTP, soit par Samba (nous verrons en annexe comment installer l’un et/ou l’autre). Vous trouverez le projet et le source complet de cette application test sur GitHub: https://github.com/BernardG/AspInfoMvc

Pour démarrer le serveur, il suffit de taper la commande xsp4 dans le répertoire de l’application, et vous devriez voir quelque chose comme ceci:

Pointez votre navigateur sur votre Url, port 8080, et vous devriez voir quelque chose comme ceci:

AspMvcInfoUbuntuXSP

 

Installer Apache, MySql et PHP

Nous avons déjà bien avancé, Mono est maintenant fonctionnel sur notre serveur Linux, et capable d’interpréter correctement une application web MVC 4.0. Pourtant, il nous reste à installer Apache et mod_mono, le but étant de pouvoir servir simultanément des pages/applications Php et Asp.Net MVC.  (Rien n’empêche d’installer LAMP en premier, si vous le souhaitez. Si Lamp est déjà installé, passez directement à l’installation de mod_mono.)

Tout d’abord nous installons très classiquement la suite d’applications “LAMP”, et allons en profiter pour installer Samba, sur lequel nous reviendrons par la suite.

Au cas où il ne soit pas installé, faites

d’abord.

Vous verrez apparaitre un menu rappelant quelque peu le bon vieux temps du Dos. Ne désélectionnez pas ce qui est sélectionné (petite étoile qui montre la sélection, basculée par un appui sur la barre espace), l’application désélectionnée sera désinstallée…

AspUbuntuInstallLamp

Vous pouvez voir ici que j’ai sélectionné Lamp, et m’apprête à sélectionner Samba, les autres applications ont été installées par défaut. Il s’agit ici d’un serveur virtuel Ubuntu Azure.

Lors de l’installation, un mot de passe pour l’utilisateur “root” de MySql vous sera demandé:

aspinstalllampmysql

Une fois l’installation de ces différents packages terminée, si vous pointez votre navigateur sur l’adresse IP (où le nom) du serveur, vous devriez voir  la page par défaut de l’installation d’Apache:

AspInstallApacheUbuntu

On peut aussi en profiter pour tester PHP. Pour cela, je vais dans le répertoire du site par défaut:

créez la ligne

CTRL-X, Y puis Enter pour sauver le fichier. Sur la même url que la précédente, ajoutez /test.php, et vous devriez voir quelque chose comme ceci:

AspInstallTestPhp

 

mod_mono

Donc nous avons d’un coté Mono qui fonctionne et que nous avons testé avec le mini serveur XSP, et de l’autre Apache, avec PHP. Il nous faut maintenant faire la jonction entre les 2 avec mod_mono, le module permettant à Apache de servir Asp.net et MVC.

Comme précédemment, nous allons télécharger les sources, compiler et installer.

Nous avons besoin d’être capable d’avoir des liens avec les librairies Apache, installons donc les paquets de développements, avant de passer à la configuration:

et maintenant, comme vous devez commencer à en avoir l’habitude

 

Configuration d’apache avec mod_mono

Comme nous l’avons fait avec XSP, nous allons tester le fonctionnement de mod_mono sous Apache avec la même petite application de test, mais ce n’est pas tout à fait aussi simple…

Le projet Mono a créé un dispositif d’autoconfiguration pour mod_mono, parfait pour les applications “classiques” asp.net (extension aspx), mais comme pour mvc il n’y a pas  de “fichier par defaut” au sens habituel cela ne va pas fonctionner pour nous. De plus, nous voulons des “Virtual Hosts” au sens d’Apache, et non pas juste des répertoires virtuels, c’est à dire que nous voulons pouvoir héberger sur le même serveur apache des domaines différents, certains sous PHP, d’autres sous Asp.net MVC 4.0.

Tout d’abord, il faut faire savoir à Apache que nous avons besoin de la configuration de mono:

Tout à fait à la fin du fichier, j’ajoute la ligne

CTRL X, Y, Enter, pour sauver la modification

Ensuite, créons le répertoire de notre nouveau site, de la même manière que nous le ferions pour tout autre site Apache:

Donnons les droits à l’utilisateur internet sur ces répertoires

Maintenant nous allons copier la configuration du site Apache par défaut pour notre nouveau site, et la modifier

Voici ce que doit être votre fichier mvctest après modifications:

Il nous reste à rendre le site actif, et à redémarrer Apache

Trés bien, mais nous n’avons pour l’instant aucune application pour vérifier que tout fonctionne. Je copie donc les fichiers dont je me suis servi pour tester XSP dans le répertoire du site Apache

Si vous êtes sur une machine virtuelle sur votre réseau local, il suffit d’aller modifier le fichier host (dans C:WindowsSystem32Driversetc ) pour indiquer le nom choisi et l’adresse IP de la machine, par exemple:

192.168.1.60    mvctest

Par contre, si vous êtes sur un serveur distant, il faut modifier le fichier de configuration pour indiquer le nom de domaine du site, et s’assurer que votre serveur DNS pointe bien sur l’url de votre serveur.

Naviguez vers la bonne URL, vous devriez voir ceci:

AspMvcInfoUbuntuApache

et la liste des assemblies plus bas:

AspMvcInfoAssembliesLoaded

Apache est donc maintenant capable de servir notre application test en MVC 4.0. Remarquons au passage que nous n’avons pas touché à PHP, qui reste donc capable de fonctionner pour d’autres Hôtes Virtuels, pour d’autres domaines.

MySql avec Entity Framework et Code First

Le dernier étage de notre pile LAMA est MySql. Nous allons donc créer une autre application MVC minimale pour tester le fonctionnement avec MySQL, que l’on trouve chez a peu prés tous les hébergeurs, et que nous avons installé en installant la pile LAMP.

La première chose à faire est de créer un utilisateur ayant tous les droits sur le serveur, mais différent de “root”. Il y a plusieurs raisons à cela, notamment la sécurité, mais aussi pour se simplifier la vie. Je trouve simple et pratique d’installer aussi MySql localement sur ma machine Windows, avec le même utilisateur et mot de passe. De cette manière, il n’y a aucun modification à effectuer à la chaine de connexion entre Windows et Linux. La manière de procéder est la même pour Windows et Linux. Il faut d’abord démarrer la console MySql:

Entrez votre mot de passe. Ensuite:

Je crée 2 fois le même utilisateur, avec le même mot de passe, une fois pour localhost, l’autre fois pour mon adresse IP sur le LAN. De cette manière, je pourrais me connecter à distance avec MySQL WorkBench avec le même utilisateur et mot de passe que dans mon code. Une façon d’éliminer les risques de se tromper. Il me reste à donner tous les droits à ces utilisateurs….

Dans un article précédent j’ai déjà montré comment faire fonctionner Code First avec MySql. A l’occasion je parle de l’installation de MySQL avec WorkBench. Nous allons utiliser la même chose ici pour l’application MVC 4 avec MySQL. Pour la créer, j’ai tout simplement fait un nouveau Projet MVC 4.0 Internet, supprimé tout ce qui concerne la sécurité et SimpleMembership (Sujet d’un futur billet) pour que cela reste aussi simple que possible, et copié les classes concernant les données depuis l’application console.

J’ai ensuite créé un contrôleur en indiquant la classe Person comme modèle de donnée, et MyContext comme context. Le scaffolding génère toutes les méthodes et vues nécessaires aux opérations CRUD (Create, Remove, Update, Delete). Toujours pour rester simple et ne pas ajouter d’éléments au menu, j’ai copié toutes les méthodes dans le HomeController, modifié le code de Index pour passer la liste des personnes, et copié les vues dans le répertoire Home, puis supprimé ce qui avait été généré par le scaffolding.

Il m’a ensuite suffit d’insérer dans la vue Index.cshtml une table  listant le contenu de Persons pour vérifier que mon application MVC 4 fonctionne correctement sur ma station de développement Windows 8.

Asp-Windows-HomePage

Obtenir le même résultat sur Ubuntu avec Mono et Apache a pris bien plus de temps que je ne l’imaginais, mais ce n’est pas la faute à Mono, si j’ose dire…. Sourire

En fait, et cela je l’ai découvert pendant que j’écrivais cet article, Mono ne fonctionne qu’avec Entity Framework 6, qui est pour l’instant en “Release Candidate 1”, autrement dit en pre-version, tout simplement parceque les sources de la version 6 ont été ouvertes par Microsoft, ce qui n’était pas le cas pour les versions précédentes. Par contre, le dernier connecteur MySql pour .Net n’est compatible qu’avec la version 5 d’Entity Framework. Je vous promets, j’ai essayé par tous les moyens, rien à faire avec EF6! Devart par contre vend un connecteur MySql compatible EF6. C’est assez paradoxal, puisque le seul connecteur capable de fonctionner (pour l’instant) avec la première version Open Source d’Entity Framework (et MySql) est commercial….

Donc, pas moyen de faire autrement, je télécharge le connecteur Devart en version essai de 30 jours, remplace EF 5 par EF 6 dans mon projet, et fais de même pour les DLL MySql. Une fois recompilé, pas de problème, tout fonctionne comme auparavant. Bien, voyons maintenant ce que cela donne sur Ubuntu. Comme je m’en doutais, pas mal d’erreurs, qui peuvent toutes (sauf une dont je vais parler) se résumer au fait qu’un certain nombre de DLLs/Assemblies sont installées dans le Gac coté Mono, et se mettent en conflit avec celles copiées dans le répertoire bin lors du déploiement. C’est notamment le cas pour EF6. Pour identifier ces assemblies “Mono” qui se mettaient en conflit avec ceux de .Net, j’ai lancé cette commande sur Ubuntu (C’est la même sous Windows!):

qui a pour effet de lister tous les assemblies installés  dans le Gac, et comparé cette liste avec celle du répertoire bin de l’application MVC. J’ai trouvé

  • EntityFramework.dll
  • Microsoft.Web.Infrastructure.dll
  • System.Web.Http.dll
  • System.Web.Http.WebHost.dll
  • System.Web.Razor.dll

dans les 2 listes. Pour vérifier que la source des erreurs était bien ce conflit, j’ai simplement renommé ces .dll en .dll-old, et fait F5 dans le navigateur pour rafraichir la page. La j’ai obtenu une nouvelle erreur, qui m’a indiqué que j’étais sur la bonne piste:

Asp_Devart_License_Error

Le connecteur Devart étant un connecteur commercial, la référence à  la licence m’a indiqué qu’à priori EntityFramework avait bien détecté l’utilisation de Devart.Data.MySql, mais qu’il avait déclenché une erreur pour cause de licence manquante. Une recherche Google m’amène sur une page concernant la licence pour le connecteur Oracle. J’ai procédé exactement comme indiqué, ce qui en fait plus simple qu’il n’y parait.

Dans Solution explorer de Visual Studio, avec votre projet sélectionné, ajoutez un fichier texte, nommé licenses.licx. La seule ligne de ce fichier est:

Build Action doit être “Embedded Ressource”. Après nouveau déploiement, on obtient enfin ceci:

ASP_Mono - My ASP.NET MVC Application

Sous Mono comme avec .Net, EntityFramework a bien généré tables et colonnes. Par contre, le connecteur Devart est visiblement incapable de créer une nouvelle base de données, ce qui se fait très bien avec le connecteur Oracle/MySql sous .Net.

En conclusion, il est parfaitement possible et viable d’envisager une application Asp.Net MVC 4.0 hébergée sur un serveur Linux avec Mono et Apache. Oracle/MySql aura certainement très bientôt une version du connecteur compatible avec EF6. En attendant, le connecteur Devart est une solution viable, mais pas gratuite.

Si vous voulez essayer cette application test, les sources sont disponibles sur GitHub: https://github.com/BernardG/MvcMySqlUbuntu

LAMA est donc aussi fonctionnel que LAMP!

Remerciements

Ce billet et la réussite de cette installation de Mono, avec Apache et MySql n’auraient jamais été possibles sans les nombreux articles de blogs et de réponses aux questions dans de nombreux forums, notamment sur StackOverflow. Il m’est impossible de les citer tous, mais je veux notamment remercier:

N’hésitez pas à me faire part de vos réussites où échecs dans les commentaires. J’espère que cet article vous sera utile si vous souhaitez faire la même chose. Pour être mis au courant de la parution de nouveaux articles, souscrivez à nos mise à jour par email.

This work is licensed under a Creative Commons license.

Publié dans ASP.NET MVC 4.0, Linux
4 commentaires sur “LAMA et LAMP – ASP.NET MVC 4.0 sur Ubuntu avec Mono
  1. Laurent dit :

    Bonjour,

    J’en suis à l’étape : ./autogen.sh –prefix=/usr/local

    Juste après il faut faire un make.

    Ca répond No target specified, no make found.

    Etant à linux ce que le poulpe est à la littérature, un petit coup de main serait le bienvenu…

    Merci

    Laurent

  2. Laurent dit :

    Bonjour,
    J’ai bien suivi toutes les instructions jusqu’à l’étape :
    make get-monolite-latest

    Malheureusement, il semble qu’un des fichiers soit corrompu.

    On peut utiliser la commande :
    make monolite_url=http://storage.bos.xamarin.com/mono-dist-master/latest/monolite-111-latest.tar.gz get-monolite-latest

    A la place…

    Laurent

  3. due date dit :

    do you have a twitter that i can follow

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Lettre d’information

Recherche sur le Site

Recherche personnalisée