А если сделать так: парсить логи доступа (/var/www/proxy-access.log) на
предмет скачивания файлов. Внешним скриптом/программой да хоть wget с
ключом -c выкачивать файлы и складывать в папку /var/www/cache
Конфиг:
location / {
root /var/www/cache;
try_files $uri @proxy;
}
location @proxy {
proxy_pass http://cdnhost.tld$request_uri;
access_log /var/www/proxy-access.log;
}
Nginx будет сначала пытаться брать из локального "кеша", если не
получилось - выкачает с сервера.
Недостатки: "кеш" не протухает (может быть достоинством) и может устареть.
05.08.2020 00:44, Raice пишет:
> Добрый день! Подскажите, пожалуйста, как правильно настроить проксирование с
> кэшем из 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 mailing list
> nginx-ru@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
>
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru