Apprendre à déployer une application ASP.NET Core sous Linux en utilisant Nginx comme reverse proxy
Un tutoriel de Hinault Romaric

Le , par Hinault Romaric, Responsable .NET
Kestrel offre de bonnes performances pour le rendu du contenu dynamique. Mais, c’est un serveur démuni de nombreuses fonctionnalités. Il est essentiellement dédié au développement.


Dans un environnement de production, il doit être couplé avec d’autres serveurs dont IIS, ou Nginx, qui apporteront des fonctionnalités additionnelles. Dans notre cas, nous allons configurer Nginx pour utiliser ce dernier comme reverse proxy, afin d’offrir des fonctionnalités supplémentaires comme le rendu du contenu statique, la mise en cache ou encore la compression des requêtes.

Installation de Nginx

Nous allons commencer par installer le serveur Nginx. Ouvrez le terminal et exécutez la commande suivante :

Code : Sélectionner tout
1
2
 
sudo apt-get install nginx
Cela fait, vous allez démarrer Nginx en exécutant la commande suivante :

Code : Sélectionner tout
sudo service nginx start
Configuration de Nginx

Vous devez maintenant configurer Nginx pour qu’il agisse comme reverse proxy pour Kestrel. Nous voulons qu’à chaque requête sur le port 80, Nginx redirige le trafic vers le port 5050 qui sera celui utilisé par notre application.

Pour y parvenir, nous devons éditer le fichier /etc/nginx/sites-available/default . Ouvrez ce dernier en utilisant la commande :

Code : Sélectionner tout
sudo -i gedit /etc/nginx/sites-available/default
Changez son contenu par le suivant et enregistrez :

Code json : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
server { 
listen 80; 
location / { 
proxy_pass http://localhost:5050; 
proxy_http_version 1.1; 
proxy_set_header Upgrade $http_upgrade; 
proxy_set_header Connection keep-alive; 
proxy_set_header Host $host; 
proxy_cache_bypass $http_upgrade; 
} 
}

Exécutez les deux commandes suivantes pour vous rassurer que le fichier de config est correct et procéder au chargement de ce dernier :

Code : Sélectionner tout
1
2
sudo nginx -t 
sudo nginx -s reload
Les projets ASP.NET Core sont configurés pour utiliser par défaut le port 5000. Comme nous souhaitons utiliser le port 5050 pour notre application, nous allons donc apporter quelques modifications à notre application pour prendre cela en compte.

Vous allez dans un premier temps ajouter un nouveau fichier hosting.json à votre projet, avec le contenu suivant :

{
"server.urls": "http://localhost:5050"
}

Éditez ensuite le fichier Program.cs pour prendre en compte le fichier hosting.json. Vous devez l’ajouter au ConfigurationBuilder.

Code : Sélectionner tout
1
2
3
4
5
6
var config = new ConfigurationBuilder() 
.SetBasePath(Directory.GetCurrentDirectory()) 
.AddJsonFile("hosting.json", optional: true) 
.AddCommandLine(args) 
.AddEnvironmentVariables(prefix: "ASPNETCORE_") 
.Build();
Vous devez intégrer le fichier hosting.json dans le package de déploiement de votre application. Pour cela, vous devez éditer le fichier project.json et ajouter hosting.json dans publishOptions :

Code json : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
"publishOptions": { 
"include": [ 
"wwwroot", 
"Views", 
"Areas/**/Views", 
"appsettings.json", 
"web.config", 
"hosting.json" 
] 
},

Compilez à nouveau votre application et procédez à son exécution :

Code : Sélectionner tout
1
2
Dotnet build 
Dotnet run
Ouvrez votre navigateur et saisissez http://localhost/ pour lancer votre application. Cette dernière devrait s'afficher dans votre navigateur.

Publication de l’application et configuration du superviseur

A ce stade, pour accéder à l’application depuis le navigateur, vous devez au préalable exécuter la commande dotnet run. De plus, nous n’avons pas publié l’application dans son répertoire de destination.

Pour la suite, nous allons publier notre application et configurer l’outil supervisor. Il s’agit d’un système de contrôle de processus qui va permettre de lancer l’application et maintenir cette dernière en exécution.

Pour commencer vous allez publier l’application :

dotnet publish

Après l’exécution de cette commande, vous obtenez le répertoire dans lequel l’application a été publiée :

Code : Sélectionner tout
publish: Published to /home/hinault/projects/SampleApp/bin/Debug/netcoreapp1.0/publish

Vous devez ensuite copier cette dernière dans son répertoire de destination (/var/www/sampleapp) :

Code : Sélectionner tout
sudo cp -a /home/hinault/projects/SampleApp/bin/Debug/netcoreapp1.0/publish /var/www/sampleapp
Cela fait, vous devez installer supervisor en utilisant la commande suivante :

Code : Sélectionner tout
sudo apt-get install supervisor
Ensuite, vous devez créer un nouveau fichier de configuration (sampleapp.conf) dans le dossier src/supervisor/conf.d/ avec le contenu suivant, pour permettre à supervisor de lancer votre application :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
[program:sampleapp] 
command=/usr/bin/dotnet /var/www/sampleapp/SampleApp.dll 
directory=/var/www/sampleapp/ 
autostart=true 
autorestart=true 
stderr_logfile=/var/log/sampleapp.err.log 
stdout_logfile=/var/log/sampleapp.out.log 
environment=HOME=/var/www/,ASPNETCORE_ENVIRONMENT=Production 
user=www-data 
stopsignal=INT 
stopasgroup=true 
killasgroup=true
Pour finir, vous devez exécuter les deux commandes suivantes pour arrêter et relancer supervisor :

Code : Sélectionner tout
1
2
sudo service supervisor stop 
sudo service supervisor start
Vous venez de déployer votre application et elle est désormais disponible en tout temps.


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster un commentaire

Avatar de François DORIN François DORIN - Rédacteur/Modérateur https://www.developpez.com
le 18/02/2017 à 8:46
Merci pour l'article
Juste une petite coquille, qui fait qu'une balise code ne passe pas : [CODE-json]
Avatar de Hinault Romaric Hinault Romaric - Responsable .NET https://www.developpez.com
le 25/02/2017 à 16:58
Citation Envoyé par François DORIN;bt4070
Merci pour l'article
Juste une petite coquille, qui fait qu'une balise code ne passe pas : [CODE-json]

C'est corrigé, merci .
Responsable bénévole de la rubrique Microsoft DotNET : Hinault Romaric -