cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu

Vous avez peut-être déjà vu des adresses web contenant le caractère tilde ~, par exemple : https://web.media.mit.edu/~mres/.

Ce type d’adresses est fréquemment utilisé dans les universités, et il peut vous simplifier la vie lorsque vous souhaitez tester un site internet localement.

La syntaxe se lit alors comme suit : http[s]://serveur/~utilisateur/ et permet d’avoir un « site web par utilisateur ».



Installation

Après l’installation d’apache :

sudo apt install -y apache2

Vous devrez activer le module userdir :

sudo a2enmod userdir

Pour mémoire a2enmod est une contraction de « Apache2 Enable MODule ».

Ensuite vous devrez redémarrer votre serveur Apache :

sudo systemctl restart apache2.service


Création de votre site web

Le site web de chaque utilisateur se trouve dans un dossier public_html à la racine du compte, créons ce dossier :

mkdir ~/public_html/

Ensuite, il nous faut un site. Je vous propose de créer un site basique, ne contenant qu’un seul fichier qui doit se nommer index.html.

cat <<EOF >~/public_html/index.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Le site de ${USER}</title>
</head>
<body>
<h2>Super ! Ça marche !</h2>
</body>
EOF

On peut tester ce site à l’aide de :

curl --dump-header - "http://127.0.0.1/~${USER}/"

La commande curl permettant d’obtenir l’entête (« header ») ainsi que le document lui-même dans un même résultat.

Pour obtenir l’adresse que vous devez utiliser dans votre navigateur, vous pouvez utiliser la commande suivante :

echo "http://127.0.0.1/~${USER}/"
  • Résultat attendu de la commande curl
    HTTP/1.1 200 OK
    Date: Mon, 22 Jan 2024 06:21:47 GMT
    Server: Apache/2.4.52 (Ubuntu)
    Last-Modified: Sun, 21 Jan 2024 11:40:38 GMT
    ETag: "97-60f732ea94f6d"
    Accept-Ranges: bytes
    Content-Length: 151
    Vary: Accept-Encoding
    Content-Type: text/html
    
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="utf-8">
    <title>Le site de VOTRE_UTILISATEUR</title>
    </head>
    <body>
    <h2>Super ! Ça marche !</h2>
    </body>
    


Quelques infos utiles concernant Apache2

Ici on part du principe que l’on parle d’un serveur Apache installé avec les paquets Linux standard, car au final tout est configurable, même la localisation des fichiers de configuration.

  • Le dossier de configuration est : /etc/apache2/.
  • Le fichier de configuration principal est : /etc/apache2/apache2.conf, il fait appel à plusieurs autres fichiers (il n’y a aucune de raison de modifier le fichier principal, partez du principe que les exceptions ne vous concernent pas).
  • Le dossier contenant les logs est : /var/log/apache2.
  • La configuration des différents sites hébergés se trouve dans le dossier /etc/apache2/sites-available/. Ces “sites” sont appelés des hôtes. Il y a, normalement, un fichier de configuration par hôte.
  • La configuration de l’hôte par défaut se trouve dans le fichier : /etc/apache2/sites-available/000-default.conf
  • Les hôtes actifs se trouvent dans le répertoire /etc/apache2/sites-enabled/, mais attention, ici on ne met pas des fichiers, mais un lien vers le fichier de configuration correspondant dans /etc/apache2/sites-available/. Ce lien est géré par les commandes a2ensite (Apache2 ENable SITE) et a2dissite (Apache2 DISable SITE).
  • On a de manière similaire pour la configuration on a les dossiers /etc/apache2/conf-available /etc/apache2/conf-enabled d’une part, et d’autre part les commandes a2disconf et a2enconf.
  • Et pour les modules, c’est sans surprise /etc/apache2/mods-available et /etc/apache2/mods-enabled avec les commandes a2dismod et a2enmod.
  • L’arborescence de la configuration d’Apache
    /etc/apache2/
    ├── apache2.conf
    ├── conf-available
    │   ├── charset.conf
    │   ├── gitweb.conf
    │   ├── javascript-common.conf
    │   ├── localized-error-pages.conf
    │   ├── other-vhosts-access-log.conf
    │   ├── security.conf
    │   ├── serve-cgi-bin.conf
    │   ├── w3c-linkchecker.conf
    │   └── w3c-markup-validator.conf ➟ ../../w3c/httpd.conf
    ├── conf-enabled
    │   ├── charset.conf ➟ ../conf-available/charset.conf
    │   ├── gitweb.conf ➟ ../conf-available/gitweb.conf
    │   ├── javascript-common.conf ➟ ../conf-available/javascript-common.conf
    │   ├── localized-error-pages.conf ➟ ../conf-available/localized-error-pages.conf
    │   ├── other-vhosts-access-log.conf ➟ ../conf-available/other-vhosts-access-log.conf
    │   ├── security.conf ➟ ../conf-available/security.conf
    │   ├── serve-cgi-bin.conf ➟ ../conf-available/serve-cgi-bin.conf
    │   ├── w3c-linkchecker.conf ➟ ../conf-available/w3c-linkchecker.conf
    │   └── w3c-markup-validator.conf ➟ ../conf-available/w3c-markup-validator.conf
    ├── envvars
    ├── magic
    ├── mods-available
    │   ├── access_compat.load
    │   ├── …
    │   └── xml2enc.load
    ├── mods-enabled
    │   ├── access_compat.load ➟ ../mods-available/access_compat.load
    │   ├── alias.conf ➟ ../mods-available/alias.conf
    │   ├── alias.load ➟ ../mods-available/alias.load
    │   ├── …
    │   ├── userdir.conf ➟ ../mods-available/userdir.conf
    │   └── userdir.load ➟ ../mods-available/userdir.load
    ├── ports.conf
    ├── sites-available
    │   ├── 000-default.conf
    │   └── default-ssl.conf
    └── sites-enabled
        └── 000-default.conf ➟ ../sites-available/000-default.conf
    


En cas de problème

Il est possible de regarder dans le journal systemd les évènements du service :

journalctl -xeu apache2.service

Voir même regarder l’état du service :

systemctl restart apache2.service

On peut regarde dans le fichier d’erreur d'Apache :

cat /var/log/apache2/error.log


Quelques erreurs que vous pouvez rencontrer

Si vous ne pouvez pas accéder au site, par exemple :

curl "http://127.0.0.1/~${USER}/"
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.52 (Ubuntu) Server at 127.0.0.1 Port 80</address>
</body></html>
curl "http://127.0.0.1/~${USER}/" --head
HTTP/1.1 403 Forbidden
Date: Sun, 21 Jan 2024 12:03:50 GMT
Server: Apache/2.4.52 (Ubuntu)
Content-Type: text/html; charset=iso-8859-1

Ces 2 résultats peuvent s’obtenir en une seule commande à l’aide de :

curl --dump-header - "http://127.0.0.1/~${USER}/"

Premier cas

Dans les logs vous trouverez alors une erreur du type :

[_DATE_] [authz_core:error] [pid _PID_:tid _TID_] [client 127.0.0.1:_PORT_] AH01630: client denied by server configuration: /mnt/data/home/USER/public_html/

Commençons par regarder quel est le vrai chemin de votre dossier public_html :

realpath ~/public_html/

Si le résultat est /home/VOTRE_USER/public_html, c’est ce bien ce qui est attendu.

Si le résultat est différent, il faut adapter la configuration. C’est le cas qui engendre l’erreur ci-dessus.

Imaginons que le résultat est /mnt/data/home/USER/public_html, vous devrez adapter la configuration du module userdir que nous avons activé plus haut.

Par défaut la configuration est la suivante :

<IfModule mod_userdir.c>
    UserDir public_html
    UserDir disabled root

    <Directory /home/*/public_html>
        AllowOverride FileInfo AuthConfig Limit Indexes
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
        Require method GET POST OPTIONS
    </Directory>

</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

On comprend que /mnt/data/home/USER/public_html ne correspond pas au motif /home/*/public_html, il faut adapter la configuration à l’aide de :

sudo nano /etc/apache2/mods-available/userdir.conf

Vous avez 2 solutions, soit vous modifier la directive Directory, soit vous ajouter une nouvelle directive. C’est le second choix qui est présenté ci-dessous :

<IfModule mod_userdir.c>
    UserDir public_html
    UserDir disabled root

    <Directory /home/*/public_html>
        AllowOverride FileInfo AuthConfig Limit Indexes
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
        Require method GET POST OPTIONS
    </Directory>

    <Directory /mnt/data/home/*/public_html>
        AllowOverride FileInfo AuthConfig Limit Indexes
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
        Require method GET POST OPTIONS
    </Directory>

</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Second cas

Autre cas, vous la commande curl (ou votre navigateur) vous donne la même erreur que plus haut, mais cette fois-ci dans les logs vous avez une erreur du type :

[_DATE_] [core:error] [pid _PID_:tid _TID_] (13)Permission denied: [client 127.0.0.1:_PORT_] AH00132: file permissions deny server access: /home/USER/public_html/index.html

Il est probable qu’il s’agisse alors d’un problème de droit sur le répertoire public_html et/ou sur le fichier index.html.

Le répertoire doit être accessible en lecture à tout le monde, pour un répertoire cela indique qu’il doit avoir les bits r et x: autrement que ces attributs aient la forme drwxr-xr-x ou la valeur 755

chmod 755 ~/public_html

En ce qui concerne les fichiers (ici le fichier index.html), ils doivent être accessibles à tous le monde en lecture (-rw-r--r-- soit 644).

chmod 644 ~/public_html/index.html

Si vous devrez faire cela sur toute une arborescence, vous pouvez utiliser la commande find comme suit :

find ~/public_html/ '(' -type d -printf "D: %p\n" -exec chmod 755 {} \; ')' -or '(' -type f -printf "F: %p\n" -exec chmod 644 {} \; ')'


Liens

Vous pouvez écrire votre première page web à partir de ces billets :

Si vous n’être pas sous Linux :

ᦿ


ℹ 2006 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog