Проксирование с кэшем из CDN

Raice nginx-forum на forum.nginx.org
Вт Авг 4 17:44:41 UTC 2020


Добрый день! Подскажите, пожалуйста, как правильно настроить проксирование с
кэшем из CDN. Задача такая: есть CDN, с него нужно скачивать достаточной
большой объем информации, но это достаточно дорого обходится, поэтому
появилась такая мысль - поднять прокси на nginx, который будет проксировать
запросы на CDN и кэшировать их. Файлы там статика, меняются крайне редко и
размер файла может быть 200Гб и выше. Хотелось бы чтобы с CDN закачка через
прокси шла только один раз, т.е. чтобы скачивал сам nginx и потом раздавал.
Я тут промучился, сначала с rh-nginx114 - с ним толком не работало. Файлы в
несколько ГБ вроде работали, 50ГБ - постоянные обрывы и т.д. Поставил 1.18
из оригинального репозитория - вроде дело пошло лучше, но хотелось бы
убедиться, что все сделал правильно. Обычное кэширование мне не подходило,
т.к. хосты начинают качать одновременно и получалось, что т.к. файлы большие
все равно почти все уходило на CDN. Решил сделать через слайсы. Кэш вроде
наполняется. 

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request"
'
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  65;
    types_hash_max_size 2048;
....
    proxy_cache_path /data/nginx/cache keys_zone=mycache:100m levels=1:2
max_size=1500g inactive=7d use_temp_path=off;
    proxy_buffering           on;
    proxy_buffer_size         4k;
    proxy_buffers             256 4k;
....
    log_format cache_status '[$time_local] $remote_addr  "$request"
$upstream_cache_status';
    access_log /var/log/nginx/cache_access.log cache_status;
....
    gzip on;
    gzip_disable "msie6";
....
    gzip_proxied any;
....
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
....
    include /etc/nginx/conf.d/*.conf;

}

server {
        listen 81;
        resolver 172.17.19.10;
        location / {
                limit_rate 30m;
                proxy_read_timeout 3600;

                proxy_cache mycache;
                proxy_pass http://cdnhost.tld$request_uri;

                slice              30m;

                proxy_cache_key $host$uri$is_args$args$slice_range;


                proxy_set_header   Range $slice_range;
                proxy_http_version 1.1;


                proxy_hide_header ETag;

                proxy_cache_valid      200 206 301 302 7d;
                proxy_cache_valid 404      1m;

                proxy_set_header        Host cdnhost.tld

                proxy_ignore_headers "Set-Cookie";
                proxy_ignore_headers Cache-Control;

                proxy_temp_path /data/nginx/temp;
        }
}


Подскажите, все ли правильно сделал? Будет ли работать так, как нужно?

Posted at Nginx Forum: https://forum.nginx.org/read.php?21,288966,288966#msg-288966



Подробная информация о списке рассылки nginx-ru