7) Serveur dédié : installer APC comme système de cache

Nos tutoriels complets pour vous aider
Répondre
chatonhub
    unknown unknown

7) Serveur dédié : installer APC comme système de cache

Message par chatonhub »

7) Serveur dédié : installer APC comme système de cache et configurer Varnish comme reverse-proxy pour Apache pour améliorer les performances

Allez, on continue d’optimiser notre serveur : aujourd’hui, je vous montre comment améliorer nettement les performances du serveur.

Nous allons d’abord installer un système de cache – j’ai choisi APC – qui va soulager un peu le système en mettant en cache les pages du site les plus demandées. Cela aura un impact sur le temps de traitement des pages (moins de traitement PHP) et sur la base de données (moins de requêtes SQL).

Dans un second temps, nous installons Varnish comme reverse-proxy pour Apache : tous les objets statiques (images, CSS, JS) seront traités par Varnish, le reste (PHP) sera traité par Apache. Cela divise sensiblement la charge serveur.



Installation d’APC

APC est un système de cache que je trouve très performant. On l’installe avec :

Code : Tout sélectionner

pecl install apc
puis on crée le fichier de configuration :

Code : Tout sélectionner

nano /etc/php5/conf.d/apc.ini
et on y ajoute :

Code : Tout sélectionner

extension=apc.so
apc.enabled=1
apc.shm_size=128M
apc.stat=0
apc.ttl=7200
apc.user_ttl=7200
apc.enable_cli=1
apc.max_file_size=10M
apc.rfc1867 = On
Si vous avez une erreur de compilation lors de l’installation d’APC, c’est sûrement que le paquet libpcre3-dev n’est pas installé. Dans ce cas :

Code : Tout sélectionner

apt-get install libpcre3-dev
Il ne reste plus qu’à relancer Apache :

Code : Tout sélectionner

/etc/init.d/apache2 restart
A noter qu’APC est livré avec un script PHP (nommé apc.php) qui vous permet de voir quelques statistiques sur la mise en cache de vos fichiers. Petit exemple de ce que cela donne :


Image

Image

Pour installer apc.php, il faut le copier le fichier à la racine de notre site :

Code : Tout sélectionner

cp /usr/share/doc/php-apc/apc.php /home/skyminds/public_html/
puis l’éditer :

Code : Tout sélectionner

nano /home/skyminds/public_html/apc.php

pour y modifier le mot de passe :

Code : Tout sélectionner

defaults('ADMIN_USERNAME','apc');              // Admin Username
defaults('ADMIN_PASSWORD','password');     // Admin Password - CHANGE THIS TO ENABLE!!!
Voilà, APC est installé et actif.



Installation de Varnish


Passons maintenant à l’installation du serveur Varnish :

Code : Tout sélectionner

wget http://repo.varnish-cache.org/debian/GPG-key.txt

Code : Tout sélectionner

apt-key add GPG-key.txt 

Code : Tout sélectionner

echo "deb http://repo.varnish-cache.org/debian/ lenny varnish-2.1" >> /etc/apt/sources.list

Code : Tout sélectionner

apt-get update

Code : Tout sélectionner

apt-get install varnish
Principe de fonctionnement : Varnish va écouter sur le port 80. C’est lui qui va traiter toutes les requêtes : il va transmettre à Apache (sur le port 8080) tout ce qui est dynamique (PHP etc) et s’occupera lui-même des fichiers statiques (images, javascripts etc).


Image


Cela va donc alléger notre serveur Apache et nous allons pouvoir mettre en cache tous les éléments statiques.
On configure le serveur Varnish en éditant le fichier de configuration :

Code : Tout sélectionner

nano /etc/default/varnish
Dans ce fichier, naviguez jusqu’à l’alternative #2 et changez le port 6081 en 80 (première ligne) :

Code : Tout sélectionner

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"
Le fichier varnish_storage.bin sera limité à 1 Go, sachant que ma Kimsufi possède 2 Go de RAM. Comme Varnish tourne maintenant sur le port 80, il faut maintenant forcer Apache à écouter sur le port 8080. On édite donc :

Code : Tout sélectionner

nano /etc/apache2/ports.conf
et on change toutes les références à 80 en 8080 :

Code : Tout sélectionner

NameVirtualHost *:8080
Listen 8080
Passons maintenant à la configuration de notre site dans Varnish et éditons /etc/varnish/default.vcl :

Code : Tout sélectionner

nano /etc/varnish/default.vcl
on y met :

Code : Tout sélectionner

/* ------------------------------------------------------------ */
/*        VCL Configuration by Matt - http://www.skyminds.net          */
/* ------------------------------------------------------------ */
 
# Redirect requests to Apache
backend www {
   .host = "127.0.0.1";
   .port = "8080";
   .connect_timeout = 600s;
   .first_byte_timeout = 600s;
   .between_bytes_timeout = 600s;
}
 
# Called after a document has been successfully retrieved from the backend.
sub vcl_fetch {
        # set minimum timeouts to auto-discard stored objects
        set beresp.grace = 5m;
        if (beresp.ttl < 8h)
        {
                set beresp.ttl = 8h;
        }
       if (req.url ~ "\.(png|gif|jpg|swf|css|js)$")
        {
                unset beresp.http.set-cookie;
        }
      
       ## Deliver the content
       return(deliver);
}
 
sub vcl_recv {
 
        # Serve objects up to 5 minutes past their expiry if the backend is slow to respond.
        set req.grace = 5m;
 
        # Compatiblity with Apache log
        remove req.http.X-Forwarded-For;
        set req.http.X-Forwarded-For = client.ip;
 
        if (req.http.host ~ "^(www\.)?skyminds\.net$")
        {
                set req.backend = www;
        }
 
        ### always cache these images & static assets & Remove cookies and query string for real static files
        if (req.url ~ "^/[^?]+\.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|rar|lzma|bz2|tgz|tbz|html|htm)(\?.*|)$")
        {
                unset req.http.cookie;
                set req.url = regsub(req.url, "\?.*$", "");
        }
 
        # Normalize Content-Encoding
        if (req.http.Accept-Encoding)
        {
                if (req.url ~ "\.(jpg|png|gif|gz|rar|tgz|bz2|lzma|tbz|mp3|ogg)(\?.*|)$")
                {
                        remove req.http.Accept-Encoding;
                }
                elsif (req.http.Accept-Encoding ~ "gzip")
                {
                        set req.http.Accept-Encoding = "gzip";
                }
                elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent !~ "MSIE")
                {
                        set req.http.Accept-Encoding = "deflate";
                }
                else
                {
                        remove req.http.Accept-Encoding;
                }
        }
 
        ### never cache POST requests
        if (req.request == "POST")
        {
          set req.backend = www;
          return(pass);
        }
 
        return(lookup);
}
et on ouvre les ports dans iptables :

Code : Tout sélectionner

iptables -A OUTPUT -p tcp --dport 8080 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 6082 -s 127.0.0.1 -j ACCEPT
on redémarre pour appliquer les changements :

Code : Tout sélectionner

/etc/init.d/varnish restart
/etc/init.d/apache2 restart
Modification du Virtual Host


Il faut mettre à jour notre virtual host :

Code : Tout sélectionner

nano /etc/apache2/sites-available/www.skyminds.net
Le fichier commence par cette ligne :

Code : Tout sélectionner

<VirtualHost *:80>
On la remplace par :

Code : Tout sélectionner

<VirtualHost *:8080>
# ajout des logs

Code : Tout sélectionner

CustomLog /var/log/apache2/www-access.log varnishcombined
ErrorLog /var/log/apache2/www-error.log
Ensuite, on édite /etc/apache2/apache2.conf :

Code : Tout sélectionner

nano /etc/apache2/apache2.conf
et on y ajoute, en bas du fichier, au niveau des logs :

Code : Tout sélectionner

# VARNISH
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" varnishcombined
# Access log for VirtualHosts that don't define their own logfile
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined
et on recharge Apache pour tout prendre en compte :

Code : Tout sélectionner

/etc/init.d/apache2 reload
Voilà, vos fichiers statiques sont mis en cache et servis par Varnish. Les fichiers dynamiques sont servis par Apache et mis en cache avec APC.[/size][/align][/color]



Le Partage Est Une Force !!!
Répondre