Pour travailler en local il faut bien une configuration de travail. Voila comment installer un serveur web sur Mac. Ici on va utiliser homebrew avoir une installation à jour quelque soit la version de système. Donc au final : Apache + PHP + MariaDB + PhpMyAdmin.

Installer un serveur test sur Mac

Lundi 14 janvier 2019

On pourrait se contenter d'installer par exemple XAMPP c'est tellement simple… mais non. Pour ne citer qu'une raison : leur PHP n'est pas compilé avec tous les modules généralement nécessaires, comme intl par exemple, ce qui occasionnera des soucis avec l'interprétation d'expressions régulières, l'impossibilté d'istaller des frameworks. Et tenter de modifier la config de XAMPP est plus compliqué que de configurer une installation perso. Ici j'utilise Homebrew qui tient à jour ses packages. Leur package PHP me semble avoir toutes les extensions souhaitables.

Installer Homebrew

Si ce n'est déjà fait :

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew doctor
$ brew tap homebrew/core

Installer Apache et PHP

  1. Je stoppe la version d'Apache incluse avec MacOS et je préviens son lancement au redémarrage
sudo apachectl stop
sudo launchctl unload /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
  1. J'installe par homebrew puis je vérifie quelle est la version active
$ brew install httpd
$ which apachectl
    > /usr/sbin/apachectl
  1. à la fin de l'installation j'ai les retours suivants qui m'indiquent les répertoires d'installation, le port par défaut, le répertoire de pages web et ce que je dois faire pour qu'Apache soit lancé au démarrage.
DocumentRoot is /usr/local/var/www
The default ports have been set in /usr/local/etc/httpd/httpd.conf to 8080 and in
/usr/local/etc/httpd/extra/httpd-ssl.conf to 8443 so that httpd can run without sudo.
To have launchd start httpd now and restart at login:
  brew services start httpd
Or, if you don't want/need a background service you can just run:
  apachectl start
==> Summary
🍺  /usr/local/Cellar/httpd/2.4.37_1: 1,648 files, 26.9MB
  1. dans le terminal pour obtenir lancement automatique d'Apache
$ brew services start httpd
    > Successfully started `httpd` (label: homebrew.mxcl.httpd)
  1. à partir de la on aura besoin de retrouver ses petits alors voila comment créer puis mettre à jour la BDD locate sur son mac… ça prend un certain temps
$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
$ sudo /usr/libexec/locate.updatedb
    > je cherche l'adresse du script httpd correspondant à l'install de homebrew
$ locate apachectl
    > /usr/local/Cellar/httpd/2.4.37_1/bin/apachectl
    > le Cellar c'est l'arrière cuisine de homebrew :)
    > donc pour lancer ou stopper Apache j'utilise
$ /usr/local/Cellar/httpd/2.4.37_1/bin/apachectl -k start
$ /usr/local/Cellar/httpd/2.4.37_1/bin/apachectl stop
  1. je le lance manuellement pour la première fois, après ce sera automatique à chaque lancement ou login
$ /usr/local/Cellar/httpd/2.4.37_1/bin/apachectl -k start
    > je lance le navigateur sur localhost:8080 -> It works !
  1. enfin pour PHP
$ brew list
    > affiche les formules installées
$ brew uninstall php@7.1
    > désinstalle une version antérieure
$ brew update -f
    > force une mise à jour complète des formules depuis les dépots en ligne
$ brew search php
    > cherche les versions de php disponibles
$ brew install php@7.2
    > lance l'installation de php 7.2

Réglages pour Apache et PHP

Le retour de l'installation est le suivant :

To have launchd start php@7.2 now and restart at login:
$ brew services start php@7.2
Or, if you don't want/need a background service you can just run:
$ php-fpm
==> Summary
🍺  /usr/local/Cellar/php@7.2/7.2.13: 514 files, 74.9MB
==> Caveats
==> php@7.2
To enable PHP in Apache add the following to httpd.conf and restart Apache:
    LoadModule php7_module /usr/local/opt/php@7.2/lib/httpd/modules/libphp7.so
```
    
        SetHandler application/x-httpd-php
    
    ```

Finally, check DirectoryIndex includes index.php
    DirectoryIndex index.php index.html

The php.ini and php-fpm.ini file can be found in:
    /usr/local/etc/php/7.2/

php@7.2 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have php@7.2 first in your PATH run:
  echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> ~/.bash_profile
  echo 'export PATH="/usr/local/opt/php@7.2/sbin:$PATH"' >> ~/.bash_profile

For compilers to find php@7.2 you may need to set:
  export LDFLAGS="-L/usr/local/opt/php@7.2/lib"
  export CPPFLAGS="-I/usr/local/opt/php@7.2/include"


To have launchd start php@7.2 now and restart at login:
  brew services start php@7.2
Or, if you don't want/need a background service you can just run:
  php-fpm

Donc successivement pour que PHP soit lancé à chaque démarrage et pris en charge par Apache :

$ brew services start php@7.2
$ sudo nano /usr/local/etc/httpd/httpd.conf

et ajouter dans httpd.conf

LoadModule
php7_module /usr/local/opt/php@7.2/lib/httpd/modules/libphp7.so
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

puis ajouter index.php au DirectoryIndex.

DirectoryIndex index.php index.html index.htm

on sauvegarde et on fermet httpd.conf puis via le terminal

$ echo 'export PATH=&quot;/usr/local/opt/php@7.2/bin:$PATH&quot;' >> ~/.bash_profile
$ echo 'export PATH=&quot;/usr/local/opt/php@7.2/sbin:$PATH&quot;' >> ~/.bash_profile
$ export LDFLAGS=&quot;-L/usr/local/opt/php@7.2/lib&quot;
$ export CPPFLAGS=&quot;-I/usr/local/opt/php@7.2/include&quot;

$ /usr/local/Cellar/httpd/2.4.37_1/bin/apachectl stop
$ /usr/local/Cellar/httpd/2.4.37_1/bin/apachectl -k start
ou
$ /usr/local/Cellar/httpd/2.4.37_1/bin/apachectl restart

Autres modifications optionnelles pour le httpd.conf

#modifier
Listen 80 ou 8000 ou 8080

#on peut vérifier s'il y a déjà un processus sur un port
#ce qui posera un problème au lancement d'Apache
#ici je garde le port par défaut 8080 après avoir vérifié
#qu'il n'est pas utilisé
$ sudo lsof -i&#8239;:8080

#ajouter
#ServerName www.example.com:8080
ServerName localhost

#créer un répertoire perso et l'appeler
DocumentRoot &quot;/Users/eric/Sites&quot;
<Directory &quot;/Users/eric/Sites&quot;>

#modifier comme suit
Options Indexes FollowSymLinks Multiviews
MultiviewsMatch Any

#décommenter dans httpd.conf

LoadModule authz_core_module libexec/apache2/mod_authz_core.so
LoadModule authz_host_module libexec/apache2/mod_authz_host.so
LoadModule userdir_module libexec/apache2/mod_userdir.so
LoadModule include_module libexec/apache2/mod_include.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule socache_shmcb_module lib/httpd/modules/mod_socache_shmcb.so
LoadModule ssl_module lib/httpd/modules/mod_ssl.so
LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so

#pour permettre les répertoires utilisateurs
Include /private/etc/apache2/extra/httpd-userdir.conf

Include /usr/local/etc/httpd/extra/httpd-vhosts.conf
Include /usr/local/etc/httpd/extra/httpd-ssl.conf

#enregistrer et fermer httpd.conf

Générer une clef et un certificat SSL

$ cd /usr/local/etc/httpd
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt

Configurer un Vhost en SSL (firefox provoquera une erreur car le certificat est autosigné, il suffit alors d'ajouter une exception pour les essais). Pour un site en ligne il faudra se procurer un certificat authentifié.

$ sudo nano /usr/local/etc/httpd/extra/httpd-vhosts.conf

<VirtualHost *:8443>
    DocumentRoot &quot;/Users/eric/Sites&quot;
        ServerName dev.com
        SSLEngine on
        SSLCertificateFile &quot;/usr/local/etc/httpd/server.crt&quot;
        SSLCertificateKeyFile &quot;/usr/local/etc/httpd/server.key&quot;
</VirtualHost>

<VirtualHost *:8080>
    ServerAdmin eric@dev.example.com
    DocumentRoot &quot;/Users/eric/Sites&quot;
    ServerName dev.com
    ErrorLog &quot;/usr/local/var/log/httpd/dev-error_log&quot;
    CustomLog &quot;/usr/local/var/log/httpd/dev-access_log&quot; common
</VirtualHost>

Les mises à jour par brew, exemple une màj PHP

$ brew update
$ brew upgrade php@7.2
$ brew services restart php@7.2
/usr/local/Cellar/httpd/2.4.37_1/bin/apachectl restart

Installer MariaDB

$ brew install mariadb
$ brew services start mariadb
$ mysql -uroot (exit pour sortir)
$ mysql_secure_installation
$ brew install phpmyadmin

#dans httpd.conf ajouter

Alias /phpmyadmin /usr/local/share/phpmyadmin
<Directory /usr/local/share/phpmyadmin/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    <IfModule mod_authz_core.c>
        Require all granted
    </IfModule>
    <IfModule&#8239;!mod_authz_core.c>
        Order allow,deny
        Allow from all
    </IfModule>
</Directory>

#redémarrer php et Apache
#phpmyadmin est accessible via&#8239;:
https://localhost:8443/phpmyadmin
(par exemple)

#à la demande créer une nouvelle base de données phpmyadmin
#et par l'onglet opérations y créer les paramètres de stockage

#il faut aussi renseigner une chaine pour identifier les cookies
$ sudo nano /usr/local/Cellar/phpmyadmin/4.8.4/share/phpmyadmin/config.inc.php

/**
 * This is needed for cookie based authentication to encrypt password in
 * cookie. Needs to be 32 chars long.
 */
$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

Bon, ça prend un peu de temps mais une fois que c'est fait on a ce qu'il faut pour travailler.