Aperçu de Varnish : un proxy-reverse cache

Voici une page pour donner un aperçu de Varnish.
Varnish est un reverse proxy qui permet à travers de son cache d’accélérer l’affichage des sites WEB.
Je l’ai installé depuis une semaine sur le site, ce dernier m’a permit de gagner environ 9 points sur Google PageSpeed.

Il est donc en front, si l’élément est caché, Varnish le retourne, sinon la requête est envoyé à Apache (ceci permet aussi d’alléger Apache).

Plus globalement sur l’optimisation Apache/PHP, vous pouvez vous consulter à ce lien : http://forum.malekal.com/optimisation-apache-php-mysql-t48741.html

Exemple des possibilités de Varnish

Varnish fonctionne avec des scripts (fichier .vcl)
Vous trouverez un aperçu de la syntaxe dans la documentation suivante : https://www.varnish-cache.org/docs/3.0/reference/vcl.html

Varnish permet par exemple de créer des conditions sur les urls, referer, User-Agent, Client IP, le backend (c’est à dire le serveur final – en effet Varnish permet de faire de load balancing) etc

Il est par exemple possible de filtrer les referer via des regex, exemple, si l’on souhaite filtrer des referer de 8 lettres/chiffres aléatoires- dans la section vcl_recv, vous devez ajouter le code suivante :

if (req.http.referer ~ "(?i)^[a-z0-9]{8}$") {
error 403 "forbidden";
}

(?i) permet de ne pas rendre le test case sensitive.

En testant, on obtient bien un forbidden lorsque l’on a un referer de 8 caractères.
Varnish_exemple

Varnish fournit quelques programmes afin de monitorer.

VarnishstatVarnishstat2varnishtop_ips varnishtop_urlsvarnishtop_urls

 

Des plugins sont aussi disposnibles : https://www.varnish-cache.org/utilities

Enfin il existe un plugin sur Munin pour générer des graphiques.

 varnish_backend_traffic-pinpoint=1382064010,1382172010varnish_objects-pinpoint=1382064010,1382172010varnish_request_rate-pinpoint=1382064010,1382172010varnish_expunge-pinpoint=1382064010,1382172010varnish_memory_usage-pinpoint=1382064010,1382172010

 

Dans mon cas, j’ai mis le cache dans un tmpfs afin d’accélérer.

Voici un exemple du fichier /etc/default/varnish

# Main configuration file. You probably want to change it :)
VARNISH_VCL_CONF=/etc/varnish/default.vcl
#
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
VARNISH_LISTEN_ADDRESS=94.23.44.69
VARNISH_LISTEN_PORT=80
#
# # Telnet admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=94.23.44.69
VARNISH_ADMIN_LISTEN_PORT=6082
#
# # The minimum number of worker threads to start
VARNISH_MIN_THREADS=100
#
# # The Maximum number of worker threads to start
VARNISH_MAX_THREADS=4000
#
# # Idle timeout for worker threads
VARNISH_THREAD_TIMEOUT=120
#
# # Cache file location
VARNISH_STORAGE_FILE=/var/lib/varnish/$INSTANCE/varnish_storage.bin
#
# # Cache file size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
VARNISH_STORAGE_SIZE=8G

#
# # File containing administration secret
VARNISH_SECRET_FILE=/etc/varnish/secret
#
# # Backend storage specification
VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
#
# # Default TTL used when the backend does not specify one
VARNISH_TTL=120

VARNISH_THREAD_POOLS=7
VARNISH_SESSION_LINGER=100
VARNISH_SESSION_WORKSPACE=16384
VARNISH_THREAD_DELAY=2

DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
-p send_timeout=1800 \
-f ${VARNISH_VCL_CONF} \
-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
-w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS} \
-s ${VARNISH_STORAGE} \
-p thread_pool_add_delay=${VARNISH_THREAD_DELAY} -p thread_pools=${VARNISH_THREAD_POOLS} \
-p session_linger=${VARNISH_SESSION_LINGER} -p sess_workspace=${VARNISH_SESSION_WORKSPACE}"

Les problèmes lors de la mise en place de Varnish

Je suis partie des scripts de la page suivante : http://blog.inforeseau.com/2011/05/configurer-varnish-cache-avec-virtualhosts-fedora-redhat-centos
Notez la partie de modification des Logs Apache afin de récupérer l’IP FORWARD des clients, sinon ce sera celle du serveur Varnish qui sera récupérée par Apache.

Voici quelques un des problèmes rencontrés lors de la mise en place de Varnish.

Le téléchargement du CD Live Malekal ne se faisait pas en entier.
Il faut ajouter l’option-p send_timeout=1800 dans le fichier /etc/default/varnish (voir plus haut).

De même, les analyses sur pjjoint.malekal.com n’arrivait pas au bout, le traitement timeouté avant.
Vous pouvez dans le fichier .vlc de Varnish au niveau du backend, ajoutez les options suivantes :

.connect_timeout = 600s;
.first_byte_timeout = 600s;
.between_bytes_timeout = 600s;

Enfin au niveau de phpBB et WordPress, les IPs récupérées dans les commentaires et messages sont celles du serveur Varnish, toujours du au fait, qu’on utilise un proxy en front.
Notamment sur phpBB, cela fait que les statistiques pour les utilisateurs anonymes n’étaient plus bonnes vu que tout le monde avait la même IP.
Le problème étant que phpBB et WordPress utilisent les variables $_SERVER[‘REMOTE_ADDR’] pour récupérer l’IP du client.

Pour phpBB, vous pouvez modifier le fichier includes/session.php et remplacer ($_SERVER[‘REMOTE_ADDR par HTTP_X_FORWARDED_FOR

269 // it's pretty clear that in the majority of cases you'll at least be left with a proxy/cache ip.
270 // $this->ip = (!empty($_SERVER['REMOTE_ADDR'])) ? htmlspecialchars((string) $_SERVER['REMOTE_ADDR']) : '';
271 $this->ip = (!empty($_SERVER['HTTP_X_FORWARDED_FOR'] )) ? htmlspecialchars((string) $_SERVER['HTTP_X_FORWARDED_FOR'] ) : '';
272 $this->ip = preg_replace('#[ ]{2,}#', ' ', str_replace(array(',', ' '), ' ', $this->ip));

De même sur WordPress, vous pouvez modifier le fichier wp-includes/comment.php comme suit :

324 $comment['user_ip'] = $_SERVER['HTTP_X_FORWARDED_FOR'];

Dans mon cas, j’utilise le plugin Akismet comme antispams, afin que la bonne IP des clients soient envoyées, vous pouvez modifier le fichier wp-content/plugins/akismet/akismet.php comme suit :

1387 $commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '',$_SERVER['HTTP_X_FORWARDED_FOR'] );

 

Varnish et Attaque DoS

Il semblerait que Varnish soit moins sensible aux attaques DoS type Slowloris qu’Apache.
Par exemple, j’ai balancé des requetes GET  depuis un Kimsufi et aucun blocage à noter sur les sites.

EDIT – se reporter à ce post pour un exemple d’attaque de type SlowLoris : http://forum.malekal.com/dos-attaque-type-slowloris-t50729.html

Varnish_HTTP_Flood Varnish_HTTP_Flood2 Varnish_HTTP_Flood3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Comment lire d'autres tutoriels de malekal.com ?

Si le site vous a aidé, svp, débloquez les bloqueurs de publicités, n'hésitez pas non plus à partager l'article ou le site sur les réseaux sociaux.

Pour pouvoir lire plus d'articles et tutoriels, utilisez le menu en haut du site. Plein d'articles et tutos utiles vous attendent !

Besoin d'aide ?

Posez votre question ou soumettez votre problème sur le forum malekal.com pour obtenir une aide efficace : Aller sur le forum malekal.com
(Visited 106 times, 1 visits today)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *