2009-09-28 90 views
4

使用预压缩模块可以很容易地查找预压缩的.gz版本的页面,并将其提供给接受gzip的浏览器以避免动态压缩的开销,但是我希望do是从磁盘中删除未压缩的版本,并只存储压缩版本,这显然会以相同的方式提供服务,但如果不支持gzip的用户代理请求我希望nginx解压缩的页面即时在传输之前。有没有办法在nginx中进行即时解压缩的预压缩?

有没有人做过这个或有其他高性能的Web服务器提供这种功能?

回答

0

一种选择是有一个fall-backupstream服务器解压缩该文件,例如:

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模块。这可以节省每个请求的解压缩开销,方法是允许文件暂时挂起。

3

在Nginx上发送静态预压缩gzip文件的最好方法是使用http_gzip_static_module。 更具体地说,在配置中你会想:

gzip_static always;

http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html

为了能够服务于该文件即你只需要你的服务器,以节省IO上的.gz文件,您将要使用的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/