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