Nginx-прокси + CDN

Мы используем виртуальную машину с прокси-сервером 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:

CDN: Заголовки CDN

ПРОКСИ: PROXY-заголовки

Я пытался через VPN, чтобы увидеть, есть ли что-нибудь с конкретным POP, с которым работает прокси-сервер, но все POP показывают правильное содержимое.

При наличии ошибки отправка запроса curl с прокси-сервера в CDN приведет к тем же неправильным заголовкам.

CURL запрос от прокси

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

После запросов на очистку

Примерно через 1 минуту мы получаем первый HIT.

Первое попадание после очистки

Я начал предполагать, что это может иметь какое-то внутреннее отношение к Azure и Verizon. Поэтому я создал точный дубликат прокси-сервера, размещенного на Amazon, но ошибка кажется точной. Есть ли что-то еще в nginx, что может вызвать такое поведение?


person Melz    schedule 28.01.2021    source источник


Ответы (1)


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

add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
person Mikael Hugo    schedule 28.01.2021
comment
Из вашего ответа неясно, действительно ли ответ решил вопрос ОП. Попытка формулировки спорна. - person user14063792468; 29.01.2021
comment
Сначала это казалось более стабильным, но, к сожалению, ошибка все еще возникает, кажется, это происходит только тогда, когда мы получаем 2 последовательные очистки, близкие по времени. - person Melz; 29.01.2021