Outils personnels

Apache - PHP : optimisation affichage et caches : Différence entre versions

De wikiGite

(Mod_deflate)
 
(8 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 7 : Ligne 7 :
 
  yum install --enablerepo=remi php-pecl-apc
 
  yum install --enablerepo=remi php-pecl-apc
 
Comme pour Debian, le paquet s'occupe du paramétrage d'Apache/PHP (/etc/php.d/apc.ini)
 
Comme pour Debian, le paquet s'occupe du paramétrage d'Apache/PHP (/etc/php.d/apc.ini)
 +
 +
Si des erreurs "Segmentation fault" apparaissent dans l'error log d'apache, on peut tenter de downgrader APC :
 +
yum info --showduplicates --enablerepo=remi php-pecl-apc # pour voir toutes les versions
 +
yum downgrade --enablerepo=remi php-pecl-apc-3.1.14-1.el6.remi.1.x86_64
 +
 +
APC fournit un script PHP pour étudier son fonctionnement. Dans le répertoire web d'un virtualhost, copier
 +
cp /usr/share/doc/php-pecl-apc-3.1.15/apc.php /repertoire_du_vhost/web
 +
et naviguer sur http/vhost/apc.php
  
 
= Gestionnaire de cache Eaccelerator =
 
= Gestionnaire de cache Eaccelerator =
Ligne 13 : Ligne 21 :
  
 
= Varnish =
 
= Varnish =
 
+
[[Varnish cache]]
'''TODO'''
 
  
 
= Mod_deflate =
 
= Mod_deflate =
Ligne 24 : Ligne 31 :
  
 
Puis éditer (ou créer) un fichier /etc/httpd/conf.d/mod_deflate.conf (sur CentOS/BlueOnyx) ou /etc/apache2/mods-available/deflate.conf (sur Debian) :
 
Puis éditer (ou créer) un fichier /etc/httpd/conf.d/mod_deflate.conf (sur CentOS/BlueOnyx) ou /etc/apache2/mods-available/deflate.conf (sur Debian) :
  # SetOutputFilter DEFLATE
+
  <IfModule mod_deflate.c>
 +
          SetOutputFilter DEFLATE
 +
          # these are known to be safe with MSIE 6
 +
          AddOutputFilterByType DEFLATE text/html text/plain text/xml
 +
          # everything else may cause problems with MSIE 6
 +
          AddOutputFilterByType DEFLATE text/css
 +
          AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript
 +
          AddOutputFilterByType DEFLATE application/rss+xml
 +
</IfModule>
 +
Ci-dessous une version plus poussée des directives. ATTENTION, certains paramètres sont à optimiser selon la configuration et l'utilisation des sites, et à tester car ils peuvent occasionner un comportement non attendu d'Apache/PHP !
 +
SetOutputFilter DEFLATE
 
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/x-js  text/css application/x-javascript
 
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/x-js  text/css application/x-javascript
 
  DeflateCompressionLevel 8
 
  DeflateCompressionLevel 8
Ligne 35 : Ligne 52 :
 
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
 
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
 
  Header append Vary User-Agent env=!dont-vary
 
  Header append Vary User-Agent env=!dont-vary
Tous ces paramètres à optimiser selon la configuration et l'utilisation des sites.
+
Note : le "SetOutputFilter DEFLATE" est souvent oublié mais s'avère nécessaire sur certaines versions d'Apache. Le mettre par défaut ne fait pas de mal.
  
 
= Mod_expires =
 
= Mod_expires =
Ligne 43 : Ligne 60 :
 
  LoadModule expires_module modules/mod_expires.so
 
  LoadModule expires_module modules/mod_expires.so
 
  LoadModule expires_module modules/mod_expires.so
 
  LoadModule expires_module modules/mod_expires.so
 +
 +
Désactiver les "Etag", qui ne font pas bon ménage avec les "Expires". Ajouter un fichier "disable_etag.conf" dans le répertoire de configuration d'Apache :
 +
Header unset ETag
 +
FileETag None
  
 
Puis, dans le répertoire racine, créer (ou ajouter à) un fichier .htaccess :
 
Puis, dans le répertoire racine, créer (ou ajouter à) un fichier .htaccess :
Ligne 66 : Ligne 87 :
  
 
'''Note''' pour Apache : la directive AddType ci-dessus n'est autorisée dans les .htaccess que si FileInfo est ajouté à AllowOverrride. Penser à l'autoriser dans la configuration du serveur.
 
'''Note''' pour Apache : la directive AddType ci-dessus n'est autorisée dans les .htaccess que si FileInfo est ajouté à AllowOverrride. Penser à l'autoriser dans la configuration du serveur.
 +
 +
= Debug =
 +
== Mod_deflate ==
 +
La compression est visible avec un bon YSlow (https://addons.mozilla.org/fr/firefox/addon/yslow/) par exemple dans Firefox, onglet Réseau/HTML. On doit voir :
 +
Accept-Encoding gzip, deflate
 +
 +
== Mod_expires ==
 +
On peut vérifier que tout ça fonctionne directement en ligne de commande, sur le serveur :
 +
curl -X GET -I http://test.domain.com/
 +
  HTTP/1.0 200 OK
 +
  Date: Wed, 06 Mar 2013 17:39:35 GMT
 +
  Server: Apache
 +
  X-Powered-By: PHP/5.3.3
 +
  Set-Cookie: symfony=i9s1aqp16o519htdstkpf9kbv6; path=/
 +
  '''Expires: '''
 +
  Cache-Control:
 +
  Pragma:
 +
  Etag: "2703dc43fe2c97b940c058b0dc5a3855"
 +
  Vary: Accept-Encoding,User-Agent
 +
  Connection: close
 +
  '''Content-Type: text/html; charset=utf-8'''
 +
Ici, pas d'expiration pour la page d'accueil en text/html. Si on a activé les "Expires" uniquement pour les images, on peut tester spécifiquement cette partie :
 +
curl -X GET -I http://test.domain.com/images/logo.gif
 +
  HTTP/1.1 200 OK
 +
  Date: Wed, 06 Mar 2013 17:38:24 GMT
 +
  Server: Apache
 +
  Last-Modified: Tue, 26 Jun 2012 09:25:00 GMT
 +
  Accept-Ranges: bytes
 +
  Content-Length: 12931
 +
  Cache-Control: max-age=86400
 +
  '''Expires: Thu, 07 Mar 2013 17:38:24 GMT'''
 +
  Connection: close
 +
  '''Content-Type: image/gif'''
 +
La première ligne étant le code retour, si on a un
 +
HTTP/1.1 500 Internal Server Error
 +
on sait qu'il faut chercher l'erreur...

Version actuelle datée du 13 octobre 2014 à 15:25

Gestionnaire de cache APC

Sur Debian :

apt-get install php-apc

Le paquet fait les déclarations nécessaire dans Apache/PHP (/etc/php5/apache2/conf.d/apc.ini) et recharge Apache.

Sur CentOS / BlueOnyx : activer les dépôt de Remi, puis :

yum install --enablerepo=remi php-pecl-apc

Comme pour Debian, le paquet s'occupe du paramétrage d'Apache/PHP (/etc/php.d/apc.ini)

Si des erreurs "Segmentation fault" apparaissent dans l'error log d'apache, on peut tenter de downgrader APC :

yum info --showduplicates --enablerepo=remi php-pecl-apc # pour voir toutes les versions
yum downgrade --enablerepo=remi php-pecl-apc-3.1.14-1.el6.remi.1.x86_64

APC fournit un script PHP pour étudier son fonctionnement. Dans le répertoire web d'un virtualhost, copier

cp /usr/share/doc/php-pecl-apc-3.1.15/apc.php /repertoire_du_vhost/web

et naviguer sur http/vhost/apc.php

Gestionnaire de cache Eaccelerator

TODO

Varnish

Varnish cache

Mod_deflate

Le module Apache mod_deflate permet de compresser à la volée les pages avant de les envoyer. La plupart des navigateurs récents savent interpréter et décompresser les pages. On l'active par

LoadModule deflate_module modules/mod_deflate.so
LoadModule deflate_module modules/mod_deflate.so

dans le httpd.conf de CentOS ou les mods-enabled de Debian.

Puis éditer (ou créer) un fichier /etc/httpd/conf.d/mod_deflate.conf (sur CentOS/BlueOnyx) ou /etc/apache2/mods-available/deflate.conf (sur Debian) :

<IfModule mod_deflate.c>
          SetOutputFilter DEFLATE
          # these are known to be safe with MSIE 6
          AddOutputFilterByType DEFLATE text/html text/plain text/xml
          # everything else may cause problems with MSIE 6
          AddOutputFilterByType DEFLATE text/css
          AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript
          AddOutputFilterByType DEFLATE application/rss+xml
</IfModule>

Ci-dessous une version plus poussée des directives. ATTENTION, certains paramètres sont à optimiser selon la configuration et l'utilisation des sites, et à tester car ils peuvent occasionner un comportement non attendu d'Apache/PHP !

SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/x-js  text/css application/x-javascript
DeflateCompressionLevel 8
DeflateMemLevel 8
DeflateWindowSize 14
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|exe|t?gz|zip|bz2?|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent env=!dont-vary

Note : le "SetOutputFilter DEFLATE" est souvent oublié mais s'avère nécessaire sur certaines versions d'Apache. Le mettre par défaut ne fait pas de mal.

Mod_expires

Il est intéressant aussi de modifier le temps d'expiration des images dans le cache. C'est géré côté serveur par le module mod_expires, qui indique aux navigateurs clients pendant combien de temps il doivent réutiliser une image mise localement en cache, plutôt que de la recharger à chaque fois (notamment : l'image de fond, affichée sur chaque page !).

Charger le module

LoadModule expires_module modules/mod_expires.so
LoadModule expires_module modules/mod_expires.so

Désactiver les "Etag", qui ne font pas bon ménage avec les "Expires". Ajouter un fichier "disable_etag.conf" dans le répertoire de configuration d'Apache :

Header unset ETag
FileETag None

Puis, dans le répertoire racine, créer (ou ajouter à) un fichier .htaccess :

<IfModule mod_expires.c>
 ExpiresActive On
 ExpiresDefault "access plus 7200 seconds"
 ExpiresByType image/jpg "access plus 1500000 seconds"
 ExpiresByType image/jpeg "access plus 1500000 seconds"
 ExpiresByType image/png "access plus 1500000 seconds"
 ExpiresByType image/gif "access plus 1500000 seconds"
 AddType image/x-icon .ico
 ExpiresByType image/ico "access plus 1500000 seconds"
 ExpiresByType image/icon "access plus 1500000 seconds"
 ExpiresByType image/x-icon "access plus 1500000 seconds"
 ExpiresByType text/css "access plus 1500000 seconds"
 ExpiresByType text/javascript "access plus 1500000 seconds"
 ExpiresByType text/html "access plus 7200 seconds"
 ExpiresByType application/xhtml+xml "access plus 7200 seconds"
 ExpiresByType application/javascript "access plus 7200 seconds"
 ExpiresByType application/x-javascript "access plus 1500000 seconds"
 ExpiresByType application/x-shockwave-flash "access plus 1500000 seconds"
</IfModule>

Note pour Apache : la directive AddType ci-dessus n'est autorisée dans les .htaccess que si FileInfo est ajouté à AllowOverrride. Penser à l'autoriser dans la configuration du serveur.

Debug

Mod_deflate

La compression est visible avec un bon YSlow (https://addons.mozilla.org/fr/firefox/addon/yslow/) par exemple dans Firefox, onglet Réseau/HTML. On doit voir :

Accept-Encoding	gzip, deflate

Mod_expires

On peut vérifier que tout ça fonctionne directement en ligne de commande, sur le serveur :

curl -X GET -I http://test.domain.com/
  HTTP/1.0 200 OK
  Date: Wed, 06 Mar 2013 17:39:35 GMT
  Server: Apache
  X-Powered-By: PHP/5.3.3
  Set-Cookie: symfony=i9s1aqp16o519htdstkpf9kbv6; path=/
  Expires: 
  Cache-Control: 
  Pragma: 
  Etag: "2703dc43fe2c97b940c058b0dc5a3855"
  Vary: Accept-Encoding,User-Agent
  Connection: close
  Content-Type: text/html; charset=utf-8

Ici, pas d'expiration pour la page d'accueil en text/html. Si on a activé les "Expires" uniquement pour les images, on peut tester spécifiquement cette partie :

curl -X GET -I http://test.domain.com/images/logo.gif
  HTTP/1.1 200 OK
  Date: Wed, 06 Mar 2013 17:38:24 GMT
  Server: Apache
  Last-Modified: Tue, 26 Jun 2012 09:25:00 GMT
  Accept-Ranges: bytes
  Content-Length: 12931
  Cache-Control: max-age=86400
  Expires: Thu, 07 Mar 2013 17:38:24 GMT
  Connection: close
  Content-Type: image/gif

La première ligne étant le code retour, si on a un

HTTP/1.1 500 Internal Server Error

on sait qu'il faut chercher l'erreur...