我如何检查nginx是否正在提供.gz版本的静态文件(如果存在)?
我使用gzip静态模块编译了nginx,但是我没有看到在我的日志中提供的.gz版本。 (我在同一目录中将.gz版本的global.js和global.css文件缩小了。)
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;
任何指针都会受到赞赏。
答案 0 :(得分:82)
使用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版本的文件。
答案 1 :(得分:19)
更改非gzip压缩文件的内容。然后touch
两个文件(同时 - 即:在touch
的同一实例中)。如果在浏览器中加载文件(缓存擦除),则会获得未更改的文件,然后nginx会提供static-cached-gzipped文件。
一种简单的方法可以避免“我刚刚获取缓存吗?”担心的是使用curl
从命令行获取,因为curl不会缓存。
答案 2 :(得分:17)
我会禁用自动压缩并记录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;
}
}
请注意,您可以为每个服务器和位置级别覆盖gzip
,gzip_static
和access_log
。
答案 3 :(得分:1)
我注意到有关ETag
响应标题的一些提示。
如果静态文件由nginx提供,那么标题如下所示:ETag: "135a-BQhu6KL71dyeCXcVZme6ug"
,但是,当nginx压缩响应时(通过gzip模块),它看起来像这样:ETag: W/"135a-BQhu6KL71dyeCXcVZme6ug"
(注意{{ 1}})。
您可以使用此W/
来区分纯静态文件,预压缩静态文件和动态压缩的文件。
答案 4 :(得分:-3)
我通常使用Chrome Dev工具查看相关文件的文件大小。
答案 5 :(得分:-3)
如果启用Content-Encoding列,则可以通过Network选项卡使用Chrome Dev Tools(右键单击列以启用/禁用表中的特定内容):
Chrome Dev Tools with Content-Encoding column enabled screenshot