Rails - Nginx не кеширует изображения

У меня есть VPS, где я запускаю приложение Rails, используя Nginx и Unicorn. Мне удалось добавить заголовки expires в файлы 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;
  }

}
Другие вопросы по тегам