8791 sujets

Développement web côté serveur, CMS

Bonjour à tou(te)s,

Mon hébergeur utilise l'application Varnish, qui maintient les pages web dans le cache du serveur et les rafraîchit toutes les 10 mn. C'est super pour du html, mais c'est trop peu pour du css, des images…

Afin de désactiver Varnish (sur les images par ex.), le wiki de mon hébergeur propose de mettre ça dans le .htaccess :

<IfModule mod_headers.c>
    <IfModule mod_expires.c>
    <FilesMatch "\.(png|jpg)$">
        Header set Cache-Control: "no-cache"
    </FilesMatch>
    </IfModule>
</IfModule>


Ça marche, et je me suis donc dit que je pourrais rafraichir les images chaque mois seulement avec ce code (max-age est en secondes) :

<IfModule mod_headers.c>
    <IfModule mod_expires.c>
    <FilesMatch "\.(png|jpg)$">
        Header set Cache-Control: "max-age=2592000"
    </FilesMatch>
    </IfModule>
</IfModule>


Or, là ça ne passe plus : Varnish reprend la main…

Merci d'avance pour toute inforamtion ou solution !
Bonsoir Muchos,

Je ne comprends trop ce que tu essayes de faire.

Avec le max-age=2592000 varnish va mettre ton fichier dans son cache pendant 30 jours… n’est-ce pas ce que tu essayes d’obtenir ?
Modifié par Jules-F (23 Apr 2012 - 22:07)
C'est exactement le but ! Le problème, c'est que je n'ai pas réussi à le faire fonctionner.

Je vais donc réessayer… Je me rends compte que j'avais délaissé les règles ExpiresByType. Si je mets ça, vous pensez que ça peut le faire ?


<IfModule mod_headers.c>
    <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresByType image/jpg "access plus 30 days"
        ExpiresByType image/png "access plus 30 days"
    <FilesMatch "\.(png|jpg)$">
        Header set Cache-Control: "max-age=2592000, public"
    </FilesMatch>
    </IfModule>
</IfModule>
Je ne pense pas que cela gènera d’avoir l’entête Expires en plus.

En revanche, il y a un problème avec le
Header set Cache-Control: "max-age=2592000, public"


Les deux points après le nom de l’entête sont de trop, la ligne devrait être :
Header set Cache-Control "max-age=2592000, public"


C’est peut-être la raison qui empêche le fonctionnement recherché.

De plus, personnellement, je n’imbriquerais pas les if, il vaudrait mieux les séparer afin de profiter de la configuration d'au moins un module apache si les deux ne sont pas installés (question de portabilité).


<IfModule mod_headers.c>
    <FilesMatch "\.(png|jpg)$">
        Header set Cache-Control: "max-age=2592000, public"
    </FilesMatch>
</IfModule>
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 30 days"
    ExpiresByType image/png "access plus 30 days"
</IfModule>


Bon courage
Modifié par Jules-F (24 Apr 2012 - 10:44)
Ça ne fonctionne toujours pas, malgré ce p*tain de double point qui traînait :

# Expire headers
<IfModule mod_headers.c>
	<IfModule mod_expires.c>
	    <FilesMatch "\.(css|js|png|jpg)$">
    	    Header set Cache-Control "max-age=2592000, public"
	    </FilesMatch>
	</IfModule>
</IfModule>

(PS: j'ai aussi essayé avec les modules headers et expires séparés, comme la version Jules-F<).

Varnish prend le dessus. Pour l'instant, seule sa désactivation fonctionne, comme ceci :

# Expire headers
<IfModule mod_headers.c>
	<IfModule mod_expires.c>
	    <FilesMatch "\.(css|js|png|jpg)$">
    	    Header set Cache-Control "no-cache"
	    </FilesMatch>
	</IfModule>
</IfModule>

Modifié par Muchos (25 Apr 2012 - 18:48)
Comment fais-tu pour savoir que varnish reprend la main et sa durée de mise en cache ?

Qu’il reprenne la main, c’est normal : c’est sa raison d’être.

Qu’il ne tienne pas compte de la durée que tu définis… ça je l’explique moins car normalement il se doit d’honorer ce genre de chose.

Peut-être que l’hébergeur force certains paramètres et dans ce cas il te sera difficile de passer outre mais ça me parait étrange quand même.
Je fais des appels sur mon site avec le terminal (le processus utilisé sert à charger les en-têtes http). Ici, j'appelle mon css, et ça donne ça :

# w3m -dump_head  http://www.tilde3.eu/css-site.css
 

HTTP/1.1 200 OK
Last-Modified: Sat, 21 Apr 2012 23:26:30 GMT
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
FranceServ-Hebergement: It took D=7398 microseconds for Apache to serve this request.
Content-Type: text/css
Server: Nginx/Varnish/HAProxy/Apache Servers
[b]X-Cacheable: Il n'y a pas de 'no-cache', on HIT la prochaine fois ![/b]
[b]cache-control: max-age=600[/b]
Content-Length: 1900
Accept-Ranges: bytes
Date: Thu, 26 Apr 2012 13:27:23 GMT
X-Varnish: 1631789328 1631788834
Via: 1.1 varnish
Connection: close
age: 0
[b]X-Cache: HIT[/b]
Donc tu utilises la bonne méthode pour récupérer ces informations.

Premièrement : dans les entêtes, cache-control est écrit tout en minuscules… ça me semble un peu étrange et cela me laisse penser que c’est peut-être un paramétrage qui est forcé dans la configuration de varnish (même si je trouve cela très étrange).

Un test à faire serait de d’utiliser la même syntaxe (minuscules) dans ton .htaccess pour voir si cela change quelque chose :
Header set cache-control "max-age=2592000, public"


Deuxièmement : l'entête Last-Modified est également envoyé… cela signifie que le navigateur va se baser dessus pour ses futures demandes et que si ton fichier n’a pas été modifié le serveur va quand même envoyer une réponse 304 Not Modified (Varnish va sans doute rafraichir son cache mais le contenu du document ne sera pas envoyé, ce sera juste les entêtes).

Un autre test à faire serait de zapper ce header dans ton .htaccess histoire de voir ça bascule sur le fonctionnement du Cache-Control.
Header unset Last-Modified


Enfin, la troisième est dernière solution que je vois c’est de zapper l'entête Last-Modified et d’utiliser uniquement l’entête Expires… mais j’ai quand même un doute car le cache-control de Vanish va être prioritaire sur le Expires.


… si rien ne marche, je vois pas d’autre solution que contacter l’hébergeur pour avoir plus d’informations sur la configuration en place.
Modifié par Jules-F (26 Apr 2012 - 17:20)
Désactiver le Last-Modified a bien un effet sur les appels d'en-tête.

# Expire headers
<IfModule mod_headers.c>

  <IfModule mod_expires.c>

    <FilesMatch "\.(css|js|png|jpg)$">

      Header set cache-control "max-age=2592000, public" # Pas de différence a priori avec Cache-Control
      Header unset Last-Modified

    </FilesMatch>

  </IfModule>

</IfModule>

Je vais donc contacter mon admin web pour en savoir plus.

@Jules-F: Merci beaucoup pour ton aide.

Je laisse le sujet ouvert en cas d'autres propositions et surtout de mes retours Smiley smile