Magento – Nginx / PHP-FPM / APC / Memcache
Voici un tutoriel complet sur l’installation d’une machine virtuelle qui fera tourner un Magento de développement. J’ai dû le faire justement pour ton travail, et je vais en profiter pour détailler ici ce qui m’a pris pas mal de temps à faire.
Mes besoins étaient :
- Magento Entreprise (ou une autre version bien évidemment)
- Pas de MySQL (on tourne avec un Percona sur une autre machine, mais j’essaierai de rajouter une installation de ce serveur au tutoriel pour ceux qui n’ont pas une machine dédiée..).
- Environnement de développement optimisé, car Magento est lourd et peut être lent …
Je suis donc parti sur un serveur Nginx avec PHP-FPM, APC, Memcache et Varnish.
Je ne rentrerai pas dans la configuration de Varnish qui est compliquée, et fera l’objet d’un autre poste.
Tout ceci a été fait sur un Mac mais je pense que ça doit fonctionner sans problème sous Windows ou Linux (étant donné que quasiment tout se passe dans une machine virtuelle). Pour ça, j’ai utilisé Puphpet qui permet de configurer une machine et de la faire tourner sous Vagrant.
INSTALLATION DE LA MACHINE VIRTUELLE
Puphpet
En premier lieu donc, il va falloir installer Vagrant et, si vous ne voulez pas payer VMware ou Parallels Desktop, VirtualBox. Pour mon cas j’ai utilisé Parallels Desktop pour des meilleurs performances, mais après à vous de voir.
Ensuite il vous faut un dossier avec Magento d’installé dedans. Je ne vais pas expliquer cette étape, je pars du principe que vous savez quand même télécharger un fichier et l’extraire 🙂
Une fois ces outils installés, il faut configurer Puphpet pour qu’il nous créé notre script Vagrant.
Voici mon fichier de configuration de Puphpet (il suffit de faire glisser le fichier sur la page web pour qu’il charge la configuration) : http://files.hollywoud.net/tuto/config.yaml
Config globale
Pour le système d’exploitation, libre à vous de choisir ce que vous voulez, mis à part CentOS qui ne semble pas avoir tous les packages nécessaires … En tout cas j’ai eu des problèmes d’installation / configuration avec ce système. Je me suis donc rabattu sur Ubuntu Trusty 14.04 (mais Debian peux parfaitement faire l’affaire aussi).
L’adresse IP de la machine sera celle à rajouter dans votre host sur votre machine physique pour accéder à votre site, et la mémoire allouée au système ne dépend que de vous aussi. Pour moi, 512mb sont largement suffisants pour faire ce que je fais.
La partie « Sharing folder » est très importante, c’est là que vous allez renseigner le dossier contenant Magento sur votre machine, et le dossier sur lequel vous voudrez le faire pointer dans la VM (par défaut /var/www).
On passe ensuite à server packages. Ici j’ai rajouté nano (éditeur de texte plus simple que vim 🙂 ), et surtout memcached.
Nous pouvons aller directement à Webservers. Ici, on n’installe pas Apache, mais Nginx, avec les paramètres par défaut. En suivant, on installe PHP (j’ai mis ici la version 5.4, mais la version 5.5 devrait fonctionner sans problème). J’ai aussi rajouté Composer, mais ce n’est pas obligatoire non plus.
Modules
Au niveau des modules, j’ai rajouté : curl, mbstring, mysql, memcache, memcached, fpm. Vous pouvez rajouter gd si vous comptez manipuler des images dans Magento. J’ai dû le faire moi-même, mais une fois la machine installée.
Et pour finir, Xdebug est le choix par défaut. Je vais d’ailleurs faire un prochain article sur ce débogueur.
Niveau Database, je n’ai rien installé car notre serveur sql possède sa machine dédiée pour nos développement. Libre à vous d’installer Mysql (ou autre) si besoin.
Work Queue et Search server ne vont pas nous servir non plus pour cette machine. Il ne reste donc plus qu’à créer le manifest : ‘Go ahead then, make it’. Vous allez vous retrouver avec un fichier à décompresser. Une fois fait, allez dans le dossier et lancez la commande vagrant up. Votre machine virtuelle va s’installer et démarrer. Ça peut prendre pas mal de temps, c’est donc le moment d’aller vous faire un café car la suite est un peu plus technique !
CONFIGURATION NGINX / PHP-FPM
Pour la configuration de Nginx, j’ai essayé de faire un système de Vhost pour quand je veux rajouter un website ou un store sur mon Magento, avec une URL differente.
Config globale
Tout d’abord on va créer une configuration par « défaut » qui va pointer sur /var/www et qui va nous permettre de tester notre machine.
cd /etc/nginx/sites-available
sudo nano default.conf
Rajoutez ensuite le code suivant dans le fichier :
# Un host doit toujours être contenu dans une section server
server {
# On écoute sur le port 80
listen 80;
# Ici le nom du host à utiliser.
# Il faudra le rajouter dans le fichier hosts de votre machine physique
# avec l'IP qu'on a renseigné dans la config de Puphpet
# (ici 192.168.11.81).
server_name dev.arobase62;
# Dossier à afficher.
root /var/www;
# Fichier index
# Vous pouvez mettre plusieurs extensions (index.html index.php)
index index.php;
# Section utilisée pour chaque fichier php
# et qui indique à Nginx d'utiliser PHP-FPM
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
}
}
Il faut maintenant créer un lien symbolique dans le dossier sites-enabled, vérifier que php-fpm tourne bien et redémarrer Nginx.
cd ../sites-enabled
ln -s /etc/nginx/sites-availabe/default.conf 00-default
ps aux | grep php-fpm
# Si nécessaire
sudo /etc/init.d/php5-fpm start
sudo /etc/init.d/nginx restart
Maintenant il faut aller dans le fichier hosts de votre machine physique et rajouter le host que l’on vient de créer :
192.168.11.81 dev.arobase62
On va créer un fichier index.php qui va nous servir de test dans /var/www
<?php phpinfo(); ?>
Naviguez ensuite sur le host que l’on vient de créer, et vous devriez tomber sur la page Phpinfo.
Vhost
Maintenant, il faut configurer notre vhost pour Magento. J’ai séparé mes fichiers de configuration pour plus de lisibilité, et comme certaines partie concernent tous les sites qui utilisent Magento, ça ne sert à rien de dupliquer. N’oubliez pas d’ajouter le nouvel host dans le fichier /etc/hosts :
192.168.11.81 dev.magento
Commençons donc par créer notre fichier principal :
cd /etc/nginx/sites-available
sudo nano dev.magento.conf
Dans lequel nous allons mettre ceci :
server {
listen 80;
server_name dev.magento;
root /var/www/Magento;
include sites-available/magento.conf;
access_log /var/log/nginx/dev.magento_access.log;
error_log /var/log/nginx/dev.magento_error.log;
}
Comme vous pouvez le voir, rien de bien nouveau. On créé notre vhost, on indique des logs pour ce vhost (pour ne pas les mélanger avec ceux de base de nginx). Mais une nouvelle ligne qui parle d’elle même, et qui inclut un autre fichier.
Voici le contenu de celui-ci :
include sites-available/magento_rewrites.conf;
include sites-available/magento_security.conf;
Il ne fait effectivement que inclure deux autres fichiers.. Pas très utile vous devez penser, mais pour la « logique » je préfère faire comme ça, plutôt que de devoir inclure ces 2 fichiers dans chaque vhost que je devrais créer.
Voici maintenant le contenu de ces deux fichier :
# magento_rewrites.conf
# Gestion des réecritures de Magento
rewrite_log on;
# On remplace une url sans le index.php, par une url avec ..
location / {
index index.php;
try_files $uri $uri/ @handler;
}
location @handler {
rewrite / /index.php;
}
location ~ \.php/ {
rewrite ^(.*\.php)/ $1 last;
}
location /media/catalog/ {
expires 1y;
log_not_found off;
access_log off;
}
location /skin/ {
expires 1y;
}
location /js/ {
access_log off;
}
location ~ \.php$ {
if (!-e $request_filename) {
rewrite / /index.php last;
}
expires off;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_connect_timeout 7200;
fastcgi_send_timeout 7200;
fastcgi_read_timeout 7200;
include fastcgi_params;
fastcgi_param MAGE_IS_DEVELOPER_MODE 1;
fastcgi_param MAGE_RUN_TYPE website;
}
Il n’y a rien de compliqué ici non plus. Toutes les options sont assez claires, et si vous avez un doute n’hésitez pas à lire la doc Nginx qui est très enrichissante !
Et maintenant le deuxième :
# magento_security.conf
# On bloque l'accès à certains dossiers
location /app/ { deny all; }
location /includes/ { deny all; }
location /lib/ { deny all; }
location /media/downloadable/ { deny all; }
location /pkginfo/ { deny all; }
location /report/config.xml { deny all; }
location /var/ { deny all; }
# On masque les fichiers .htaccess
location /\. {
return 404;
}
# Et on n'autorise que les requête GET/HEAD/POST
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}
Une fois les fichiers créés, il faut aller créer le lien dans le dossier /etc/nginx/sites-enabled :
cd /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available 10-dev.magento
Maintenant il suffit de redemarrer Nginx, de rajouter le vhost dans votre fichier host, et de naviguer sur votre page ! Si tout se passe comme prévu, vous devriez tomber sur la page d’accueil de Magento !
CONFIGURATION APC
Là rien de bien compliqué.. On installe le package php-apc (qui est un alias du bon package en fait) :
sudo apt-get install php-apc
Et ensuite on va rajouter un paramètre dans le fichier /etc/php5/fpm/conf.d/20-apcu.ini :
apc.shm_size=100
Qui correspond à la taille de chaque segment de mémoire partagée. Pour plus d’informations, je ne peux que vous conseiller de vous rendre directement ICI.
N’oubliez pas de redemarrer PHP-FPM avant de continuer.
sudo /etc/init.d/php-fpm restart
MEMCACHE
Memcache va ici nous servir à stocker les sessions, non pas dans des fichiers ou dans des bases de données, mais directement en mémoire de notre machine.
Et comme nous l’avons installé directement grâce à Puphpet, il n’y a rien à faire à part le configurer dans Magento !
Ouvrez donc votre fichier app/etc/local.xml et ajoutez ceci dans la balise <global> :
<cache>
<backend>memcached</backend>
<memcached>
<servers>
<default>
<host>127.0.0.1</host>
<port>11211</port>
<persistent>1</persistent>
</default>
</servers>
</memcached>
</cache>
<session_save>
<![CDATA[memcache]]>
</session_save>
<session_save_path>
<![CDATA[tcp://127.0.0.1:11211?persistant=1]]>
</session_save_path>
On vérifie que Memcached est bien lancé, sinon on le lance :
ps aux | grep memcache
# Et si nécessaire ..
sudo /etc/init.d/memcached start
Et voila !
Il ne reste plus qu’à tout redémarrer. Pour faire ça, j’ai fait un petit script qui se charge de tout relancer dans l’ordre. Je l’ai mis dans mon dossier /etc/init.d :
#! /bin/bash
echo '##### RESTART SERVERS #####'
echo ''
echo '## Restart Nginx'
/etc/init.d/nginx restart
echo ''
echo '## Restart PHP-FPM'
/etc/init.d/php5-fpm restart
echo ''
echo '## Flush memcache / Mage cache'
echo 'flush_all' | nc localhost 11211
rm -rf /var/www/Magento/var/cache/*
Vous pouvez maintenant naviguer sur http://dev.magento et commencer à utiliser votre framework !
N’hésitez surtout à me laisser un commentaire si vous avez la moindre question, ou juste pour me dire si ça fonctionne 🙂
A bientôt !