Aller au contenu principal

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çant MyApp par 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.json sont 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 à true si 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.json dans 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.json par celui copié précédemment.
  • Relancer le serveur applicatif.
sudo systemctl start MyApp