jeremm

Jérémy MURIEL ( jeremy [at] jeremm [dot] fr )

Jan 192013
 

Varnish ne supporte pas le https, si vous voulez quand même l’utiliser il faut mettre un autre reverse-proxy devant qui supporte le https.
On peut utiliser pound.
– Installation :

apt-get install pound

– Activation :

sed -i 's/startup=0/startup=1/' /etc/default/pound

– Configuration /etc/pound/pound.cfg :

## see pound(8) for details
 
User            "www-data"
Group           "www-data"
 
LogLevel        0
 
Alive           30
TimeOut 120
ConnTO 5
Grace 120
 
Control "/var/run/pound/poundctl.socket"
 
## listen, redirect and ... to:
ListenHTTPS
        Address 0.0.0.0
        Port    443
        Cert    "/etc/ssl/blog.jeremm.fr.pem"
        xHTTP           0
        AddHeader "X-Forwarded-Proto: https"
        Service
                BackEnd 
                        Address 127.0.0.1
                        Port    80
                End
                Session
                        Type IP
                        TTL 60
                End
        End
End

– Le fichier pem doit contenir dans l’ordre : la clé privée, le certificat, le certificat de l’autorité de certification.
– Au niveau du backend, il faut mettre l’ip et le port où se trouve le varnish.
– Définissez plusieurs blocs Backend pour load-balancer les requêtes sur 2 varnishs.

Au niveau du varnish, ajoutez dans le vcl_recv :

if (!req.http.x-forwarded-proto) {

et

}

autour du bloc qui ajoute le X-Forwarded-For car il est déjà ajouté par pound.

Ajoutez ensuite dans le vcl_hash :

if (req.http.x-forwarded-proto) {
        hash_data(req.http.x-forwarded-proto);
}

Ensuite au niveau du code il faut que les liens et appels à d’autres objets (images,css,js,…) se fassent en https.
Souvent les codes php le font déjà en détectant le protocole grâce à

$_SERVER['HTTPS'] ou $_SERVER['SERVER_PORT']

Il faut utiliser le

$_SERVER['HTTP_X_FORWARDED_PROTO'])

Ou ajouter sur le vhost apache2 :

SetEnvIf X-Forwarded-Proto https HTTPS on

P.S. (20/01/2013) : La version 2.5 de pound fournie par les dépôts squeeze semble avoir une fuite mémoire. Préférez la version 2.6 qu’il faudra compiler http://www.apsis.ch/pound/Pound-2.6.tgz

Jan 132013
 

Si vos sites ne sont pas parcourus régulièrement, les pages ne seront plus dans votre cache varnish, vous pourriez augmenter le ttl de vos pages mais si vous mettez à jour régulièrement vos sites cela peut être embêtant.
La solution, créer un cron qui parcours votre site avec ce script :

#!/bin/bash
 
Sitemap='www.exemple.com/sitemap.xml'
Site='www.exemple.com'
wget='/usr/bin/wget'
grep='/bin/grep'
awk='/usr/bin/awk'
find='/usr/bin/find'
mount='/bin/mount'
umount='/bin/umount'
sed='/bin/sed'
wc='/usr/bin/wc'
cut='/usr/bin/cut'
 
if [ `$mount -l | $grep /tmp/wget | $wc -l` -gt 0 ] ; then exit 1 ; fi
 
touch /tmp/cookies.txt
$wget -q -O /dev/null "URL pour régénérer le sitemap"
 
if [ ! -d /tmp/wget ] ; then
   mkdir /tmp/wget
fi
 
$mount -t tmpfs -o size=25M tmpfs /tmp/wget
cd /tmp/wget
 
for site in $Sitemap ; do
   for url in `$wget -q -O - "http://$site" | $grep '<loc>'  | $awk -F'<loc>' '{print $2}' | $awk -F'</loc>' '{print $1}'` ; do
      $wget -q -p --save-cookies /tmp/cookies.txt --load-cookies /tmp/cookies.txt "$url"
      for index in `$find . -type f | $sed 's:^./::' | $grep index.html` ; do
            for href in `$grep href "$index" | $cut -d"'" -f2 | $cut -d'"' -f2 | $grep http | $grep "$Site"` ; do
                  $wget -q -p --save-cookies /tmp/cookies.txt --load-cookies /tmp/cookies.txt --header='Accept-Encoding: gzip, deflate' "$href"
                  $wget -q -p --header='Accept-Encoding: gzip, deflate' "$href"
            done
      done
      for file in `$find . -type f | $sed 's:^./::' | $grep -v index.html` ; do
          $wget -q -O /dev/null  --save-cookies /tmp/cookies.txt --load-cookies /tmp/cookies.txt --header='Accept-Encoding: gzip, deflate' "http://$file"
          $wget -q -O /dev/null  --header='Accept-Encoding: gzip, deflate' "http://$file"
      done
      for file in `$find . -type f | $sed 's:^./::' | $grep index.html | $sed 's:index.html::'` ; do
          $wget -q -O /dev/null  --save-cookies /tmp/cookies.txt --load-cookies /tmp/cookies.txt --header='Accept-Encoding: gzip, deflate' "http://$file"
          $wget -q -O /dev/null  --header='Accept-Encoding: gzip, deflate' "http://$file"
      done
      rm -rf /tmp/wget/*
   done
done
rm /tmp/cookies.txt
cd /tmp/ ; $umount /tmp/wget ; rm -rf /tmp/wget

Maj 13/01/12 : Ajout href

Déc 142012
 

Ajoutez dans le vcl_recv :

if (req.url ~ "/cdx10b.js\?rnd\=" || req.url ~ "/cdx10b-100KB.js\?rnd\=" ) {
        set req.url = regsuball(req.url, "cdx10b\.js\?rnd=[0-9a-zA-Z\-]+", "cdx10b.js");
        set req.url = regsuball(req.url, "cdx10b\-100KB\.js\?rnd=[0-9a-zA-Z\-]+", "cdx10b-100KB.js");
}

Ajoutez le « unset req.http.cookie; » si il n’est pas enlever dans une règle générique à tous les JS

Maj 14/12/12 : Regex

Oct 042012
 

Voici un script d’init pour linux, pour limiter la bande passante utilisée sur une interface réseau et avec une IP.
tc se trouve dans le paquet debian iproute.

#!/bin/bash
### BEGIN INIT INFO
# Provides:          tc
# Required-Start:    $syslog $network $remote_fs
# Required-Stop:     $syslog $network $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Bandwidth Shaping
# Description:       Bandwidth Shaping
### END INIT INFO
#  tc uses the following units when passed as a parameter.
#  kbps: Kilobytes per second 
#  mbps: Megabytes per second
#  kbit: Kilobits per second
#  mbit: Megabits per second
#  bps: Bytes per second 
#       Amounts of data can be specified in:
#       kb or k: Kilobytes
#       mb or m: Megabytes
#       mbit: Megabits
#       kbit: Kilobits
#
 
#
# Name of the traffic control command.
TC=/sbin/tc
 
# The network interface we're planning on limiting bandwidth.
IF=eth0             # Interface
 
# Download limit (in mega bits)
DNLD=10mbit          # DOWNLOAD Limit
 
# Upload limit (in mega bits)
UPLD=10mbit          # UPLOAD Limit
 
# Burst limit
BURST=2mbit
 
# IP address of the machine we are controlling
IP=10.0.1.1     # Host IP
 
# Filter options for limiting the intended interface.
U32="$TC filter add dev $IF protocol ip parent 1:0 prio 1 u32"
 
start() {
    $TC qdisc add dev $IF root handle 1: htb default 30
    $TC class add dev $IF parent 1: classid 1:1 htb rate $DNLD burst $BURST cburst $BURST
    $TC class add dev $IF parent 1: classid 1:2 htb rate $UPLD burst $BURST cburst $BURST
    $U32 match ip dst $IP/32 flowid 1:1
    $U32 match ip src $IP/32 flowid 1:2
}
 
stop() {
    $TC qdisc del dev $IF root
}
 
restart() {
    stop
    sleep 1
    start
}
 
show() {
    $TC -s qdisc ls dev $IF
    echo ""
    $TC -s class show dev $IF
}
 
showfilter() {
    $TC -s filter show dev $IF
}
 
case "$1" in
 
  start)
    echo -n "Starting bandwidth shaping: "
    start
    echo "done"
    ;;
 
  stop)
    echo -n "Stopping bandwidth shaping: "
    stop
    echo "done"
    ;;
 
  restart)
    echo -n "Restarting bandwidth shaping: "
    restart
    echo "done"
    ;;
 
  show)
    echo "Bandwidth shaping status for $IF:"
    show
    echo ""
    ;;
 
  showfilter)
    echo "Filter shaping status for $IF:"
    showfilter
    echo ""
    ;;
 
  *)
    pwd=$(pwd)
    echo "Usage: ./tc {start|stop|restart|show|showfilter}"
    ;;
 
esac
 
exit 0
Sep 302012
 

Création de l’Expires à partir du cache-control max-age si il est présent et différent de 0, puis suppression du max-age.

Ajoutez au début de la configuration :

C{
        #include <string.h>
        #include <stdlib.h>
 
        void TIM_format(double t, char *p);
        double TIM_real(void);
}C

Et dans le vcl_deliver :

if ( resp.http.Cache-Control ~ "max-age" && ! resp.http.Cache-Control ~ "max-age=0" ) {
        C{
                 char *cache = VRT_GetHdr(sp, HDR_RESP, "\016cache-control:");
                 char date[40];
                 int max_age = -1;
                 int want_equals = 0;
                 if(cache) {
                         while(*cache != '\0') {
                                 if (want_equals && *cache == '=') {
                                         cache++;
                                         max_age = strtoul(cache, 0, 0);
                                         break;
                                  }
                                  if (*cache == 'm' && !memcmp(cache, "max-age", 7)) {
                                         cache += 7;
                                         want_equals = 1;
                                         continue;
                                  }
                         cache++;
                         }
                         if (max_age != -1) {
                                 TIM_format(TIM_real() + max_age, date);
                                 VRT_SetHdr(sp, HDR_RESP, "\010Expires:", date, vrt_magic_string_end);
                         }
                 }
        }C
        set resp.http.Cache-Control = regsuball(resp.http.Cache-Control,"max-age=[0-9]+(,)?", "");
        if ( resp.http.Cache-Control ~ "^$") {
                 unset resp.http.Cache-Control;
        }
}

Source : https://www.varnish-cache.org/trac/wiki/VCLExampleSetExpires