web-dev-qa-db-fra.com

La compression Tomcat 7 GZIP ne fonctionne pas

J'ai ajouté les lignes suivantes dans le fichier conf/server.xml de Tomcat pour activer la compression gzip mais cela ne fonctionne pas. Les pages ne sont toujours pas compressées.

 <Connector port="8080"
         compression="on"
         compressionMinSize="2048"
         noCompressionUserAgents="gozilla, traviata"
         compressableMimeType="text/html,text/xml,text/plain,text/css,
         text/javascript,text/json,application/x-javascript,
         application/javascript,application/json"/>

Une idée?

29
N..

Si Tomcat est installé par Apache sur le port 80, vous devrez activer la compression dans Apache lui-même. La compression dans Tomcat ne fonctionnera que si vous y accédez directement sur le port 8080.

32
David Levesque

Sous Windows, j'ai rencontré ce comportement en essayant d'activer temporairement la compression de contenu dans mon environnement de développement pour acquérir une compréhension approximative de la charge utile totale d'une page dans mon application.

Je peux confirmer que ESET NOD32 Antivirus se comporte de la manière décrite par @bugs_ dans sa réponse à cette question et je peux également confirmer que l'exécution de Fiddler4 a le même effet. Cependant, la fermeture de Fiddler et la désactivation de l'analyse HTTP de NOD32 n'ont pas résolu le problème.Pour ce faire, j'ai dû désactiver l'utilisation de 'sendfile' dans mon connecteur comme suit:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           compression="on" compressionMinSize="8192" useSendfile="false"
           compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
           redirectPort="8443" />

L'attribut important, ici, est useSendfile="false"

J'utilise Apache Tomcat 8, sous Windows. La documentation Tomcat ( http://Tomcat.Apache.org/Tomcat-8.0-doc/config/http.html ) dit ce qui suit à propos de useSendfile:

Utilisez cet attribut pour activer ou désactiver la fonction sendfile. La valeur par défaut est true. Notez que l'utilisation de sendfile désactivera toute compression que Tomcat aurait autrement effectuée sur la réponse.

Et ceci à propos de compression:

Il existe un compromis entre l'utilisation de la compression (sauvegarde de votre bande passante) et l'utilisation de la fonction sendfile (sauvegarde de vos cycles CPU). Si le connecteur prend en charge la fonction sendfile, par ex. le connecteur NIO, l'utilisation de sendfile aura priorité sur la compression. Les symptômes seront que les fichiers statiques supérieurs à 48 Kb seront envoyés non compressés. Vous pouvez désactiver sendfile en définissant l'attribut useSendfile du connecteur, comme indiqué ci-dessous, ou modifier le seuil d'utilisation de sendfile dans le configuration du DefaultServlet dans le fichier conf/web.xml par défaut ou dans le web.xml de votre application Web.

9
Xharlie

Dans mon cas, cela n'a pas fonctionné à cause de l'antivirus (ESET, Windows)

Il a été lié quelque part avant le navigateur. Il décompresse le corps et supprime l'en-tête "Content-Encoding". La réponse du navigateur ressemblait à une réponse normale non compressée. Même à Fiddler, il était déjà décompressé.

Les réponses Https fonctionnaient, mais les resposes http ont été décompressés par ESET.

Ce n'est pas assez. Désactivez ESET. Je devais aller dans "Paramètres avancés" -> "Protection d'accès Web" -> "HTTP, HTTPS" et l'éteindre là

Si vous servez des fichiers à partir du disque dur, vous devrez peut-être ajouter l'option useSendFile = "false" dans le connecteur.

4
bugs_

Je testais des changements server.xml Similaires dans mon environnement de développement local et j'étais frustré que cela ne fonctionne pas non plus.

Mon problème était que je modifiais mon installation Tomcat locale (C:\Apache-Tomcat-8.0.5) que j'avais sélectionnée lors de l'utilisation de la boîte de dialogue Servers window -> (right-click) -> New -> Server dans Spring Tool Suite .

Cependant, lors de sa publication, le répertoire Tomcat utilisé était situé dans (dossier de l'espace de travail) \. Metadata\.plugins\org.Eclipse.wst.server.core\tmp.

Vous pouvez vérifier l'emplacement publié en cliquant avec le bouton droit sur le serveur et en choisissant "Parcourir l'emplacement de déploiement ..."

enter image description here

De là, vous pouvez mettre à jour le fichier server.xml Approprié, ou vous pouvez supprimer et rajouter le serveur.

3