【问题标题】:How can I check that the nginx gzip_static module is working?如何检查 nginx gzip_static 模块是否正常工作?
【发布时间】:2011-01-28 11:36:35
【问题描述】:

我如何检查 nginx 是否提供 .gz 版本的静态文件(如果存在)?

我使用 gzip 静态模块编译了 nginx,但在我的日志中没有看到任何提及 .gz 版本的内容。 (我已将 global.js 和 global.css 文件与它们的 .gz 版本压缩在同一目录中)。

nginx.conf 的相关部分如下所示:

gzip  on;
gzip_static on;
gzip_http_version 1.0;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;

gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

任何指针将不胜感激。

【问题讨论】:

  • 对于使用预编译 nginx 的任何人:要检查您的 nginx 是否使用必要的参数 --with-http_gzip_static_module 编译,请运行 nginx -V

标签: gzip nginx


【解决方案1】:

使用 strace。首先需要检测nginx进程的PID:

# ps ax | grep nginx
25043 ?        Ss     0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
25044 ?        S      0:02 nginx: worker process

好的,所以 25044 是工作进程。现在,我们追踪它:

# strace -p 25044 2>&1 | grep gz
open("/var/www/css/ymax.css.gz", O_RDONLY|O_NONBLOCK) = 438
open("/var/www/css/patches/patch_my_layout.css.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
open("/var/www/yaml/core/iehacks.css.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
open("/var/www/js/koznazna5.js.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
open("/var/www/css/ymax.css.gz", O_RDONLY|O_NONBLOCK) = 216

如您所见,它正在尝试查找 .gz 版本的文件。

【讨论】:

  • 注意:strace 通过多次添加 -p xyz 参数来支持多个 PID。当您有多个 nginx 工作进程时很有用。
  • 如果您触摸服务器上的资产文件,并在浏览器上使用隐身/私人模式选项卡,您将强制重新保存文件,因此上述技术可以在没有任何问题的情况下提供有保证的结果缓存挡住了(希望如此)。
  • 看起来需要原始文件gist.github.com/ancap/7412315,无法删除。
  • 使用 strace 更容易做的是“strace -fp $PID”,其中 $PID 是主进程的 PID。 -f 标志告诉 strace 也跟踪所有子进程。
  • strace -f "跟随分叉"。因此,在我已经发生分叉的情况下,它不起作用。你可以使用strace $(pidof nginx | xargs -n 1 echo '-p')
【解决方案2】:

更改非 gzip 文件的内容。然后touch 两个文件(同时——即:在touch 的同一个实例中)。如果当您在浏览器中加载文件(缓存擦除)时,您得到的是未更改的文件,那么 nginx 会提供静态缓存的 gzipped 文件。

避免“我只是获取缓存吗?” 担心的一个简单方法是使用curl 从命令行获取,因为 curl 不缓存。

【讨论】:

    【解决方案3】:

    我会禁用自动压缩并记录gzip_ratio

    http {
       gzip off;
       gzip_static on;
    
       log_format log_with_ratio "... $gzip_ratio ...";
    
       server {
          access_log /var/log/nginx/file.log log_with_ratio;
       }
    }
    

    请注意,您可以根据服务器和位置级别覆盖 gzipgzip_staticaccess_log

    【讨论】:

    • 这实际上非常适合测试 nginx 是否正在运行 gzip,即(gzip on),但是如果您尝试使用它来查看 gzip_static 是否打开,它只会输出一个连字符...(使用 nginx 1.2.6)。但是,如果您打开 gzip_static 并关闭 gzip 并且内容编码是 gzip,我认为您可以假设它正常工作
    【解决方案4】:

    我注意到了一些关于 ETag 响应头的提示。

    如果静态文件由 nginx 提供服务,则 header 看起来像这样:ETag: "135a-BQhu6KL71dyeCXcVZme6ug",但是,当 nginx 压缩响应(通过 gzip 模块)时,它看起来像这样:ETag: W/"135a-BQhu6KL71dyeCXcVZme6ug"(注意 W/)。

    您可以使用它以及Content-Encoding: gzip 来区分普通静态文件、预压缩静态文件和动态压缩文件。

    【讨论】:

      【解决方案5】:

      我通常使用 Chrome 开发工具并查看相关文件的文件大小。

      【讨论】:

      • 这将如何帮助您了解服务器是动态压缩还是使用了已经预压缩的文件?
      • 负号不是我。
      【解决方案6】:

      如果启用 Content-Encoding 列(右键单击列以启用/禁用表格中的特定内容),则可以通过 Network 标签使用 Chrome Dev Tools:

      Chrome Dev Tools with Content-Encoding column enabled screenshot

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-05
        • 2013-08-10
        • 2015-07-25
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 2014-01-11
        • 2020-04-23
        相关资源
        最近更新 更多