Table of Contents

Reverse Proxy Cache avec lighttpd et mod_cache

lighttpd http apache

L'idée est de mettre en front end du serveur web un reverse proxy qui va servir les statiques et renvoyer tout le reste au serveur web. Ce reverse proxy se fait donc passer pour le serveur web, écoute sur le port 80, répond si il peut et faire suivre derrière lui le reste.

Dans ma configuration, le reverse proxy, c'est lighttpd 1.5.0 avec le patch mod_cache 1.6.1, et le serveur web c'est un apache2 des familles.

Installer lighttpd

Bien que sous debian, il va falloir compiler lighttpd soit même. Debian fournit une distribution mais cette dernière n'inclut pas mod_cache. Le mieux est d'aller faire un tour directement sur le site de lighttpd.

Sur ma machine (debian lenny), il m'a manqué quelques packages : libpcre3-dev libzip-dev zlib1g-dev libbz2-dev

Avec tout cela, un petit trio classique et ca roule tout seul :

$ ./configure
$ make
# make install

Il faut également créer les répertoires de conf, de cache et de log et donner les droits à l'utilisateur qui va exécuter tout cela

# mkdir /etc/lighttpd
# touch /etc/lighttpd/lighttpd.conf
# chown www-data /etc/lighttpd -R
# mkdir /var/log/lighttpd
# chown www-data /var/log/lighttpd -R
# mkdir /data/www/cache
# chown www-data /data/www/cache -R

Configurer lighttpd

La configuration va naturellement se trouver dans /etc/lighttpd/lighttpd.conf

## Let lighttpd act as a proxy server for special file types, hosts etc
##                                                                     
## Documentation: /usr/share/doc/lighttpd-doc/proxy.txt                
##                http://www.lighttpd.net/documentation/proxy.html     
server.port = 80                                                       
server.document-root = "/dev/null"                                     
server.errorlog = "/var/log/lighttpd/error.log"                        
server.accesslog = "/var/log/lighttpd/access.log"                      
server.username = "www-data"                                           
server.groupname = "www-data"                                          
server.tag = "Reverse Proxy Lighttpd de gdfa"                          
server.modules   += ( "mod_proxy_core", "mod_proxy_backend_http", "mod_status", "mod_cache","mod_rewrite" )                                                     
 
### CACHE ###
cache.support-queries = "enable" #ignore '?' in url   
cache.refresh-pattern = (                                                       
        "/$" => "5 update-on-refresh no-expire-header", # update homepage every 5 minutes and on refresh requests without setting expire headers                
        "\.(?i)(flv)$" => "0 fetchall-for-range-request flv-streaming", # to work with mod_flv_streaming for flv files                                          
        "\.(?i)(js|css|xml)$" => "240", # update js/css/xml every 4 hours and on refresh requests                                                               
        "\.(?i)(htm|html|shtml)$" => "30", # update html/htm/shtml every 30 minutes and on refresh requests                                                     
        "\.(?i)(jpg|bmp|jpeg|gif|png)$" => "2880", # update graphics files every 2 days                                                                         
        "\.(?i)(rar|zip|wmv|avi|mp3|ape|rm|mpeg|mpg|wma|asf|rmvb|flv)$" => "0 fetchall-for-range-request", # cache media file forever                           
        ".(?i)php$" => "5", # update php request every 5 minutes                
        "." => "30 update-on-refresh" # default to update every 30 minutes and on refresh requests                                                              
)                                                                               
 
cache.bases = ("/data/cache") # write cached files in /data/cache directory     
 
#cache.enable = "enable"
$HTTP["host"] == "www.site1.com" {
        proxy-core.backends = ("127.0.0.1:8080")  
        proxy-core.balancer = "static"
        proxy-core.allow-x-sendfile = "enable"
        proxy-core.protocol = "http"
}
 
$HTTP["host"] == "www.site2.org" {
        proxy-core.backends = ("127.0.0.1:8081")
        proxy-core.balancer = "static"
        proxy-core.allow-x-sendfile = "enable"
        proxy-core.protocol = "http"
}
 
proxy-core.worked-with-modcache = "enable" # que le mod_cache marchent avec mod_proxy

C'est pas très compliqué. On active les modules nécessaires, on redirige le trafic en utilisant le header Host des requetes HTTP vers les serveurs web qui vont écouter sur les ports 8080 et 8081 puis on configure le mode cache pour qu'il réponde à la place du serveur web quand il a la réponse.

La dernière ligne relie le mode cache au mode proxy.

Configurer Apache

Niveau apache, ya presque rien à faire ! Il suffit de modifier la directive Listen pour écouter sur les 8080 et 8081 plutôt que le 80, et modifier les virtual hosts si vous en avez.

Une fois que tout ce joli monde écoute, la config d'apache est terminée.

~~DISCUSSION~~