Aujourd’hui le moteur de recherche Google veut faire de la vitesse de chargement d’un site web un critère de ranking dans les SERPs.
Ce n’est pas idiot, et de toute façon, sans même parler de moteur de recherche, il est important d’avoir un site web qui va vite.
Dans le domaine du e-commerce par exemple, il ne faut pas que la vitesse de chargement dépasse 4 secondes.(les puriste disent 2), mais on va dire 3 (coupons la poire en deux) c’est ok.
Le problème est quand le site de e-commerce devient grand, quand il y a beaucoup de gens qui visitent le site (forcément vous avez un site qui marche sinon), et de même il n’y a pas que des humains qui vous rendent visite il y a aussi les spiders !
Entre Google bot qui passe toutes les minutes ou toutes les 10 secondes, les bots de majesticSEO ou de Ahrefs, archive.org etc, votre Apache hé bien il est surchargé.
Vous aurez beau optimiser les facteurs suivants : compression GZIP, mise en place d’un cache, utilisation de serveur de médias, de CDN, de minification des scripts, de mise en place de javascript à la fin, ces solution ont une limite à la fin, cela ne suffira pas.
Contenu
La solution ultime c’est NGINX !
C’est quoi Nginx? c’est un serveur web comme Apache, écrit par un Russe, il est plutôt peu gourmand en ressource, et il est rapide pour servir des fichiers statique. Statique? vous dites Cache? hé bien c’est pas loin !
Le secret ici est de servir tout ce qui est statique par NGINX et ce qui est dynamique par Apache.
Nginx est dans ce cas ce qu’on appelle un reverse proxy, ou serveur frontal. Définition sur cette page.
Donc avec Nginx on peut faire ces 5 choses :
- servir du contenu statique
- intermédiaire de sécurité
- terminal SSL
- répartition de charge (load balancing)
- compression de site
Nous allons donc dans les lignes qui suivent, installer Nginx sur un serveur dédié qui tourne déjà avec le serveur web Apache, ils seront donc sur la même machine.
Installation de Nginx en ligne de commande (Linux Debian)
Là je suppose que vous avez des connaissance en shell, c’est très simple, il faut installer Nginx avec la commande suivante :
$ apt-get install nginx
il faut que vous vous loggiez en root pour faire marcher cette commande.
Une fois que Nginx est installé, il y a déjà un fichier de configuration example. Sauvegardez ce fichier sur votre ordinateur pour le réutiliser si besoin, mais on n’aura pas besoin, cependant renommez ce fichier au nom de votre site web. J’utilise Winscp pour manipuler de manière sécurisée les fichiers depuis mon ordinateur en effet le faire en ligne de commande est assez fastidieux.
Configuration d’un fichier serveur Nginx
Le fichier de configuration de site web de Nginx doit être installé dans le répertoire (pour les Debian) , comme pour Apache 2, dans sites-available et sites-enabled.
« Available » veut disponible et « enable » veut dire activé. En fait si vous avez un fichier dans « enabled », ça veut dire que le site est en ligne.
Le fichier dans sites-enabled est un lien symbolique vers le fichier de configuration du répertoire site-available.
Nginx en ce qui concerne les webmasters a deux fonctions bien distinctes, soit vous l’utilisez pour remplacer Apache (ce dernier est donc à virer) soit vous l’utiliser comme reverse proxy (thème de cet article), donc il fonctionnera parallèlement à Apache !
Notion fondamentale : Si Nginx et Apache fonctionnement en même temps, pour éviter tout conflit, Apache qui écoute habituellement sur le port 80 doit changer de port, on le mettre sur le port 8080, et Nginx sur le port 80, ce qui suppose une modification du fichier de configuration d’Apache comme on le verra plus tard dans cet article.
Imaginons que je veuille proxier phpninja.fr
server { listen 80; ## listen for ipv4 server_name phpninja.fr www.phpninja.fr; access_log /var/log/nginx/localhost.access.log; location / { root /home/phpninja.fr/public_html/; index index.php index.html index.htm; try_files $uri $uri/ /index.php; } # proxy the PHP scripts to Apache listening on 127.0.0.1:8080 # location ~ \.php$ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://88.191.158.109:8080; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } } Listen 80 : on dit à nginx d'écouter sur le port 80
Server name : on donne les sites à proxier
Un fichier de log est spécifié, utile quand vous voulez débugger.
Dans Location /, vous lui dites où se trouve la racine du site web, le fichier index, et try files sert à dire à Nginx de proxier toutes les requêtes, si Nginx ne peut pas, alors il va passer le requête à Apache.
Location ~ \.php$ est trè_s important, il dit qu’il faut passer les fichier php à Apache. Comme dit plus haut Nginx ne vient pas avec le support de php, donc il est logique que ce soit Apache qui le fasse.
Proxy pass indique l’adresse IP du serveur auquel les requêtes sont passée (adresse IP de votre virtual host Apache).
Enfin location ~ /\.ht sert à éviter tout conflit dans l’interprétation du fichier type htaccess, ht_password etc dans le cas ou Nginx et Apache en ont.
Modification de la partie Apache
Il faut maintenant qu’Apache écoute sur le port 8080, c’est la seule modification que vous aurez à faire. Dans le cas de Debian, il faut modifier le fichier ports.conf comme suit:
Listen 88.191.158.109:8080 Listen 443
Il faut aussi modifier NameVirtualHost
NameVirtualHost 88.191.158.109:8080
Faire la manip sur tous les fichiers Vhost même si vous ne voulez pas les proxier. Dans tous les cas il faut le faire car Apache doit écouter sur 8080 au lieu de 80, sinon le démarrage de Nginx sera problématique.
ensuite il faut installer le module rpaf.
Il sert à envoyer à Apache l’IP du navigateur et non celui de Nginx, sinon vous perdrez cette information.
RPAFenable On RPAFsethostname On RPAFproxy_ips 213.246.45.34
spécifier l’adresse publique du proxy.
Conclusion
Redémarrer Apache et Nginx avec les commandes :
service apache2 restart service nginx restart
Si tout se passe bien, vous allez voir une accélération de votre site ! Et encore on n’a pas encore fait les optimisations de Nginx !
Pour vous amuser, vous pouvez mettre un fichier info.php avec l’instruction phpinfo().
Dans la page qui s’affichera, vous verrez la signature de Apache.
Par contre si vous avez Firebug, ou Httpfox, vous verrez la réponse du serveur le nom Nginx.