Рейтинг:0

Добавление блока местоположения в файлы кеша заставляет эти файлы возвращать 404

флаг in

Я хочу кэшировать некоторые статические файлы с помощью Nginx. Но я почему-то не могу заставить его работать.

Это мое nginx.conf:

www-данные пользователя;
рабочие_процессы авто;
pid /run/nginx.pid;
включить /etc/nginx/modules-enabled/*.conf;

События {
    worker_connections 768;
    #multi_accept включен;
}


http {

    #GZIP
    gzip включен;
    gzip_vary включен;
    gzip_proxy любой;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_версия 1.1;
    gzip_min_length 256;
    приложение gzip_types/приложение javascript/приложение json/приложение ld+json/шрифт xml/шрифт eot/шрифт otf/текст ttf/текст css/текст javascript/обычный текст/xml;

    # СЕРВЕРА
    сервер {
            слушать 80;

        имя_сервера пример.com;
        если ($http_host ~* ^www\.(.*)$ )
        {
            вернуть 301 https://$1$request_uri;
        }

        вернуть 301 https://$http_host$request_uri;
    }
    сервер {
        слушать 443 ssl;

        если ($http_host ~* ^www\.(.*)$ )
        {
            вернуть 301 $схема://$1$request_uri;
        }


        #SSL
        ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
        ssl_certificate_key /root/.acme.sh/example.com/example.com.key;

        имя_сервера пример.com;

        # Передать весь трафик моему веб-приложению
        место расположения / {
            proxy_set_header Хост $host;
            proxy_pass http://localhost:8080;
        }

        #Кэширование в браузере
        расположение ~* \.(js|css)$ {
            истекает через 180 дней;
            add_header Прагма «общедоступная»;
            add_header Cache-Control "public";
        }
        расположение ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
            истекает через 365 дней;
            add_header Прагма «общедоступная»;
            add_header Cache-Control "public";
        }

    }
}

Проблема связана с частью «Кэширование браузера». При включении этого блока кода мой сайт загружается, но все css-файлы, javascript-файлы и изображения возвращают 404. Как будто эти файлы игнорируют мои место расположения /.

Я смог решить эту проблему, скопировав/вставив

proxy_set_header Хост $host;
proxy_pass http://localhost:8080;

во всех моих место расположения-blocks, но это не очень элегантно и на самом деле заставило мой сайт работать намного медленнее...

Я также попытался переместить два место расположения-блоки для кеширования браузера в блоке место расположения \ поэтому последний будет действовать как «родитель». Но это не повлияло на поведение изображений и т. д., возвращающих 404.

Как мне настроить кеширование статических файлов в Nginx?

Редактировать: Я добавил следующее в свой http-блокировать:

  карта $uri $cache_control {
                ~/Website/assets/media/images "общедоступно, без преобразования";
        }
        карта $uri $expire {
            ~/Веб-сайт/активы/медиа/изображения 365d;
        }

Добавил следующее в мой сервер-блокировать:

 истекает $expire;
                add_header Cache-Control $cache_control;

Ничего не кешируется.

Ivan Shatsky avatar
флаг gr
Какое у вас серверное веб-приложение? Почему вы не можете обслуживать статические файлы с помощью nginx без вызова бэкэнда, как предлагает Теро Килканен?
O'Niel avatar
флаг in
Мое серверное веб-приложение — это Rust-приложение. И URL-адрес, по которому найдены ресурсы/файлы, не совпадает с фактическим местоположением на сервере. Я переписываю свои пути доступа и ресурсов в веб-маршрутах.
Ivan Shatsky avatar
флаг gr
Хорошо, если вы не можете обслуживать свои статические ресурсы, используя только nginx, и должны проксировать все запросы к серверной части, проверьте [этот] (https://stackoverflow.com/a/64287782/7121513) ответ. Я думаю, это именно то, о чем вы просите (требуется минимальная адаптация).
O'Niel avatar
флаг in
@IvanShatsky Посмотреть редактирование. Файлы не кэшируются.
Ivan Shatsky avatar
флаг gr
Добавьте строку `default off;` в блок `map $uri $expire { ... }`.Что это за префикс `/Website`? Действительно ли это часть URI, а не доменного имени? Проверьте, присутствуют ли требуемые заголовки ответа с помощью DevTools или curl браузера. Вы уверены, что серверное приложение не добавляет ничего из этого?
O'Niel avatar
флаг in
Я думал, что путь был фактическим путем к файлу на VPS. Я удалил часть «Веб-сайт», и теперь он работает! Спасибо!
Ivan Shatsky avatar
флаг gr
Поскольку вы уже начали вознаграждение, не возражаете, если я напишу это как ответ? :) Я буду использовать немного разные блоки `map`, чтобы ответить на ваш первоначальный вопрос, где файлы JS/CSS и изображения должны получать разные значения заголовка Expires.
O'Niel avatar
флаг in
@IvanShatsky Конечно, приятель. Ваша помощь приветствуется.
Рейтинг:1
флаг gr

Если вы не можете обслуживать свои статические ресурсы напрямую из файловой системы через nginx, как предлагает @TeroKilkanen, вы можете использовать метод, аналогичный показанному на это отвечать:

карта $uri $expire {
    ~\.(?:j|cs)s$ 180d;
    ~\.(?:jpe?g|png|webp|woff2?|ttf)$ 365d;
    по умолчанию выключено;
}
карта $uri $cache_control {
    ~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$ public;
}
сервер {
    ...
    истекает $expire;
    add_header Прагма $cache_control;
    add_header Cache-Control $cache_control;
    ...
}

Если ваш URI запроса не соответствует регулярному выражению, $cache_control переменная будет иметь пустое значение, и nginx не добавит Прагма и Кэш-Контроль заголовок к его ответу вообще.

Рейтинг:1
флаг us

На самом деле это не отвечает на ваш вопрос, но показывает предпочтительный способ обслуживания статических ресурсов с помощью nginx.

Поскольку вы, похоже, запускаете веб-приложение на одном хосте, я рекомендую вам обслуживать статические файлы напрямую с помощью nginx.

корень /путь/к/webroot;

расположение ~* \.(js|jss)$ {
    истекает через 180 дней;
    add_header Прагма "общедоступная";
    add_header Cache-Control "public;

    try_files $uri = 404;
}

расположение ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
    истекает через 365 дней;
    add_header Прагма "общедоступная";
    add_header Cache-Control "public";

    try_files $uri = 404;
}

У этого все еще есть повторяющиеся определения для кэширования. Вы можете устранить часть дублирования, указав директивы в отдельном файле и используя включать чтобы включить файл в вашу конфигурацию.

Вы должны ввести следующее, чтобы proxy_header.conf файл:

add_header Прагма "общедоступная";
add_header Cache-Control "public";

И в вашем конфиге:

расположение ~* ... {
    включить /path/to/webroot;
    истекает через 365 дней;
}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.