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

fox red-fox0 на ya.ru
Ср Авг 5 03:27:58 UTC 2020


А если сделать так: парсить логи доступа (/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