Pourquoi le module de précompression Nginx Gzip ne fonctionne-t-il pas?

11

J'essaie actuellement de configurer Nginx pour servir tous mes fichiers statiques. Puisqu'ils ne seront pas modifiés très fréquemment du tout, je veux que nous le module gzip_static pour me permettre de pré-gzip des copies de mes fichiers pour gagner du temps CPU et permettre une meilleure compression.

J'ai compilé Nginx avec --with-http_gzip_static_moduleet l' ai installé pour qu'il serve mes fichiers statiques, aucun problème jusqu'à présent. Je voulais tester et m'assurer que le gzipping statique fonctionnait réellement, alors j'ai fait deux fichiers, test.txtet test.txt.gz. La première ligne de chacun des fichiers indique s'ils ont été compressés, puis il y a une nouvelle ligne et 256 caractères aléatoires (différents entre les deux fichiers).

J'ai lu que l'heure de modification du fichier et son équivalent gzippé devraient être les mêmes, et j'ai essayé les deux solutions suivantes:

touch test.*
touch -r test.txt test.txt.gx

Sur ma machine locale, je teste avec curl:

curl $URL/test.txt

Cela fonctionne très bien, je récupère la version que je n'ai pas précompressée, mais quand je fais ça:

curl -H "Accept-Encoding: gzip" $URL/test.txt | gunzip

Je récupère également la version que je n'ai pas précompressée. Je mise essayé gzip offdans mon nginx.conf, mais il ne fait pas de différence. J'ai également recompilé Nginx avec --without-http_gzip_moduleet cela ne semble pas faire de différence non plus, Nginx compile toujours les choses à la volée.

Je suis assez nouveau pour Nginx, mais je suis vraiment perdu ici.

Voici la sortie de ./nginx -V

built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) 
configure arguments: --sbin-path=$SOMEPATH/nginx --prefix=$SOMEPATH --user=$ME --group=$MYGROUP --with-http_gzip_static_module --without-http_gzip_module

Et voici mon nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
error_log  logs/error.log;
pid        logs/nginx.pid;
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    gzip_static on;
    sendfile        on;
    keepalive_timeout  65;
    access_log  logs/access.log;
    server {
        listen       XXXX;
        server_name  foo.bar.com;
        location / {
            root   html;
        }
        error_page  404 404.html;
        error_page   500 502 503 504 50x.html;
    }
}

Toute aide est très appréciée!

Gordon Bailey
la source

Réponses:

8

Vous ne l'avez pas mentionné dans votre question, mais je sais de bonne foi que vous exécutez Nginx par proxy derrière un autre Nginx sur un hôte partagé. ;)

Au moment où j'écris ceci, les modules gzip de Nginx utilisent HTTP 1.1 par défaut, mais Nginx ne peut utiliser HTTP 1.0 que lorsqu'il communique avec des serveurs principaux, donc la solution est de définir gzip_http_versionvotre nginx.conf, comme ceci:

gzip_http_version 1.0;

Redémarrez votre Nginx après avoir effectué ce changement et vous devriez être en affaires.

Sean F
la source
Incroyable! Comment saviez-vous cela?
Jürgen Paul