Publication dans Apache
Ce guide permet de configurer un serveur Linux avec Apache pour publier une application Lagoon. Les copies d'écran de l'ancienne documentation ont été volontairement retirées.
Configuration matérielle et logicielle
Les éléments logiciels et matériels nécessaires au fonctionnement de l'application ne sont pas fournis avec le package d'installation.
Configuration matérielle
La configuration minimale pour un hébergement sur un réseau local est la suivante :
- Le serveur applicatif nécessite un CPU 2 cœurs assorti de 4 Go de RAM.
- Disque dur supérieur à 40 Go ou 60 Go.
Ces valeurs pourront évoluer selon la charge supportée par le serveur : nombre d'applications en place, nombre de personnes les utilisant simultanément, nombre de fichiers à stocker, etc.
Prérequis logiciel
Ce manuel d'installation est prévu pour un déploiement sur la distribution Linux Red Hat Enterprise. Utilisez une version compatible avec ASP.NET Core Runtime 8.0, par exemple RHEL 8 ou ultérieur. Il faut adapter les commandes Linux si une autre distribution est utilisée.
La distribution CentOS n'est pas conseillée, du fait de l'arrêt de son développement : les versions .NET 8+ ne seront pas supportées.
L'installation doit se faire avec un utilisateur ayant accès à la commande sudo. Les commandes présentées dans les chapitres suivants sont issues de RHEL 9.
Environnement logiciel
L'application utilise ASP.NET Core Runtime 8.0 ainsi que le toolkit Lagoon développé par DESIRADE.
Les composants à monitorer sont Apache et le SGBD, par exemple MySQL ou SQL Server. L'installation de la partie SGBD n'est pas détaillée dans ce document.
Procédure d'installation
Installation du serveur web Apache
Pour installer le serveur web Apache, exécuter les commandes suivantes.
Installation d'Apache
sudo dnf -y update
sudo dnf -y install httpd
Démarrer le serveur
sudo systemctl start httpd
Paramétrer le serveur pour un démarrage automatique
sudo systemctl enable httpd
Paramétrage d'Apache
Les applications Blazor utilisent un serveur web dédié nommé Kestrel. Pour associer Kestrel à une instance Apache, paramétrer Apache afin que toutes les requêtes liées à l'application soient redirigées vers ce serveur.
- Ouvrir le fichier de configuration Proxy :
vi /etc/httpd/cond.modules.d/00-proxy.conf. - Vérifier que les modules proxy nécessaires sont chargés.
- En configuration sécurisée HTTPS, ouvrir le fichier de configuration SSL et vérifier que la ligne existe :
vi /etc/httpd/cond.modules.d/00-ssl.conf. - Créer un fichier de configuration dans le répertoire
/etc/httpd/conf.d/MyApp.conf, en remplaçantMyApppar le nom de l'application.
# Configuration en mode HTTP
<VirtualHost *:80>
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
# Redirection WebSocket nécessaire à Blazor.
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://localhost:5000/$1" [P,L]
# Configuration du proxy vers Kestrel.
ProxyPreserveHost On
ProxyPassMatch ^/_blazor/(.*) http://localhost:5000/_blazor/$1
ProxyPass /_blazor ws://localhost:5000/_blazor
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
</VirtualHost>
# Configuration en mode HTTPS
<VirtualHost *:443>
SSLEngine On
SSLCertificateFile <Chemin vers le fichier CRT>
SSLCertificateKeyFile <Chemin vers le fichier KEY>
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
RequestHeader set "X-Forwarded-SSL" expr=%{HTTPS}
# Redirection WebSocket nécessaire à Blazor.
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://localhost:5000/$1" [P,L]
# Configuration du proxy vers Kestrel.
ProxyPreserveHost On
ProxyPassMatch ^/_blazor/(.*) http://localhost:5000/_blazor/$1
ProxyPass /_blazor ws://localhost:5000/_blazor
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
</VirtualHost>
Redémarrer le serveur web :
sudo systemctl restart httpd
Cas d'un serveur Apache existant
Si l'application est installée sur un serveur Apache existant hébergeant déjà des applications, deux solutions peuvent être mises en place.
Changer le port pour l'application
Ajouter dans le fichier de configuration créé précédemment :
Listen <port souhaité>
Puis remplacer le port dans la balise VirtualHost et redémarrer Apache.
sudo systemctl restart httpd
Définir un sous-domaine spécifique à l'application
Ajouter dans la balise VirtualHost le paramètre suivant :
ServerName <nom sous-domaine>
Puis redémarrer Apache.
sudo systemctl restart httpd
Installation du Framework .NET Core
L'application nécessite l'installation du Framework .NET Core pour son fonctionnement. Ce Framework existe dans les paquets du dépôt officiel de Red Hat depuis RHEL 8.
sudo dnf -y install aspnetcore-runtime-8.0
Pour vérifier que le paquet a bien été installé, exécuter :
dotnet --info
Installation de Chrome
Si l'application utilise la fonctionnalité d'export PDF, il est nécessaire d'installer le navigateur Chrome sur le serveur.
cd /tmp
sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
sudo dnf install -y ./google-chrome-stable_current_x86_64.rpm
Paramétrer ensuite le chemin vers l'exécutable du navigateur dans appsettings.json, comme décrit dans la configuration applicative.
Déploiement de l'application
Les étapes d'installation de l'application sont :
- Créer un répertoire, par exemple
mkdir /var/www/myapp. - Copier l'intégralité des fichiers de l'application dans ce répertoire.
- Vérifier que les paramètres de configuration dans
appsettings.jsonsont corrects :ConnectionStrings: chaînes de connexion à la base de données.Lagoon:PublicUrl: URL de l'application, c'est-à-dire celle fournie aux utilisateurs.Lagoon:UseForwardedHeaders: mettre cette valeur àtruesi Apache est en configuration sécurisée HTTPS.Lagoon:ChromiumPath: chemin vers l'exécutable du navigateur Chromium, par défaut/opt/google/chrome/chrome.FolderPath: répertoire contenant le fichier de trace, accessible en écriture à l'utilisateur exécutant l'application.
- Lancer l'application depuis le répertoire de l'application.
dotnet MYAPP.Server.dll
Pour vérifier que le serveur est fonctionnel :
curl -i http://localhost:5000
Vérifier que la réponse n'est pas une erreur. La page de connexion doit être accessible depuis un navigateur web.
Déclarer l'application comme service
Créer un fichier MyApp.service contenant les paramètres suivants :
[Unit]
Description=Lagoon application
[Service]
# Répertoire de l'application.
WorkingDirectory=/var/www/myapp
# Ligne de commande pour lancer le serveur applicatif.
# Si /usr/bin/dotnet ne fonctionne pas, utiliser 'which dotnet' pour trouver le bon répertoire.
ExecStart=/usr/bin/dotnet /var/www/myapp/MYAPP.Server.dll
# Pour récupérer les logs avec journalctl, définir un nom explicite.
SyslogIdentifier=MyApp
# Il est recommandé qu'un utilisateur soit dédié à l'application, ici app-svc.
# Pour mettre à jour les droits, utiliser 'chown -R app-svc /var/www/myapp'.
User=app-svc
# Pour s'assurer du redémarrage après un crash.
Restart=always
RestartSec=5
KillSignal=SIGINT
ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_NOLOGO=true
# https://inceptivetechnologies.com/blog/dot-net-core-kestrel-server-on-port-80/
# Pour mapper sur le port 80, désactiver les lignes suivantes :
# AmbientCapabilities=CAP_NET_BIND_SERVICE
# Environment=ASPNETCORE_URLS='http://+:80'
[Install]
WantedBy=multi-user.target
Voir la documentation Microsoft : https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-8.0&tabs=linux-ubuntu#create-the-service-file
Déployer le fichier :
sudo cp MyApp.service /etc/systemd/system/MyApp.service
sudo systemctl daemon-reload
Démarrer automatiquement l'application :
sudo systemctl enable MyApp
Démarrer l'application en tant que service :
sudo systemctl start MyApp
Vérifier que le service s'exécute correctement :
sudo systemctl status MyApp
Consulter la sortie d'exécution du service :
journalctl -u MyApp.service -xb -n 100 --no-pager
Effectuer un test de connexion à l'application depuis un navigateur web. Vous devez arriver sur la page de connexion.
Si une erreur de type 50X s'affiche, consulter les logs Apache dans /var/log/httpd/error_log. Dans le cas d'une erreur de type [proxy:error] ... Permission denied ..., exécuter :
sudo setsebool -P httpd_can_network_connect 1
sudo systemctl restart httpd
Procédure de mise à jour de version
Pour déployer une mise à jour de l'application :
- Arrêter le serveur applicatif.
sudo systemctl stop MyApp
- Si le fichier de configuration n'a pas été modifié dans cette nouvelle version, copier
appsettings.jsondans un autre répertoire. - Supprimer les fichiers du répertoire applicatif.
- Copier les fichiers de la nouvelle version dans le répertoire de l'application.
- Pour la configuration de l'application :
- Si le fichier de configuration a changé, modifier les paramètres comme lors de l'installation.
- Si le fichier n'a pas changé, remplacer
appsettings.jsonpar celui copié précédemment.
- Relancer le serveur applicatif.
sudo systemctl start MyApp