web-dev-qa-db-fra.com

activer la compression gzip avec nginx

J'essaie d'activer la compression gzip pour les composants de mon site Web. J'ai le serveur ubuntu 11.04 et nginx 1.2.
dans ma configuration nginx du site, j'ai ceci

 gzip on; 
 # gzip_min_length 1000; 
 gzip_http_version 1.1; 
 gzip_vary on; 
 gzip_comp_level 6; 
 gzip_proxied any; 
 .____.] gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/rss + xml application/atom + xml application/rdf + xml; 
 # c'était gzip_buffers 16 8k; 
 gzip_buffers 128 4k; # ma taille de page est de 4 
 gzip_disable "MSIE [1-6] \. (?!. * SV1)"; 

et les mesures de vitesse Yslow et google me conseillent d'utiliser gzip pour réduire la transmission sur le réseau. maintenant quand j'essaie de curl -I my_js_file j'ai eu

 curl -I http://www.albawaba.com/sites/default/files/js/js_367664096ca6baf65052749f685cac7b.jsregistré .____. 0 
 Date: dim. 14 avr 2013 13:15:43 GMT 
 Type de contenu: application/x-javascript 
 Longueur du contenu: 208463 
 Connexion: garder en vie 
 Dernière mise à jour: dim, 14 avr 2013 10:58:06 GMT 
 Varier: Accept-Encoding 
 Expire: jeu. 31 déc. 2037 23:55:55 GMT 
 Cache-Control: max-age = 315360000 
 Pragma: public 
 Cache-Control: public 
 Accept-Ranges: octets 

une idée de ce que j'ai fait de mal ou que dois-je faire pour obtenir du contenu compressé?

30
Alaa

Je viens de changer gzip_http_version 1.1; être gzip_http_version 1.0; puis ça a marché

11
Alaa

Comme d'autres l'ont écrit, il ne suffit pas d'activer la compression gzip sur votre serveur - le client doit également le demander dans ses requêtes via le Accept-Encoding: gzip en-tête (ou un sur-ensemble de celui-ci). Les navigateurs modernes incluent automatiquement cet en-tête, mais pour curl, vous devrez inclure l'un des éléments suivants dans votre commande:

  • -H "Accept-Encoding: gzip": Vous devriez voir le Content-Encoding: gzip en-tête dans la réponse (il peut être nécessaire de générer des en-têtes avec les boucles -v flag), ainsi qu'une sortie apparemment tronquée pour le contenu, le flux gzip réel.
  • --compressed: Vous devriez toujours voir Content-Encoding: gzip dans les en-têtes de réponse, mais curl sait décompresser le contenu avant de le sortir.
23
lot

Je ne trouve rien de mal à votre configuration, généralement gzip sur & gzip_types application/x-javascript serait suffisant pour vous permettre de continuer. Si tout fonctionne correctement, vous obtiendrez un "Content-Encoding: gzip".

VEUILLEZ GARDER À L'ESPRIT: J'ai beaucoup plus de cohérence avec GOOGLE DEVELOPER TOOLS (curl ne se comporte tout simplement pas comme le ferait un navigateur).

Dans Chrome, faites un clic droit et allez dans "inspecter l'élément" puis allez dans "réseau" (puis rechargez la page si vous le devez), puis cliquez sur une ressource et vérifiez l'onglet d'en-tête, la sortie devrait ressembler à ceci (remarquez le contenu -encodage est gzip, yay):

Request URL:https://ssl.gstatic.com/gb/js/sem_a3becc1f55aef317b63a03a400446790.js
Request Method:GET
Status Code:200 OK (from cache)
Response Headersview source
age:199067
cache-control:public, max-age=691200
content-encoding:gzip
content-length:19132
content-type:text/javascript
date:Fri, 12 Apr 2013 06:32:58 GMT
expires:Sat, 20 Apr 2013 06:32:58 GMT
last-modified:Sat, 23 Mar 2013 01:48:21 GMT
server:sffe
status:200 OK
vary:Accept-Encoding
version:HTTP/1.1
x-content-type-options:nosniff
x-xss-protection:1; mode=block

Quoi qu'il en soit, si vous êtes sûr que votre contenu n'est pas compressé, je suis normalement opérationnel assez rapidement avec les éléments suivants:

## Compression
gzip              on;
gzip_buffers      16 8k;
gzip_comp_level   4;
gzip_http_version 1.0;
gzip_min_length   1280;
gzip_types        text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon image/bmp;
gzip_vary         on;

Vous pouvez essayer ceci en remplacement de votre code et/ou ajuster vos valeurs une à la fois pour vous aider à localiser votre problème.

N'oubliez pas de redémarrer ou de recharger nginx après avoir changé la configuration.

Il peut également être utile de vérifier vos journaux et de voir s'il y a quelque chose d'intéressant si vous êtes toujours coincé.

13
Drew Khoury

J'ai dû activer gzip dans mon /etc/nginx/nginx.conf configuration:

gzip on;
gzip_disable "msie6";

gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

Veuillez noter que j'ai dû ajouter application/javascript au standard gzip_types configuration.

7
czerasz

Vous devez exécuter:

curl -I --compressed my_js_file

pour que curl envoie un en-tête Accept-Encoding pour gzip - le serveur ne compressera le contenu que si le client envoie un en-tête disant qu'il l'acceptera.

NB vous pouvez écrire:

gzip_disable "msi6"

plutôt que d'utiliser une expression régulière pour désactiver dans IE 5.5 et 6, et vous n'avez pas besoin de spécifier text/html comme type car il est toujours compressé tant que gzip est activé.

5
junichiro

Je fais juste une supposition ici, mais je pense que vous devrez peut-être augmenter la taille de votre tampon gzip.

Voici les fichiers que le navigateur extrait du domaine. Le nombre à droite est la taille du téléchargement du fichier.

Files served from domain

Vous ne pourrez peut-être pas le dire à partir de la capture d'écran, mais tous les fichiers de contenu texte SONT compressés, à l'exception du fichier js que vous mentionnez dans votre question. Dans la capture d'écran, le fichier js est le fichier en vert, avec une taille d'environ 200K. Cette taille de fichier est supérieure à celle que vous avez spécifiée pour vos tampons gzip (128 Ko).

Les documentation du module Gzip ne donnent pas vraiment une bonne indication de l'utilisation des tampons gzip (si les tampons sont utilisés pour des données non compressées ou compressées). Cependant, le message suivant semble indiquer que la taille du tampon doit être supérieure à la taille du fichier non compressé: Fichiers volumineux avec NGINX, GZip et SSL

5
chue x

Voici ma configuration nginx et cela fonctionne.

gzip                on;
gzip_min_length     1000;
gzip_buffers        4 8k;
gzip_http_version   1.0;
gzip_disable        "msie6";
gzip_types          text/plain text/css application/json application/javascript application/x-javasc    ript text/xml application/xml application/xml+rss text/javascript;
gzip_vary           on;

Je pense que les points clés sont gzip_disable, gzip_disable et gzip_types.

3
Haimei

Tout comme Alaa, j'ai dû ajouter gzip_http_version 1.0; (aucune version n'a été spécifiée précédemment) pour que cela fonctionne (j'ai essayé sur Firefox 27.0.0).

1
user276648

J'ai rencontré le même problème que Alaa, et le problème est causé par un logiciel antivirus, actuellement installé sur mon ordinateur.

Les serveurs proxy et les logiciels antivirus peuvent désactiver la compression lorsque les fichiers sont téléchargés sur un ordinateur client. Donc, si vous exécutez un site Web dans un navigateur sur une machine cliente qui utilise un tel logiciel antivirus, ou qui se trouve derrière un serveur proxy intermédiaire (de nombreux proxy sont transparents, et vous ne connaissez peut-être même pas un proxy intervenant entre votre client et serveur Web), ils peuvent être à l'origine de ce problème.

La désactivation de l'antivirus a résolu mon problème avec les navigateurs et vous n'avez même pas besoin de définir gzip_http_version sur 1.0.

J'espère que cela vous aidera.

1
mgsxman