Добавление location-block в файлы кэша приводит к тому, что эти файлы возвращают ошибку 404.

Добавление location-block в файлы кэша приводит к тому, что эти файлы возвращают ошибку 404.

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

Это мое nginx.conf:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    #multi_accept on;
}


http {

    #GZIP
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_types application/javascript application/json application/ld+json application/xml font/eot font/otf font/ttf text/css text/javascript text/plain text/xml;

    # SERVERS
    server {
            listen      80;

        server_name example.com;
        if ($http_host ~* ^www\.(.*)$ )
        {
            return 301 https://$1$request_uri;
        }

        return 301 https://$http_host$request_uri;
    }
    server {
        listen 443 ssl;

        if ($http_host ~* ^www\.(.*)$ )
        {
            return 301 $scheme://$1$request_uri;
        }


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

        server_name example.com;

        # Pass all traffic to my webapplication
        location / {
            proxy_set_header Host $host;
            proxy_pass http://localhost:8080;
        }

        #Browser caching
        location ~* \.(js|css)$ {
            expires 180d;
            add_header Pragma "public";
            add_header Cache-Control "public";
        }
        location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
            expires 365d;
            add_header Pragma "public";
            add_header Cache-Control "public";
        }

    }
}

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

Мне удалось решить эту проблему путем копирования/вставки

proxy_set_header Host $host;
proxy_pass http://localhost:8080;

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

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

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

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

  map $uri $cache_control {
                ~/Website/assets/media/images    "public, no-transform";
        }
        map $uri $expire {
            ~/Website/assets/media/images   365d;
        }

Добавил в свой -block следующее server:

 expires $expire;
                add_header Cache-Control $cache_control;

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

решение1

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

map $uri $expire {
    ~\.(?:j|cs)s$                      180d;
    ~\.(?:jpe?g|png|webp|woff2?|ttf)$  365d;
    default                            off;
}
map $uri $cache_control {
    ~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$  public;
}
server {
    ...
    expires $expire;
    add_header Pragma $cache_control;
    add_header Cache-Control $cache_control;
    ...
}

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

решение2

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

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

root /path/to/webroot;

location ~* \.(js|jss)$ {
    expires 180d;
    add_header Pragma "public";
    add_header Cache-Control "public;

    try_files $uri =404;
}

location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
    expires 365d;
    add_header Pragma "public";
    add_header Cache-Control "public";

    try_files $uri =404;
}

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

В файл необходимо ввести следующее proxy_header.conf:

add_header Pragma "public";
add_header Cache-Control "public";

И в вашей конфигурации:

location ~* ... {
    include /path/to/webroot;
    expires 365d;
}

Связанный контент