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
Code : Tout sélectionner
nano /etc/php5/conf.d/apc.ini
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
Code : Tout sélectionner
apt-get install libpcre3-dev
Code : Tout sélectionner
/etc/init.d/apache2 restart


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/
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!!!
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

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
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"
Code : Tout sélectionner
nano /etc/apache2/ports.conf
Code : Tout sélectionner
NameVirtualHost *:8080
Listen 8080
Code : Tout sélectionner
nano /etc/varnish/default.vcl
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);
}
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
Code : Tout sélectionner
/etc/init.d/varnish restart
/etc/init.d/apache2 restart
Il faut mettre à jour notre virtual host :
Code : Tout sélectionner
nano /etc/apache2/sites-available/www.skyminds.net
Code : Tout sélectionner
<VirtualHost *:80>
Code : Tout sélectionner
<VirtualHost *:8080>
Code : Tout sélectionner
CustomLog /var/log/apache2/www-access.log varnishcombined
ErrorLog /var/log/apache2/www-error.log
Code : Tout sélectionner
nano /etc/apache2/apache2.conf
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
Code : Tout sélectionner
/etc/init.d/apache2 reload
Le Partage Est Une Force !!!