# SPARQL Protocol and RDF Query Language/Travail pratique/Faire un serveur Web
## Pourquoi faire un serveur Web ?

Dans ce TP, nous allons installer un serveur Web fonctionnel classique qui nous servira de base dans les prochains TP pour utiliser SPARQL.

## À savoir avant de commencer

On peut mettre en place un serveur de deux manières : comme une recette de cuisine ou comme un chimiste.
Le chimiste va essayer de comprendre ce qu’il fait avant de le faire. Le cuisinier va dérouler sa recette en espérant que ça fonctionne.
Si vous voulez suivre la recette, vous pouvez passer à la partie suivante, sinon je vous conseille de relire quelques articles de Wikipédia.

### C'est quoi un serveur ? Et un client ?

Lire l’article Client Serveur de Wikipédia

### C'est quoi une architecture trois tiers ?

Lire l’article Architecture trois tiers de Wikipédia

### C'est quoi un serveur HTTP et un serveur Web ?

Lire l’article sur le protocole HTTP de Wikipédia
Un serveur Web utilise le protocole HTTP, cela signifie qu’il utilise :
* le TCP comme couche de transport
* le port 80 (443 pour HTTPS)
Ces deux informations sont indispensables pour configurer votre Firewall et ainsi ouvrir un serveur Web.
De manière générale, la configuration d'un service HTTP pose souvent problème :
* Mauvaise configuration DNS
* Problème de Firewall
* Etc.

### Questions qu'on doit se poser avant de faire UN site Web

* Ce site Web est-il visible uniquement sur mon PC de développement ?
** Mon PC de développement a-t-il une IP fixe ou dynamique ?
* Ce site Web est-il visible de l’extérieur ou uniquement dans mon intranet ?
** Si l'ordinateur a une IP dynamique, s’assurer que le nom de l'ordinateur est bien résolu par le serveur DNS de votre réseau
** Si l'ordinateur a une IP fixe, vous pouvez faire un serveur Web sans vous soucier immédiatement du DNS
* Ce site Web est-il visible de l’extérieur ?
** Quelle IP fixe aura mon serveur ?
** Quel nom de domaine aura mon serveur ?
** Mon entreprise a-t-elle déjà un nom de domaine ?
*** Demander un sous-domaine ?

### Question à se poser avant de faire DES sites Web

Un serveur n’a qu’un seul port 80. En pratique pour héberger plusieurs sites Web sur un serveur, il faut :
* Attribuer au site Web un autre port
** Redirection à faire par un autre composant réseau
** Modifier le Firewall pour ouvrir des ports exotiques
* Faire du Virtual Hosting
Le Virtual Hosting permet de n'utiliser que le port 80 et d’afficher le site Web en fonction du nom de domaine demandé. Ce qui est très pratique quand on doit développer et tester plusieurs sites Web sur son poste de développement.

## Configurer un poste de développement Web avec un Virtual Hosting

Le Virtual Hosting permet de :
* travailler sur plusieurs sites Web en même temps
* simuler le nom de domaine comme si le service était en production et éviter d’utiliser des adresses IP (changeante en production et en développement)

### Installation : Ouvrir les ports avec Docker

On suppose que nous sommes dans un environnement de développement :
* Vous ne pouvez pas modifier le DNS de votre réseau
* Votre site tourne sur CentOS dans un conteneur Docker sur votre PC

#### Ouvrir le port HTTP de votre conteneur Docker

Pour un serveur Web, vous devez ouvrir le port 80. Vous devez modifier votre image Docker (reconstruire l’image et recréer le conteneur) afin d'exposer le port 80.
Rajouter dans votre fichier Docker :

#### Résoudre votre nom de domaine et connecter le port HTTP avec Windows ou Mac

Via Kitematic, vous devez relier le port 80 de votre PC à ce conteneur.
Pour résoudre votre nom de domaine sous Windows, rajouter la ligne suivante dans le fichier c://windows/system32/drivers/etc/hosts :
Quand votre service Web fonctionnera à la fin du TP, vous pourrez consulter votre site Web via l’adresse (ou sinon ).

#### Résoudre votre nom de domaine avec Linux

Il faut résoudre localement votre nom de domaine associé à l’adresse IP de votre conteneur. Ouvrir le fichier sur votre PC :
Ajouter le nom de domaine moncv avec son IP dans le fichier /etc/hosts de votre PC :
Sur le serveur, il faut résoudre ce nom de domaine. Ajouter le nom de domaine moncv dans le fichier /etc/hosts à la fin de la ligne où se trouve la définition du localhost :
Quand votre service Web fonctionnera à la fin du TP, vous pourrez consulter votre site Web via l’adresse (ou sinon ).

### Installation : Apache2
#### Installation du package

Nous installons ce qu’il manque sur le serveur : (souvent, Apache est déjà installé)
Sous Ubuntu
Sous Fedora ou CentOS

#### Activer le mod_rewrite

De nombreuses applications, comme Mediawiki, ne peuvent fonctionner qu'avec ce mode pour réécrire les URL. (Pour aller plus loin)
On active le mode en lecture et écriture "mod_rewrite" :
Sous Ubuntu
(A vérifier) Sous Fedora ou CentOS : on vérifie avec cette commande que le "mod_rewrite" est déjà activé.
Vous devez voir la ligne suivante s'afficher :

#### Activer le Virtual Hosting

On vérifie la configuration d’Apache pour faire du Virtual Hosting en vérifiant que la ligne suivante n’est pas précédée d'un commentaire (c'est-à-dire qu'elle ne doit pas être précédée d'un #):
* Sous Ubuntu cette ligne se trouve dans le fichier /etc/apache2/ports.conf
* Sous Fedora ou CentOS et les autres distributions Linux c’est dans le fichier /etc/httpd/conf/httpd.conf

#### Tester votre configuration

On vérifie la configuration d'Apache pour voir les sites Web déjà fonctionnels :
Sous Ubuntu
Sous Fedora ou CentOS
Vous pouvez voir qu'un site Web "default server" existe déjà.
Vous pouvez taper dans votre navigateur le nom du site Web monCV et vous devriez voir la page "It works!". L'adresse monCV pointe vers l'adresse 127.0.0.1 comme nous l'avons configurée précédemment ; puisqu’un site Web par défaut existe, il est logique que le site monCV pointe vers ce site Web.

## Configuration du site Web monCV

Nous allons configurer le site monCV pour qu’il pointe vers un répertoire précis de votre ordinateur.

### Création du répertoire qui va contenir le site

Nous allons créer le répertoire /var/www/moncv .

### Sous Ubuntu

Pour autoriser le chargement de fichier via SFTP, on change le propriétaire du répertoire.
Votre user_id correspond au login que vous tapez quand vous ouvrez une session sous Linux.
On duplique le fichier de configuration du site Web par défaut pour servir de modèle à notre nouveau site Web "moncv".
Pour cela, on exécute la commande suivante pour dupliquer le fichier de configuration :
Ensuite, on ouvre ce fichier :
On modifie ou on ajoute les lignes suivantes (en gras) dans ce fichier :
Pour prendre en compte ce fichier de configuration, il faut activer ce site Web avec cette commande :
Pour votre information, vous pouvez à tout moment désactiver ce site Web avec la commande suivante :
Pour prendre en compte la création de ce site Web, il faut redémarrer Apache :

### Sous Fedora ou CentOS

Pour autoriser le chargement de fichier via SFTP, on change le propriétaire du répertoire.
Votre user_id correspond au login que vous tapez quand vous ouvrez une session sous Linux.
Créer le fichier moncv.conf :
Insérer, dans le fichier moncv.conf, ce contenu :
Pour prendre en compte ces fichiers de configuration :
Vérifier que votre nouveau site web est dans la liste :
Pour prendre en compte la création de ce site Web, il faut redémarrer Apache :

### Transfert du fichier HTML via SFTP

On écrit ce texte dans le fichier index.html pour afficher MonCV à l'écran :
Puis avec un logiciel comme Filezilla, vous allez vous connecter au port 22 (ssh) de votre serveur Web puis transférer le fichier index.html dans le répertoire "/var/www/moncv".
Il suffit de tester en accédant à travers un navigateur à l'adresse http://moncv pour voir s'afficher "moncv" à l'écran.
Maintenant, que votre première page HTML, vous pourrez maintenant essayer de la rendre dynamique en y insérant du PHP pour afficher le contenu d'une base de données MySQL ou SPARQL par exemple. Pour le faire, il faudra installer PHP, MySQL... et un triplestore ! Ce sera pour un autre TP.

## Exercices

(1) Fabriquer une image Docker pour construire automatiquement le serveur Web de la même manière que dans ce TP et pour pouvoir mettre à jour le site Web via SFTP.
(A améliorer)
Dans le même répertoire pour fabriquer l’image Docker, il devra y avoir : Fichier : dockerfile (sans extension)
Fichier : moncv.conf
Fichier : index.html
* Trouver les options de démarrage du conteneur Docker afin de partager le répertoire de développement de votre site Web sur votre PC directement au sein du conteneur à l'emplacement du site Web.
* En utilisant Visual Studio Code Review ou votre IDE préféré, activer au travers de l’IDE votre conteneur en partageant la racine de votre projet Web pour tester vos pages Web.

## Pour aller plus loin

* Protocole HTTP
* Apache sur Ubuntu
* Sécurité de base sur Ubuntu
* Installation d'un serveur Web sécurisé
| Installer Ubuntu | Initiation à PHP |

## Les messages d'erreurs !!

Vous rencontrez un message d'erreurs ? Écrivez ici les messages que vous rencontrez et la solution que vous proposez (Désactiver SELinux n'est pas une bonne solution).