为什么 Nginx Gzip 预压缩模块不工作?

Gor*_*ley 11 nginx gzip

我目前正在尝试设置 Nginx 来为我所有的静态文件提供服务。由于它们根本不会经常更改,因此我希望使用 gzip_static 模块来允许我对文件的副本进行预 gzip,以节省一些 cpu 时间并允许更好的压缩。

我编译了 Nginx--with-http_gzip_static_module并对其进行了设置,以便它为我的静态文件提供服务,到目前为止没有问题。我想测试并确保静态 gzip 压缩确实有效,所以我制作了两个文件,test.txt以及test.txt.gz. 每个文件的第一行说明它们是否被 gzipped,然后有一个换行符和 256 个随机字符(两个文件之间不同)。

我读过文件的修改时间和它的 gzip 对应文件应该是一样的,我已经尝试了以下两种方法:

touch test.*
touch -r test.txt test.txt.gx
Run Code Online (Sandbox Code Playgroud)

在我的本地机器上,我正在使用 curl 进行测试:

curl $URL/test.txt
Run Code Online (Sandbox Code Playgroud)

这工作正常,我取回了我没有预压缩的版本,但是当我这样做时:

curl -H "Accept-Encoding: gzip" $URL/test.txt | gunzip
Run Code Online (Sandbox Code Playgroud)

找回了我没有预压缩的版本。我尝试gzip off在 my 中进行设置nginx.conf,但没有任何区别。我还重新编译了 Nginx,--without-http_gzip_module这似乎也没有什么区别,Nginx仍然动态地对东西进行 gzip。

我对 Nginx 很陌生,但我真的很茫然。

这是输出 ./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
Run Code Online (Sandbox Code Playgroud)

这是我的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助!

Sea*_*n F 8

你没有在你的问题中提到这一点,但我有充分的理由认为你在共享主机上代理另一个 Nginx 之后运行 Nginx。;)

在我写这篇文章的时候,Nginx 的 gzip 模块默认使用 HTTP 1.1,但是 Nginx 在与后端服务器通信时只能使用 HTTP 1.0,所以解决方案是gzip_http_version在你的nginx.conf.

gzip_http_version 1.0;
Run Code Online (Sandbox Code Playgroud)

进行更改后重新启动您的 Nginx,您应该可以正常工作了。