Fix Composer memory limit sur Vagrant

Vous êtes sur Vagrant (Linux) ou sur un serveur web et n’arrivez pas à lancer vos commandes :

  • composer install
  • composer require
  • composer update

Et un joli message apparait :PHP Fatal error: Allowed memory size of XXXXXX bytes exhausted <...>

Alors le petit bout de code suivant est sans doute pour vous. Il s’agit de créer une partition de la RAM sur la machine virtuelle pour allouer de la mémoire supplémentaire. Cette technique est appelée “SWAP” :

Qu’est ce que le swap sur Linux ?

Swap est un espace sur un disque utilisé lorsque la quantité de mémoire RAM physique est pleine. Lorsqu'un système Linux manque de RAM, les pages inactives sont déplacées de la RAM vers l'espace de swap. L'espace d'échange peut prendre la forme d'une partition d'échange dédiée ou d'un fichier d'échange

Corriger le bug Allowed memory size de Composer

On y va ! Dans votre machine ou sur votre serveur tapez dans l’ordre ces commandes :

$ /bin/dd if=/dev/zero of=/var/swap.1 bs=4096k count=1024
Créer un fichier d’une taille de 4Mo contenant uniquement des caractères NULL et nommé « /var/swap.1»
$ chmod 600 /var/swap.1
On assigne les droits du dossier « /var/swap.1» à 600 pour qu’il ne soit pas visible
$ /sbin/mkswap /var/swap.1
Formater cette zone à l’aide de la commande mkswap
$ /sbin/swapon /var/swap.1
Activer la zone de swap à l’aide de la commande swapon
$ COMPOSER_MEMORY_LIMIT=-1 composer require librairie/yours
COMPOSER_MEMORY_LIMIT=-1 est optionnel, ensuite vous n’avez plus qu’à composer !

Apache2 et VirtualHosts pour multi-site

Aujourd’hui nous allons voir comment installer et configurer proprement plusieurs VirtualHosts pour du multi-site sur un environnement dédié en utilisant Apache 2.

Connaître l’architecture du site

Pour une installation optimale “best-practice”, il est conseillé de créer vos sites dans le dossier /var/www, en nommant chaque site avec leur nom de domaine respectifs.

1. Architecture multi-site recommandée :

Pour les nouveaux sites édités sur frameworks comme Symfony ou Laravel, on retrouve bien souvent la structure suivante :

/var/www
--/monsite1.fr
----/dossiers-moteur-du-site
----/public_html
--/monsite2.fr
----/dossiers-moteur-du-site
----/public_html

Tout d’abord, chaque site comprend un ou plusieurs dossiers moteur. Ces dossiers sont utilisés pour le fonctionnement du site en lui-même : Controllers, Modèles, Vues (MVC), etc… Et ne sont pas / ne doivent pas être visibles en public.

Ensuite, on retrouve généralement un dossier public_html (ou équivalent) dans lequel on va plutôt retrouver cette fois-ci les assets Javascript, CSS ainsi que les images et médias. Ce dossier est publiquement visible puisque l’ont souhaite bien souvent faire des liens vers ces ressources :

Exemple : monsite1.fr/img/mon-image.png

Cependant tous les sites ne sont pas construits via des frameworks MVC, et il existe aussi d’autres sites “faits maison” plus ou moins anciens, et ayants leur propres structures.

2. Architecture multi-site simple

Ici, dans des sites simples plus classiques, on va bien souvent retrouver une structure plus minimaliste composée uniquement d’un dossier racine et de plusieurs dossiers / fichiers mis “en vrac” :

/var/www
--/monsite1.fr
----/dossiers-moteur-fichiers-et-assets-du-site
--/monsite2.fr
----/dossiers-moteur-fichiers-et-assets-du-site

D’un point de vue sécurité, ce n’est pas la solution que je recommande puisque tous vos fichiers sont accessibles en public. Il faudra jouer sur les .htaccess, VirtualHosts et robots.txt pour interdire l’accès à certains dossiers sensibles et éviter l’exploration / indexation de toutes vos ressources.

Néanmoins cette architecture a l’avantage d’être plus simple et plus rapide si vous devez migrer des sites ayants déjà cette structure, ou si votre site n’a pas de fonctionnalités à risques. Par exemple les sites ayant un contenu “vitrine” comme les one-page, ou sites possédant quelques pages statiques en HTML.

3. Architecture multi-site atypique et plus ancienne

Enfin un dernier cas de multi-site plus atypique qui possède un site web principal et en son sein, des sous-dossiers contenant l’ensemble des sites enfants :

/var/www
--/siteprincipal.com
----/dossiers-fichiers-et-assets-du-site
----/dossiers-moteur-du-site
----/monsite1.fr
------/dossiers-fichiers-et-assets-du-site
----/monsite2.fr
------/dossiers-fichiers-et-assets-du-site