我正在使用在Ubuntu 12.04.4上运行的nginx 1.4.4。
nginx 反向代理一组Rails应用程序服务器。
直接提供静态文件(主要是资产),而不会影响应用程序服务器。
我已将其设置为gzip响应并在可用时使用预压缩文件。
http {
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
# other ngx_http_gzip_module directives...
server {
# proxy configuration
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
# root is inherited
try_files $uri =404;
error_page 404 /404.html;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这有效。
我已经使用真实的预压缩资产和具有相同名称但内容不同的虚拟非压缩资产对其进行了测试:
/assets/application-a45d6...e2593.css # dummy content
/assets/application-a45d6...e2593.css.gz # real CSS
Run Code Online (Sandbox Code Playgroud)
我可以看到这种切换,gzip_static on并off会导致 nginx 正确提供文件的预期版本。
到现在为止还挺好。
但是,此设置仅在文件的非压缩版本也存在时才有效。只有预压缩版本会导致 404。
该文件说:
gzip_static
使用“always”值(1.3.6),在所有情况下都使用 gzip 压缩文件,而不检查客户端是否支持它。如果磁盘上没有任何未压缩的文件或者使用了 ngx_http_gunzip_module,这很有用。
(是的:我都试过onand always,我也试过添加gunzip on。没有任何改变)
这似乎表明只有文件的压缩版本是可以的。真的是这样吗?我的配置有什么问题吗?
您可能发现了一个错误。但总的来说,您无论如何都需要这两个文件,原因有以下三个:
gzip_static always;他们可能无法理解。Nginx 1.6 不需要解压缩文件:
location ~ \.txt$ {
gzip_static on;
gunzip on;
}
Run Code Online (Sandbox Code Playgroud)
无论curl http://localhost/index.txt和curl -H "Accept-Encoding: gzip" http://localhost/index.txt | gunzip现在的工作罚款只是/srv/www/localhost/index.txt.gz在我的根目录。