我正在与nginx 1.4.4正在运行Ubuntu 12.04.4.
nginx 正在反向代理一组轨道应用服务器。
静态文件(主要是资产)直接提供,无需访问应用服务器。
我已将其设置为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;
}
}
}
这有效。
我已经用真实的预压缩的资源和假的具有相同名称但不同内容的非压缩资产:
/assets/application-a45d6...e2593.css # dummy content
/assets/application-a45d6...e2593.css.gz # real CSS
我可以看到切换gzip_static
on
会off
导致 nginx 正确提供文件的预期版本。
到目前为止一切顺利。
然而,此设置仅适用于非压缩文件的版本也存在。只有预压缩版本将导致 404。
这文档说:
gzip_static
使用“always”值(1.3.6),在所有情况下都使用 gzip 文件,而不检查客户端是否支持它。如果磁盘上没有未压缩的文件或使用 ngx_http_gunzip_module,则很有用。
(是的:我尝试了on
和always
,并且还尝试了添加gunzip on
。什么都没有改变)
这似乎表明仅有的压缩版本的文件没问题。真的是这样吗?我的配置有什么问题吗?
答案1
您可能发现了一个错误。但一般来说,您还是需要这两个文件,原因有三:
- 一些客户端不会请求压缩数据,如果你强迫他们接受,
gzip_static always;
他们可能无法理解。 - 确保始终能找到文件,并且请求不会向上游传递到 Rails 或被 404 处理程序捕获(可能的错误)。其中之一可能就是正在发生的事情。
- 让 nginx 在运行时压缩或解压缩文件意味着它必须反复执行此操作,这会占用宝贵的 CPU,而这些 CPU 本来可以用来运行应用程序。而简单地发送静态资源则占用更少的 CPU。
答案2
Nginx 1.6 上不需要解压缩文件:
location ~ \.txt$ {
gzip_static on;
gunzip on;
}
现在curl http://localhost/index.txt
,只需在我的根目录中curl -H "Accept-Encoding: gzip" http://localhost/index.txt | gunzip
即可正常使用。/srv/www/localhost/index.txt.gz
答案3
与@hendry 所说的相反,我需要保留原始文件。
我使用 nginx 1.15.9 (Ubuntu)
。
gzip_static 编译为:
nginx -V 2>&1 | grep "\-\-with\-http_gzip_static_module
gunzip
编译为:
nginx -V 2>&1 | grep "\-\-with\-http_gunzip_module"
。
我发现了这一点,尽管它可能已经过时了:
try_files 不知道 gzip_static;但如果非 gz 文件和 .gz 文件都存在,nginx 仍会遵守它。这与“正常”的 gzip_static 处理不同,后者将在适当的情况下提供 .gz 版本,无论是否存在非 gz 文件。-http://mailman.nginx.org/pipermail/nginx/2012-June/034102.html
看来 try_files 需要原始文件才能在那里工作,并且不会始终受到 gzip_static 的影响。这是因为 try_files $uri =404 需要 $uri 文件存在。-https://trac.nginx.org/nginx/ticket/1570
这是我的nginx.conf
:
events {
worker_connections 768;
}
http {
server {
# Enable static gzip
gzip_static on;
gunzip on;
listen 8080 default_server;
listen [::]:8080 default_server;
root /home/user/projects/project1/build;
location / {
try_files $uri /index.html;
}
}
}
用 运行它sudo nginx -t -c nginx.conf -p $PWD
。
使用 重新启动sudo killall -9 nginx; sudo nginx -c nginx.conf -p $PWD; ps aux | grep nginx
。