Мы используем виртуальную машину с прокси-сервером nginx (кеширование отключено) для перенаправления хостов на правильный URL-адрес CDN.
У нас возникают проблемы с прокси-сервером, показывающим старый контент, который не соответствует тому, что показывается в CDN. Используемый нами провайдер CDN — Verizon (через Azure — Microsoft CDN от Verizon).
Когда мы обновляем источник, мы автоматически отправляем запросы на очистку в CDN. Это могут быть как ручные, так и автоматические динамические обновления, а также очистка отдельных URL-адресов и удаление с помощью подстановочных знаков. Кажется, что происходит, когда мы получаем 2 запроса на чистку, близкие по времени. Первый проходит на прокси, а второй нет. Хотя оба они отображаются правильно при прямом доступе к URL-адресу CDN.
Следует отметить, что эта проблема возникает только примерно в 30% времени.
Конфигурация образца nginx:
server {
resolver 8.8.8.8;
server_name <CUSTOM HOST>;
location / {
# Turn off all caching
proxy_no_cache 1;
proxy_cache_bypass 1;
proxy_redirect off;
expires -1;
proxy_cache off;
# Proxy settings
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
# Override cache headers to set 2min browser cache
proxy_hide_header Cache-Control;
add_header Cache-Control max-age=120;
proxy_pass "<CDN URL>request_uri";
}
}
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 {
sendfile off;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Ниже приведен пример, когда CDN показывает более новый контент, чем прокси, у нас есть несоответствие Last-Modifed:
Я пытался через VPN, чтобы увидеть, есть ли что-нибудь с конкретным POP, с которым работает прокси-сервер, но все POP показывают правильное содержимое.
При наличии ошибки отправка запроса curl с прокси-сервера в CDN приведет к тем же неправильным заголовкам.
После выполнения очистки несколько запросов проходят напрямую к источнику, пока CDN снова не начнет обслуживать кэшированную версию.
Примерно через 1 минуту мы получаем первый HIT.
Я начал предполагать, что это может иметь какое-то внутреннее отношение к Azure и Verizon. Поэтому я создал точный дубликат прокси-сервера, размещенного на Amazon, но ошибка кажется точной. Есть ли что-то еще в nginx, что может вызвать такое поведение?