Accueil > Le développement > La formation > Les Outils Numériques > Les lignes de commande sous macOS > Les lignes de commande - Leçon 5 - rendre effective l’utilisation de la (...)

Les lignes de commande - Leçon 5 - rendre effective l’utilisation de la pile LAMP

dimanche 1er octobre 2023, par Vincent CALLIES

Vous l’aurez remarqué, nous utilisons parfois la commande sudo. Il est plus sûr d’utiliser la commande sudo dans Terminal que d’activer l’utilisateur root. L’utilisateur root peut tout faire. sudo permet à un utilisateur ordinaire de demander l’autorisation de faire une chose interdite. Pour en savoir plus sur sudo, ouvrez l’application Terminal et saisissez man sudo.

Pour en savoir plus sur l’utilisateur root :
https://support.apple.com/fr-fr/HT204012

Le répertoire où se trouve le site du serveur http Apache que nous avons lancé lors de la précédent leçon se trouve parmi les fichiers system qui sont protégés. Ils sont situés dans une arborescence au dessus du répertoire de l’utilisateur. Il serait intéressant de permettre la création de zones dédiée pour les utilisateurs.

1. Permettre à Apache de gérer les utilisateurs

1.1 Modifier la configuration principale du serveur web Apache

a) avec le serveur natif

Avant de procéder à une modification de la configuration, il est prudent d’en faire une copie
sudo cp -i /etc/apache2/httpd.conf /etc/apache2/httpd.conf.bak

Vous pouvez ensuite modifier la configuration principale du serveur web Apache avec la commande :
sudo vim /etc/apache2/httpd.conf
où l’on retrouve les lignes ci-dessous et on les décommente si nécessaire. Pour décommenter une ligne, il faut retirer le caractère dièse (#) à son début.

LoadModule userdir_module libexec/apache2/mod_userdir.so
LoadModule include_module libexec/apache2/mod_include.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
Include /private/etc/apache2/extra/httpd-userdir.conf

Une petite astuce sous vim :
Pour rechercher une chaîne de caractères, tapez / suivi de la chaîne recherchée et appuyez sur Return. vim positionne le curseur sur la première occurrence de la chaîne trouvée. Par exemple taper /userdir_module vous permettra de retrouver l’appel au module et de retirer le commentaire (#) le précédent et le rendant inactif.

b) avec le serveur supplémentaire

Si vous utiliser un serveur supplémentaire installé par Brew (voir la leçon 4), vérifier que cette installation est convenablement faite avec la commande :
brew info httpd

L’édition du fichier de configuration n’a pas le même accès :
vim /opt/homebrew/etc/httpd/httpd.conf

Les modules ne sont pas placés aux même endroits :

LoadModule userdir_module lib/httpd/modules/mod_userdir.so
LoadModule include_module lib/httpd/modules/mod_include.so
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
# User home directories 
Include /opt/homebrew/etc/httpd/extra/httpd-userdir.conf

1.2 Modifier la configuration des utilisateurs

a) avec le serveur natif :

Il faut modifier le script ci-dessus appelé par un include avec la commande :
sudo vim /etc/apache2/extra/httpd-userdir.conf

Vous y verrez une ligne de commentaire qui indique :
# Required module: mod_authz_core, mod_authz_host, mod_userdir
C’est cette vérification que nous avons faite dans le fichier httpd.conf ci-dessus.
Vous y verrez une ligne indiquant
UserDir Sites
Cela signifie que c’est le répertoire Sites, dans le dossier de l’utilisateur, qui permet d’accueillir les requêtes du serveur http. Le chemin sera : /Users/username/Sites/
Vous devez ajouter ou décommenter dans le présent fichier la ligne suivante :
Include /private/etc/apache2/users/*.conf

b) avec le serveur secondaire

Si vous êtes avec un second serveur installé, éditer le fichier suivant :
vim /opt/homebrew/etc/httpd/extra/httpd-userdir.conf

Vous y verrez une ligne indiquant
UserDir public_html
Cela signifie que c’est le répertoire public_html, dans le dossier de l’utilisateur, qui permet d’accueillir les requêtes du serveur http. Le chemin sera : /Users/username/public_html/
Vous devez ajouter ou décommenter dans le présent fichier la ligne suivante :
Include /opt/homebrew/etc/httpd/users/*.conf

1.3 Créer ma configuration en tant qu’utilisateur

a) avec le serveur natif :

Enfin, après s’être placé dans le répertoire racine, il convient de créer le fichier username.conf (ou username sera votre nom d’user) avec la commande :
sudo vim /etc/apache2/users/username.conf par exemple sudo vim /etc/apache2/users/vincent.conf
Vous devez saisir ces lignes (ou username sera votre nom d’user) :

<Directory "/Users/username/Sites/">
  AllowOverride All
  Options Indexes MultiViews FollowSymLinks
  Require all granted
</Directory>

Ces opérations faites, lançons le serveur Web
sudo apachectl start
et vérifions les modules installés avec l’instruction :
apachectl -t -D DUMP_MODULES
Doivent apparaitre :

userdir_module (shared)
include_module (shared)
rewrite_module (shared)

Tester l’accès depuis Safari :
au site global
http://localhost
puis au site de l’user (vous)
http://localhost/~vincent/
où vincent est le nom de l’utilisateur.

Si vous avez un problème imprévu de configuration, vous pouvez lancer un test sur cette configuration qui pourra vous dire où est l’erreur avec la commande :
sudo apachectl configtest

b) avec le serveur secondaire

Créons un répertoire users
mkdir /opt/homebrew/etc/httpd/users/
Vérifions sa bonne création et ses droits :
cd /opt/homebrew/etc/httpd
ls -la

Créons le fichier de configuration en tant qu’utilisateur (où vincent est le nom de l’utilisateur.)
vim /opt/homebrew/etc/httpd/users/vincent.conf

Vous devez saisir ces lignes (ou vincent sera votre username) :

<Directory "/Users/vincent/public_html/">
  AllowOverride All
  Options Indexes MultiViews FollowSymLinks
  Require all granted
</Directory>

Relancer le serveur
brew services start httpd

Tester l’accès en ligne de commande :

  • le site global
    curl http://localhost:8080
  • puis au site de l’user (vous)
    curl http://localhost:8080/~vincent/

2. Utilisation de votre site utilisateur

a) avec le serveur natif :

L’utilisateur à maintenant son site à gérer dans le répertoire Sites (situé à la racine de son répertoire d’utilisateur).

Si vous rencontrer des erreurs, il peut être utile d’aller consulter le journal des erreurs d’Apache. Vous pouvez le faire avec la commande ci-dessous :
cat /var/log/apache2/error_log

Une erreur sera rédigée de la façon suivante dans le log :

[Sat Sep 30 18:39:56.671447 2023] [core:crit] [pid 71538] (13)Permission denied : [client ::1:52090] AH00529 : /Users/vincent/Sites/.htaccess pcfg_openfile : unable to check htaccess file, ensure it is readable and that ’/Users/vincent/Sites/’ is executable

Même si vous ne rencontrez pas l’erreur ci-dessus, les commandes que nous allons faire pour corriger le problème peuvent vous intéresser.

b) avec le serveur secondaire

Le journal des erreurs du serveur, dont le nom et la localisation sont définis par la directive ErrorLog , est sans doute le journal le plus important tant votre pratique vous amènera à le consulter pour identifier ce qui ne fonctionne pas. Pour savoir comment est définie votre directive, il vous suffit d’éditer le ficher de configuration de votre serveur Web et de retrouver la directive. Pour ce faire vous pouvez utiliser les lignes de commande suivantes :
Editer le ficher de configuration depuis son répertoire
vim httpd.conf
rechercher la directive avec les commandes propre à vim :
/ErrorLog
Vous trouverez un résultat de ce type :
ErrorLog "/opt/homebrew/var/log/httpd/error_log"
Il ne vous restera plus qu’à le lire
vim /opt/homebrew/var/log/httpd/error_log

2.1 Les droits des répertoires et des fichiers

Il y a, tout d’abord, les droits sur les fichiers et répertoires. la commande ls suivie de l’argument -l permet de connaitre ces droits.
Placez vous dans le répertoire de l’utilisateur :
cd ~
Regardez les droits du répertoire Sites et de ce qu’il contient :
ls -l -a Sites

  • Le répertoire Sites, représenté par un point (« . ») est indiqué avec les droits drwx------.
    La première lettre, la lettre d, signifie qu’il s’agit d’un répertoire (« a directory » en anglais). _ Les autres lettres doivent se lire en série, trois lettres pour l’utilisateur (ou « user » en anglais), trois lettres pour le groupe (ou « group » en anglais), trois lettres pour les autres (ou « others » en anglais).
    Autrement dit, l’utilisateur pour le répertoire Sites, se voit attribuer trois lettres rwx. le r signifie un droit en lecture (pour « read » en anglais), le w signifie écrire (« write » en anglais), le x est pour exécuter (« execute » en anglais).
    le groupe ou les autres n’ont aucun droit ce qui se traduit par un tiret (« - »).
  • le fichier index.html.en est indiqué avec les droits -rwxr-xr-x, codification que vous pouvez maintenant interprétée, sachant que le premier tiret « - » indique simplement qu’il s’agit d’un fichier.

L’examen de ces droits permet d’identifier que le répertoire Sites n’a pas été créé avec des droits suffisants. Pour lui donner, pour les trois groupes, les droits maximaux, il est possible de saisir cette commande :
chmod +rwx Sites
Reste que ce serait excessif. Les droits nécessaires sont les suivants
chmod 705 Sites
Nous utilisons ici des chiffres et non des lettres, ce qui est une autre convention, facile à retenir une fois que l’on sait qu’il s’agit du chiffre à séparer en trois, pour les trois groupes, et chaque groupe est la simple addition de permission ainsi réparties : la lecture = 4, l’écriture = 2, l’exécution = 1.
Il reste aussi à optimiser les droits du fichier index.html.en qui n’a pas besoin de droit de groupe.
chmod 705 index.html.en

On peut se demander ce qu’est ce fichier index.html auquel un .en a été ajouté.

2.2 L’index et les négociations de language

Le jargon Apache parle de « Négociation de language ». Le serveur Web http permet la gestion d’une extension liée au langage. Lorsque, précédemment dans cet article, vous avez défini votre configuration en tant qu’utilisateur, vous avez introduit le mot clé MultiViews qui demande cette fonctionnalité.

a) avec le serveur natif :

Rééditer le fichier de configuration de l’utilisateur :
sudo vim /etc/apache2/users/username.conf (par exemple sudo vim /etc/apache2/users/vincent.conf) et modifiez le entièrement ainsi :
Vous devez saisir ces lignes (ou username sera votre nom d’user) :

<Directory "/Users/username/Sites/">
 AllowOverride none
 Options -MultiViews
 Require all granted
</Directory>

Comme on n’utilise pas de .htaccess on peut entièrement désactivée ce recours en définissant la directive AllowOverride à none
Nous avons supprimé l’usage de MultiViews
Nous avons rappelé que l’index serait soit index.html soit index.php
Nous avons autorisé les accès.

Renommez index.html.en en index.htmlseulement :
mv index.html.en index.html
Puis tester le site de l’utilisateur
http://localhost/~vincent/

Et si nous parlions de cet index.php ?

b) avec le serveur secondaire

Editions le fichier de configuration de l’utilisateur (ici vincent)
vim /opt/homebrew/etc/httpd/users/vincent.conf

Saisissez les lignes suivantes

<Directory "/Users/vincent/public_html/">
  AllowOverride All
  Options -MultiViews
  Require all granted
</Directory>

Relancer le serveur
brew services start httpd

Vérifions si l’appel de l’URI est possible :
curl http://localhost:8080/~vincent

Dans la négative, vérifions que le répertoire public_html existe bien.
cd ~
ls -la
Si le répertoire n’existe pas, créons le :
mkdir public_html
Créons ensuite un fichier index.html dans le dossier
vim public_html/index.html
Nous y écrirons le code HTML suivant :

<html><head>
<title>Leçon 5 du SYNPER</title>
</head><body>
<h1>C'est fou !</h1>
<p>J'aime apprendre.</p>
</body></html>

2.3 L’index en PHP

Après s’être placé dans le répertoire Sites ou public_html, créons un index en php :
vim index.php

Ecrivez :

<?php
echo 'Ceci est mon texte envoyé en Php !';

renommons index.html pour le rendre inutilisable :
mv index.html index.html.bak

Puis testons le site de l’utilisateur
http://localhost/~vincent/
ou
http://localhost:8080/~vincent/

Nous aurons une erreur 403 Forbidden. En effet, ne trouvant pas le fichier index.html, le serveur ne va pas chercher le fichier index.php.

Ajoutons une ligne à notre fichier de configuration d’utilisateur pour lui dire, si l’index.html n’est pas là, d’utiliser l’index.php.
Pour le serveur Apache intégrer, éditer le fichier ainsi :
sudo vim /etc/apache2/users/vincent.conf
Pour le serveur secondaire, utiliser la ligne de commande
vim /opt/homebrew/etc/httpd/users/vincent.conf
(où vincent est le nom d’utilisateur).
ajoutons la ligne suivante :
DirectoryIndex index.html index.php

Relançons le serveur Apache, s’il s’agit du serveur natif par :
sudo apachectl -k restart
s’il s’agit du serveur secondaire :
brew services start httpd

Le script PHP va s’afficher mais ne sera pas interprété. En effet, ne trouvant pas le fichier index.html, le serveur va bien chercher le fichier index.php mais ne l’interprète pas. Il faut configurer le serveur pour qu’il puisse servir des pages PHP.

a) avec le serveur natif :

Le fichier de configuration d’Apache sous macOS précise, dans ses commentaires, que le PHP était obsolète dans macOS 11 et supprimé de macOS 12. Nous n’allons donc pas pouvoir réactiver le module php. Il faudra aller le rechercher dans l’installation que nous avons faite lors de l’installation de Composer (voir la leçon 4). Vous retrouverez l’installation faite par Homebrew par la ligne de commande suivante :
cd $HOMEBREW_REPOSITORY/Cellar/php/
Le module a appelé par Apache sera dans :
cd $HOMEBREW_REPOSITORY/opt/homebrew/opt/php/lib/httpd/modules/

Nous ouvrons le fichier de configuration d’Apache
sudo vim /etc/apache2/httpd.conf
Vous verrez sans doute un commentaire dans le fichier de configuration Apache :
#PHP was deprecated in macOS 11 and removed from macOS 12
Ce qui signifie que l’Apache d’Apple n’utilise pas le php.
Nous ajoutons la ligne suivant pour appeler le module php :
LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so

Puis nous précisons que si le module est chargé, il faut utiliser le PHP pour les fichiers qui utilise l’extension adéquate :

<IfModule php_module>
 <FilesMatch .php$>
  SetHandler application/x-httpd-php
 </FilesMatch>
</IfModule>

Mais le simple ajout de ce module ne suffit pas. Cela va générer une erreur que vous pourrez retrouver dans :
sudo apachectl configtest

[Sun Oct 01 19:48:55.864782 2023] [so:error] [pid 76530] AH06665 : No code signing authority for module at /opt/homebrew/opt/php/lib/httpd/modules/libphp.so specified in LoadModule directive.
httpd : Syntax error on line 72 of /private/etc/apache2/httpd.conf : Code signing absent - not loading module at : /opt/homebrew/opt/php/lib/httpd/modules/libphp.so

Il s’agit d’une précaution pour assurer la sécurité de votre serveur : des modules ne peuvent être ajouté que s’ils sont signés. Il vous faut donc ouvrir votre Trousseau d’accès, et depuis le menu, Assistant de configuration | Créer une autorité de certificat et choisir dans les options, Signature de code. Une procédure est ici détaillée en anglais. vous devrez mettre entre guillemet à la fin de la ligne, le titre de ce certificat.

En relançant le serveur Apache :
sudo apachectl -k restart

Un message de confirmation devrait apparaître :

[Sun Oct 01 21:43:31.910876 2023] [so:notice] [pid 78282] AH06662 : Allowing module loading process to continue for module at /opt/homebrew/opt/php/lib/httpd/modules/libphp.so because module signature matches authority "AC de vincent" specified in LoadModule directive

Le fichier Php est maintenant interprété !

b) avec le serveur secondaire :

Nous ajoutons la ligne suivant pour appeler le module php :
LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so
Puis nous précisons que si le module est chargé, il faut utiliser le PHP pour les fichiers qui utilise l’extension adéquate :

<IfModule php_module>
 <FilesMatch .php$>
  SetHandler application/x-httpd-php
 </FilesMatch>
</IfModule>

En relançant le serveur Apache :
brew services restart httpd

Pour connaitre l’installation php faite, n’hésitez pas à solliciter Homebrew par la ligne de commande ci-après :
brew info php

3 Travailler en PHP

3.1 Travailler en mode local en php

Pour connaitre le lieu ou est votre fichier de configuration, passez la commande suivante :
php -r "phpinfo();" | grep php.ini

editer le fichier dont le chemin vous est donné, par exemple :
vim /opt/homebrew/etc/php/8.2/php.ini

3.2 Désactivé jit

Faire une recherche de la section concernant le module pcre :
/pcre

décommenter la ligne et donner la valeur zéro à
pcre.jit=0

3.3 Permettre l’affichage de toutes les erreurs

comme nous sommes en local, vous pouvez ajouter les lignes suivantes au fichierphp.ini :

; Enable error reporting
error_reporting = E_ALL

Conclusion

Le SYNPER donne des formations d’initiation à la programmation. Les articles de cette rubrique accompagnent une formation sur les lignes de commande avec macOS.

  • Un premier article qui vous a appris à passer des commandes sous Linux.
  • Un second article vous a appris à regrouper ces commandes et les exécuter depuis un fichier.
  • Le troisième article vous a appris à appeler un dépôt et procéder à une installation par paquets.
  • Le quatrième article vous a appris à utiliser la Pile LAMP en ligne de commande.
  • Le présente article, très technique, montre que vous maitriser cet univers et sa complexité. Bravo ! Voyez attentif à ce que le fait qu’Apache soit livré avec le macOs peut provoquer, lors de mise à jour importante, le remplacement de votre fichier de configuration du service Web http et donc vous amener à devoir refaire les opérations ci-dessus.