OVH Community, votre nouvel espace communautaire.

[TUTO] Config VPS OVH opti PrestShop : MariaDB, PHPMyAdmin, Nginx+ngx_pagespeed, PHP5


shirokoweb
15/02/2014, 10h03
ok, je n'ai pas résisté à la tentation de faire un petit test sur Google insights (l'outil de mesure de performance et de recommandations pour l'amélioration de votre site web)

Avec une installation de base de PrestaShop, don le code est une véritable usine à gaz, j'obtiens 73/100 pour la partie mobile (oui le code de la boutique d'origine est crado, il faut un site vraiment mieux optimisé mobile : bootstrap + ccs3) ainsi qu'un 95/100 pour la partie desktop !

Lien insights

Je referais des tests avec mon propre thème et un CSS un peu plus propre !

shirokoweb
14/02/2014, 15h40
Bonjour,

Voici comme promis un tutoriel pour l'installation d'un serveur optimisé pour PrestaShop.
Structure serveur : VPS OVH, Debain 7, nginx, ngx_pagespeed, MariaDB, PHPMyAdmin...

Champ d'application :
Ce tutoriel est destiné à une installation dite "fraîche" de votre VPS. Elle ne couvre pas la migration de vos configurations / installations / sauvegardes que vous pourriez éventuellement avoir. Je vous conseille vivement de faire tout backup AVANT de suivre ce tutoriel.

Responsabilité :
Bien que ce tutoriel fonctionne pour ma part, il se peut qu'il ne fonctionne pas pour vous (si vous suivez les instructions fournies à la lettre, vous ne devriez pas rencontrer de soucis). Ainsi, je dégage toute responsabilité en cas de dysfonctionnement ou de panne.

Quelques trucs sympa à connaître :
Utilisez nano au lieu de vim comme éditeur de texte, interface plus simple si vous débutez en SSH ( y'a un rappel des commandes en bas de l'interface ). Les plus courantes sont :

Editer / créer un fichier : nano
Rechercher dans un fichier : Ctrl + W
Enregistrer les modifications : Ctrl + O
Fermer le fichier : Ctrl + X

Un site qui liste les commandes fondamentales de Linux : Lien

Autre outil assez pratique quand on a du mal en SSH, c'est d'utiliser WinSCP pour l'édition ou l'ajout / téléchargement de fichiers sur votre serveur. Ca fonctionne un peu à la manière d'un client FTP tel que FileZilla, mais en SFTP (Secure File Transfer Protocole).

[ TUTO ]

I. Réinstallez votre VPS > Debian 7 wheezy > Anglais (par convention)

II. Connectez vous en SSH sur votre serveur

1. Installation des pré-requis :

- Environnement PHP

Code:
apt-get update && apt-get upgrade
apt-get -y install php5 php5-fpm php5-cli php5-curl php5-gd php5-mcrypt php5-intl php5-mysql php5-memcache unzip bzr memcached
Edition du fichier php.ini pour éviter le 0 date exploit avec Nginx :

Code:
nano /etc/php5/fpm/php.ini
Cherchez la ligne ;cgi.fix_pathinfo=1 > Décommentez la ligne > Remplacez 1 par 0

cgi.fix_pathinfo=0
Enregistrez > Fermez

- fail ban ip :

iptables devrait être pré-installé

Code:
apt-get install fail2ban
- Synchronisation et mise à jour de l'heure du serveur :

Code:
apt-get install ntpdate ntp
Editez le fichier de configuration :

Code:
nano /etc/ntp.conf
Cherchez les lignes server et remplacez par celles-ci :

server 0.fr.pool.ntp.org
server 1.fr.pool.netp.org
server 0.europe.pool.ntp.org
server ntp.genoscope.cns.fr
Enregistrez > Fermez > Redémarrez le service et vérifiez que les services sont actifs avec les commandes :
Code:
service ntp restart
ntpq -p
Vous trouverez une liste assez complète des serveurs ntp français à l'adresse suivante : Lien serveurs

- Pré-requis installation MariaDB :

Prévention des erreurs apt dépôt :
Code:
apt-get install python-software-properties
Dans notre cas nous utilisons les instructions fournies par MariaDb pour une Debian 7 > Version 5.5 > Miroir CNRS Lien
Vous pouvez choisir tout un tas d'autres options (distro, version, emplacement miroir...) si vous préférez, mais je vous conseille vivement de suivre le schéma utilisé dans ce tutoriel pour être certain qu'à la fin tout fonctionne chez vous comme chez moi.

Installation de la clef :
Code:
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
Ajout de la source et mise à jour :
Code:
add-apt-repository 'deb http://ftp.igh.cnrs.fr/pub/mariadb/repo/5.5/debian wheezy main' && apt-get update
Installation de MariaDB:
Code:
apt-get install mariadb-server mariadb-client
Saisissez le mot de passe root pour la base de donnée x 2 > OK

vérification de l’installation de MariaDB :
Code:
mysql -V
Vous devriez voir :

root@vps12345:~# mysql -V
mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
- Interface graphique de gestion de base : PHPMyAdmin

Code:
apt-get install phpmyadmin
Ne rien sélectionner comme serveur (Apache, lighttpd), faites simplement une tabulation pour sélectionner , Ensuite sélectionnez à la question d'après.

Mettez à jour :

Code:
apt-get update && apt-get upgrade
redémarrez le serveur :

Code:
reboot
La connexion au serveur s’interrompt, patientez quelques instants avant de vous reconnecter en SSH.

2. Compilation de la source nginx + pagespeed + création du dossier cache

A l'inverse d'Apache, nginx ne charge pas dynamiquement les modules, c'est pourquoi il faut les compiler avec la source de nginx.

- Pré-rquis :

Edition des sources

Code:
nano /etc/apt/sources.list
Commentez les lignes présentes en ajoutant # devant puis ajoutez les lignes suivantes :

Code:
deb http://ftp.de.debian.org/debian testing main contrib non-free
deb-src http://ftp.de.debian.org/debian testing main contrib non-free
img à insérer

Enregistrez (Ctrl + O) > Entrée puis fermez le fichier (Ctrl + W)

Mettez à jour la liste des packages et installez ceux qui nous sont nécessaires :

Code:
apt-get update && apt-get install dpkg-dev build-essential zlib1g-dev libpcre3 libpcre3-dev curl libcurl4-openssl-dev libossp-uuid-dev
- Compilation et installation de nginx avec ngx_pagespeed

Création du dossier de compilation :

Code:
mkdir /usr/src/pagespeed && cd /usr/src/pagespeed
- Téléchargez la source nginx et construisez les dépendances :

Code:
apt-get source nginx && apt-get build-dep nginx
- Vérifions la version installée an saisissant ls -1, si tout c'est bien passé vous devriez voir :



- A présent, il nous faut télécharger le module pagespeed de nginx avec ses dépendances :

Code:
cd nginx-1.4.4/debian/modules && wget https://github.com/pagespeed/ngx_pagespeed/archive/release-1.7.30.3-beta.zip && unzip release-1.7.30.3-beta.zip && cd ngx_pagespeed-release-1.7.30.3-beta/ && wget https://dl.google.com/dl/page-speed/psol/1.7.30.3.tar.gz && tar -xzvf 1.7.30.3.tar.gz
- Reste à éditer le fichier rules pour inclure notre module pagespeed à la compilation des fichiers sources de nginx:

Code:
nano /usr/src/pagespeed/nginx-1.4.4/debian/rules
- Dans ce fichier vous trouverez 4 sections : config.status.full, config.status.light, config.status.extras, config.status.naxsi
Ajoutez --add-module=$(MODULESDIR)/ngx_pagespeed-release-1.7.30.3-beta \ dans chacune de ces sections juste au dessus de $(CONFIGURE_OPTS) >$@



Enregistrez > Fermez

- Compilez les packages nginx :

Code:
cd /usr/src/pagespeed/nginx-1.4.4/ && dpkg-buildpackage -b
La compilation prend un certain temps, vous avez le temps de vous faire un café

- ok, après un bon 1/4 d'heure, voyons les packages créés :

Code:
 cd /usr/src/pagespeed && ls -1
- Si tout c'est passé comme prévu, vous devriez voir cette liste :



- A présent, installez nginx avec ngx_pagespeed compilé :

Code:
dpkg --install nginx-common_1.4.4-4_all.deb nginx_1.4.4-4_all.deb nginx-full_1.4.4-4_amd64.deb
- Si vous rencontrez un problème relatif à des dépendances manquantes, tapez la commande suivante :

Code:
apt-get -f install
- Puis relancer l'installation avec la commande :

Code:
dpkg --install nginx-common_1.4.4-4_all.deb nginx_1.4.4-4_all.deb nginx-full_1.4.4-4_amd64.deb
- Si vous avez suivi le tutoriel à la lettre, vous devriez pouvoir démarrer nginx avec la commande suivante :

Code:
/etc/init.d/nginx start
Si vous avez un message d'erreur qui vous indique le port 80 est déjà utilisé :

[....] Restarting nginx: nginxnginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Il faut que vous fassiez un kill du process :

Code:
apt-get install sudo
sudo fuser -k 80/tcp
Avant de démarrer nginx :

Code:
/etc/init.d/nginx start
Vérifions que le module ngx_pagespeed s'est bien installé en tapant la commande :

Code:
nginx -V
Vous devriez voir :



- Il nous reste à créer le dossier de cache :

Code:
mkdir /var/ngx_pagespeed_cache
- Sans oublier d'y appliquer les bons droits :

Code:
chown -R www-data:www-data /var/ngx_pagespeed_cache
- ok, à présent il nous faut activer le module pagespeed, pour cela éditez le fichier nginx.conf :

Code:
nano /etc/nginx/nginx.conf
- Ajoutez les lignes suivantes, au dessus de Gzip Settings par exemple :

Code:
##
#ngx_pagespeed module settings
##

pagespeed on;
pagespeed FileCachePath /var/ngx_pagespeed_cache;
- Profitons d'être dans le fichier de configuration de nginx pour modifier la configuration de Gzip justement :

Remplacez tout ce qui se trouve dans les paramètres Gzip Settings par :

Code:
        ##
	# Gzip Settings
	##
 
        gzip on;
	gzip_disable "msie6";
	gzip_vary on;
	gzip_types application/ecmascript;
	gzip_types application/javascript;
	gzip_types application/json;
	gzip_types application/pdf;
	gzip_types application/postscript;
	gzip_types application/x-javascript;
	gzip_types image/svg+xml;
	gzip_types text/css;
	gzip_types text/csv;
	gzip_types text/javascript;
	gzip_types text/plain;
	gzip_types text/xml;
	gzip_http_version 1.1;
####### à insérer img_tuto_6

- Avant de redémarrer nginx :

Code:
/etc/init.d/nginx reload
- Vérifions que pagespeed se charge correctement :

Code:
curl -I -p http://localhost|grep X-Page-Speed
- Vous deviez voir X-Page-Speed: 1.7.30.3-3721 :



- Connectez vous à votre VPS avec le navigateur de votre choix : http://vps12345.ovh.net/index.html et voyez la réponse du header



- SO FARE SO GOOD ! Notre serveur nginx est correctement configuré avec le module pagespeed

3. Configuration des VHOSTs

- Nous pouvons à présent configurer chaque vhost séparément, procédons à la création des dossiers web en y appliquant les bons droits :
(remplacez siteweb.fr par votre nom de domaine...)

Code:
mkdir -p /var/www/siteweb.fr/web/ /var/www/logs/siteweb.fr/
chown -R www-data:www-data /var/www/siteweb.fr/web/
- Puis nous allons créer le fichier de configuration de notre site siteweb.fr :

Code:
nano /etc/nginx/sites-available/siteweb.fr.vhost
Copiez-Collez la configuration suivante (en changeant siteweb.fr par votre domaine) :

Code:
server {
	listen *:80;
	
	server_name www.siteweb.fr siteweb.fr
	root /var/www/siteweb.fr/web;
        access_log /var/www/logs/siteweb.fr.pro.access.log;
        error_log /var/www/logs/siteweb.fr.pro.error.log;

	index index.html index.htm index.php index.cgi index.pl index.xhtml;

	# On va rendre pagespeed encore plus rapide en passant par memcached

	pagespeed MemcachedThreads 1;
	pagespeed MemcachedServers "localhost:11211";

	# Ensuite on définit les filtres pagespeed que l'on veut utiliser :

	pagespeed RewriteLevel CoreFilters;
	pagespeed EnableFilters collapse_whitespace,remove_comments;

	#  On s'assure que les requêtes vont bien vers le contenu optimiés par pagespeed et non pas vers des entêtes externes

	location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; }
	location ~ "^/ngx_pagespeed_static/" { }
	location ~ "^/ngx_pagespeed_beacon" { }
	location /ngx_pagespeed_statistics { allow 127.0.0.1; deny all; }
	location /ngx_pagespeed_global_statistics { allow 127.0.0.1; deny all; }
	location /ngx_pagespeed_message { allow 127.0.0.1; deny all; }
	location /pagespeed_console { allow 127.0.0.1; deny all; }
	
	location = /favicon.ico { log_not_found off; access_log off; }

        location = /robots.txt { allow all; log_not_found off; access_log off; }

        # Rejet tout accès à .htaccess, .htpasswd, .DS_Store (Mac).

        location ~ /\. { deny all; access_log off; log_not_found off; }

	# Règles de réécriture

        rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
        rewrite ^/([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$1$2$3.jpg last;
        rewrite ^/([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$1$2$3$4.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$1$2$3$4$5.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$1$2$3$4$5$6.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6$7.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7$8.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8$9.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9$10.jpg last;
        rewrite ^/c/([0-9]+)(\-[\.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ /img/c/$1$2$3.jpg last;
        rewrite ^/c/([a-zA-Z_-]+)(-[0-9]+)?/.+\.jpg$ /img/c/$1$2.jpg last;
        rewrite ^/images_ie/?([^/]+)\.(jpe?g|png|gif)$ /js/jquery/plugins/fancybox/images/$1.$2 last;
        try_files $uri $uri/ /index.php$is_args$args;
        error_page 404 /index.php?controller=404;
	 
    # Epirations
	
	location ~* \.(gif)$ { expires 2592000s; }
	location ~* \.(jpeg|jpg)$ { expires 2592000s; }
        location ~* \.(png)$ { expires 2592000s; }
        location ~* \.(css)$ { expires 604800s; }
        location ~* \.(js|jsonp)$ { expires 604800s; }
        location ~* \.(js)$ { expires 604800s; }
        location ~* \.(ico)$ { expires 31536000s; }

	# PHP
	
	location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
		}
	
	# phpmyadmin
	
	location /phpmyadmin {
        root /usr/share/;
        index index.php index.html index.htm;
		
	location ~ ^/phpmyadmin/(.+\.php)$ {
        try_files $uri =404;
        root /usr/share/;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
		}
		
	location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
		root /usr/share/;
	}
}
		
}
- Vous trouverez la liste de filtres les plus communément utilisés à l'adresse suivante : Lien
Pour la documentation complète, veuillez vous référer à l'adresse suivante : Lien

Enregistrez > Fermez

- Il nous reste à créer les liens symboliques entre les sites-enabled et sites-available :

Code:
 ln -s /etc/nginx/sites-available/siteweb.fr.vhost /etc/nginx/sites-enabled/
- Créez un fichier index.html pour tester notre site internet :

Code:
nano /var/www/siteweb.fr/web/index.html
Pas besoin de créer une page sexy, saisissez juste HELLO WORLD ! Enregistrez > Fermez

- Redémarrez nginx :

Code:
/etc/init.d/nginx reload
Si vous avez suivi les instructions, vous devriez voir :

[ ok ] Reloading nginx configuration: nginx.
- Accédez à votre vps en utilisant votre nom de domaine : http://www.siteweb.fr/index.html

Admirez votre super belle page avec un magistral HELLO WORLD !

- Inspectez les entêtes :

Response Headers view source
Cache-Control:max-age=0, no-cache
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Thu, 13 Feb 2014 21:59:10 GMT
ETag:"52fd2953-6"
Server:nginx/1.4.4
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Page-Speed:1.7.30.3-3721

- Vérifions les modules installés en créant un fichier phpinfo :

Code:
nano /var/www/siteweb.fr/web/info.php
Puis un simple phpinfo :

Code:
- Enregistrez > Fermez > Relancez nginx (vous devriez connaître les commandes à présent)

Connectez-vous à votre site internet via votre navigateur : http://www.siteweb.fr/info.php

- Vérifiez que vous pouvez accéder à phpmyadmin en saisissant l'URL suivante dans votre navigateur : http://siteweb.fr/phpmyadmin/

- Pour prévenir toute modification future par la mise jour via "apt" de votre installation, vous pouvez l'épingler en créant un fichier de préférences :

Code:
nano /etc/apt/preferences.d/nginx
Puis ajoutez ces lignes :

Code:
Package: nginx
Pin: release a=testing
Pin-Priority: 900
Voilà, à ce stade :

- Nous avons compilé nginx avec le module pagespeed,
- Créer les dossiers de cache pour pagespeed
- Créé et configuré notre nom de domaine avec les filtres pagespeed
- Il nous faut passer à la suite

3. Installation de PrestaShop


Très prochainement