Rails - Nginx 不缓存图像

Rails - Nginx 不缓存图像

我有一个 VPS,使用 Nginx 和 Unicorn 运行我的 Rails 应用程序。我成功地将过期标头添加到 JS 和 CSS 文件中,但我无法强制 Nginx 缓存图像(根据 YSlow 和 Google PageSpeed Insights)。

这是我的服务器块:

server {
  listen   80;
  root /home/rails/public;
  server_name _;
  index index.htm index.html;

  location / {
    try_files $uri/index.html $uri.html $uri @app;
  }

  location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|flv|mpeg|avi)$ {
    try_files $uri @app;
  }

  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
    expires max;
  }

}

最后一段代码是我实现 CSS 和 JS 缓存的方法,但它不适用于图像。我做错了什么?我应该在其他地方做一些额外的更改吗?

多谢!

答案1

您有两个与图像匹配的位置块:

location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|flv|mpeg|avi)$ {
    try_files $uri @app;
}

location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
    expires max;
}

Nginx 将在第一个匹配的正则表达式位置块处停止,因此第二个位置块是没用过适用于 jpg、jpeg、png、gif 和 ico 文件。

更新:后备缓存的详细信息

server {
  listen   80;
  root /home/rails/public;
  server_name _;
  index index.htm index.html;

  location / {
    try_files $uri/index.html $uri.html $uri @app;
  }

  location ~* ^.+\.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires max;
    try_files $uri @app;
  }

  location ~* ^.+\.(zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|flv|mpeg|avi)$ {
    try_files $uri @app;
  }

  location @app {
    if ($uri ~* ^.+\.(jpg|jpeg|png|gif|ico|css|js)$) {
        expires max;
    }
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

}

相关内容