Назад | Перейти на главную страницу

Nginx серверы старые статические файлы после git commit

Я использую Nginx для обслуживания статических файлов (а также в качестве обратного прокси для моего NodeJS express RestAPI). Проблема в том, что когда я отправляю на сервер новый коммит git, пользователи все равно будут получать старые (последней версии) файлы. На данный момент обходной путь заключается в том, что пользователь очищает кеш в браузере.

Что могло быть причиной этого? Я предполагаю, что это неправильная конфигурация кеширования на стороне сервера? См. Ниже мою конфигурацию nginx (базовая + включает).

Как вы можете видеть ниже, статические файлы (.html, .js, .css) находятся в / var / www / frontend.

##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

listen 80;

server_name **REMOVED_FOR_PRIVACY_REASONS**;

proxy_cache_valid 404 1m;

location / {
        root /var/www/frontend;
        index index.html
        try_files try_files $uri $uri/ =404;

        #proxy_cache backcache;
        #proxy_cache_bypass $http_cache_control;
        #add_header X-Proxy-Cache $upstream_cache_status;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

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

<link src="/static/style.css?v=xxxx">
<script language="javascript" type="text/javascript" src="/js/app.js?v=xxxx"></script>

Я тоже думаю, что это связано с кешированием на стороне клиента.

Я бы начал отладку с помощью firebug или чего-то подобного, загрузил страницу и проверил заголовки кеширования (etag / last-modified / cache-control / expires).

Пока мы занимаемся этим, я нашел действительно хороший документ о HTTP-кешировании:

https://www.mnot.net/cache_docs/

Сделано одним из парней, которые, тем не менее, создают стандарт HTTP.

В дополнение к другим ответам взгляните на хешбастер, инструмент, написанный на Python, для решения подобных проблем. Описание гласит: «hashbuster - это инструмент для добавления строки запроса с очисткой кеша для URL в ваших файлах HTML.

Если вы вносите много изменений в действующие веб-сайты, кеши браузера и прокси, вероятно, станут проклятием вашего существования. Если вам когда-либо приходилось указывать клиенту очистить кеш браузера, чтобы увидеть ваш последний код, то hashbuster для вас ».

Вы можете вызвать инструмент, например, через git post-receive хук на вашем сервере.