使用预压缩模块可以轻松查找页面的预压缩.gz版本并将其提供给接受gzip的浏览器以避免动态压缩的开销,但我想要的是什么要做的是从磁盘中消除未压缩的版本并仅存储压缩版本,这显然会以相同的方式提供,但是如果不支持gzip的用户代理请求我希望nginx解压缩的页面在在传送它之前飞。
有没有人这样做过,还是有其他提供此功能的高性能网络服务器?
答案 0 :(得分:3)
在Nginx上发送静态预压缩gzip压缩文件的最佳方法是使用http_gzip_static_module。 更具体地说,您需要的配置:
总是gzip_static;
http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html
为了能够提供解压缩的文件版本,即您的服务器上只有.gz文件以保存在IO上,您将需要使用http_gunzip_module。在您的配置中,它看起来像这样:
gunzip on;
http://nginx.org/en/docs/http/ngx_http_gunzip_module.html
您可能还对gunzip_module页面底部的链接感兴趣。
P.S。在预压缩我建议使用Google的Zopfli压缩算法的文件时,它会增加构建时间(而不是减压时间),但会将文件大小减少大约5%。 https://code.google.com/p/zopfli/
答案 1 :(得分:0)
一个选项是让fall-back upstream服务器解压缩文件,例如:
gzip_static on;
...
upstream decompresser {
server localhost:8080; // script which will decompress the file
}
location / {
try_files $uri @decompress;
}
location @decompress {
proxy_pass http://decompresser;
}
另一个选择是使用embedded perl module作为后退而不是上游,但是这会导致nginx阻塞,如果操作持续一段时间会降低性能。
使用上游模型,您可以通过使用系统的默认gzip
程序解压缩到/ tmp目录中的文件来利用nginx的XSendfile模块。通过允许文件暂停一段时间,这可以节省每个请求的解压缩开销。