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