Apprendre à déployer une application ASP.NET Core sous Linux en utilisant Nginx comme reverse proxy
Un tutoriel de Hinault Romaric
Le 28/02/2017, 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 :
Cela fait, vous allez démarrer Nginx en exécutant la commande suivante :
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 :
Changez son contenu par le suivant et enregistrez :
Exécutez les deux commandes suivantes pour vous rassurer que le fichier de config est correct et procéder au chargement de ce dernier :
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.
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 :
Compilez à nouveau votre application et procédez à son exécution :
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 :
Vous devez ensuite copier cette dernière dans son répertoire de destination (/var/www/sampleapp) :
Cela fait, vous devez installer supervisor en utilisant la commande suivante :
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 :
Pour finir, vous devez exécuter les deux commandes suivantes pour arrêter et relancer supervisor :
Vous venez de déployer votre application et elle est désormais disponible en tout temps.
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 : |
1 2 | sudo apt-get install nginx |
Code : |
sudo service nginx start
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 : |
sudo -i gedit /etc/nginx/sites-available/default
Code json : |
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 : |
1 2 | sudo nginx -t sudo nginx -s reload |
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 : |
1 2 3 4 5 6 | var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("hosting.json", optional: true) .AddCommandLine(args) .AddEnvironmentVariables(prefix: "ASPNETCORE_") .Build(); |
Code json : |
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 : |
1 2 | Dotnet build Dotnet run |
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 : |
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 : |
sudo cp -a /home/hinault/projects/SampleApp/bin/Debug/netcoreapp1.0/publish /var/www/sampleapp
Code : |
sudo apt-get install supervisor
Code : |
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 |
Code : |
1 2 | sudo service supervisor stop sudo service supervisor start |