Héberger une Web App .NET sous Linux

Mickaël Mutte
norsys-octogone
Published in
4 min readAug 21, 2023

Après un premier article sur .NET et le cross-platform, nous allons maintenant voir un exemple concret avec l’hébergement d’une Web App sous Linux.

A l’époque de .NET Framework, les applications web écrites en .NET étaient traditionnellement hébergées sur une machine Windows Serveur, via IIS (Internet Information Services) qui est un serveur d’hébergement propre à la plateforme Windows.

Suite au virage pris par Microsoft pour rendre .NET open source et cross-platform, il est désormais possible d’héberger des Web App .NET (API, Services, Website…) sur Linux ou même Mac.

Oui, mais comment ? C’est ce que nous allons voir ici, avec un exemple d’application non containérisée. Nous ne rentrerons pas dans les détails en expliquant chaque configuration à faire. En effet, cet article a pour ambition de vous aider à comprendre le mécanisme d’hébergement d’une Web App .NET sur Linux, pas d’être un tutoriel complet donnant une solution clé en main.

La publication d’une Web App en .NET Core ou .NET5+

Le processus de publication d’une application .NET Core ou .NET 5+ ne diffère pas de la publication d’une application .NET Framework. Ainsi vous choisissez le type de publication que vous désirez : en fichier ou en push direct vers Azure.

Dans une solution .NET ouverte dans Visual Studio, il suffit de choisir le projet à publier, faire un clic droit, et choisir l’option “Publier”. Pour cet exemple, une Web API de démo est publiée en fichiers :

Ceci a pour résultat de générer les fichiers suivants, qui constituent l’API :

La différence avec une publication d’un projet .NET Framework réside dans le fait qu’un fichier exécutable est désormais généré (Fichier DemoDotNetApache dans la capture d’écran ci-dessus) : cet exécutable correspond à la Web API, le lancer la démarre. Le travail ne se termine pas là, il faut désormais rendre l’application accessible au monde extérieur: comment faire sous Linux où IIS n’existe pas ? Il suffit d’utiliser un serveur Apache ou Nginx. Dans la suite de cet article, c’est un serveur Apache qui est utilisé.

Configurer Apache pour rendre accessible une WEB API .NET

Pour rendre accessible la Web API au monde extérieur, un serveur Apache est utilisé en tant que reverse proxy afin de rediriger le trafic Web vers l’API. Cela nécessite 2 actions.

Tout d’abord, il faut ajouter un middleware dans le code de notre API pour traiter les en-têtes HTTP des requêtes transférées (voir la toute première capture d’écran de cet article) :

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

app.UseAuthentication();

Il faut ensuite configurer le serveur Apache pour pouvoir utiliser des virtual hosts, ainsi que tout autre dépendance nécessaire (SSL, Proxy…) Une fois que cela est fait, il ne reste qu’à créer un vhost pour diriger le trafic web vers l’API, comme sur l’exemple ci-dessous :

<VirtualHost *:8080>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ServerName DemoDotNetApache.lo
ServerAlias *.DemoDotNetApache.lo
ErrorLog "/Users/demo/WebSites/DemoDotNetApache/logs/error_log"
CustomLog "/Users/demo/WebSites/DemoDotNetApache/logs/access_log" common
</VirtualHost>

Veuillez noter que les ports utilisés ici sont des ports de développements, pour une application de production, à vous de les configurer correctement selon vos besoins

Vous pouvez maintenant tester que votre API est bien accessible après avoir lancé manuellement l’exécutable de l’API (afin de simuler une API disposant d’un nom de domaine comme dans un environnement de production, le fichier hosts de ma machine de dev a été modifié pour pointer vers un domaine factice) :

Comme vous pouvez le voir, cette API de démo renvoie une simple liste de mots clés liés à cet article. Bien sûr, vous ne vous amuserez pas à lancer manuellement l’exécutable dans un environnement de production. La dernière étape consiste donc à automatiser son démarrage, en créant un service qui se charge de cette tâche. Pour se faire, il suffit de créer un fichier de service avec la commande suivante sous Linux :

sudo nano /etc/systemd/system/demodotnetapache.service

Puis, à l’intérieur de ce fichier, paramétrer le service comme suit :

[Unit]
Description=Démo .NET Web API sous Linux

[Service]
WorkingDirectory=/var/www/DemoDotNetApache
ExecStart=/usr/local/bin/dotnet /var/www/DemoDotNetApache/DemoDotNetApache.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=demo
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

Ce fichier est un exemple de base, à vous de l’adapter à vos besoins. L’API est désormais prête à s’exécuter en condition réelle.

Conclusion

Héberger une appli WEB développée en .NET Core ou .NET 5+ sous Linux, est-ce compliqué ? Non mais cela peut-être un peu plus fastidieux que de le faire sous une plateforme Windows avec IIS. Notamment à cause de toute la configuration à effectuer manuellement dans des fichiers, là où IIS permet de le faire plus rapidement via son interface graphique.

Un des inconvénients que j’ai identifié durant la rédaction de cet article est lié au fait que Microsoft s’est lancé dans le cross-platform uniquement depuis quelques années. De ce fait, il est parfois compliqué de trouver de la documentation ou de l’aide sur l’hébergement d’application sous Linux en cas de difficulté.

Pour aller plus loin

Si vous êtes curieux et souhaitez en apprendre plus sur l’hébergement d’application WEB en .NET sous environnement Linux, vous pouvez consulter cette documentation.

Vous trouverez également au même endroit comment héberger une web app à l’aide de Nginx. Si vous désirez développer vous-même une petite API de test, je vous invite également à suivre ce tutoriel vidéo sur Youtube qui m’a permis de tester moi-même tout ceci et de préparer cet article.

--

--