CDN

CDN на коленке: Часть 2. Проксирующий веб-сервер

В предыдущей записи было рассмотрено создание geo dns, который отдает пользователю адрес наиболее близкого к нему сервера. Теперь поговорим о том как контент будет попадать на этот сервер и какими средствами он будет отдавать его пользователю.

Начнем с последнего. Так как нашей целью является отдача статического контента сайта, то вполне логично поручить это веб-серверу, например быстрому и не требующему много ресурсов .

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

Получив первый запрос на скачивание файла проксирующий сервер переправляет его на основной сервер, а после успешной обработки запроса этот файл попадает в локальный кэш. Остальные запросы на скачивание этого файла будут обрабатываться уже из локального кэша, без обращения к основному серверу. Кэширование является самым распространённым методом реализации , поскольку позволяет максимально эффективно использовать узлы , располагая на них не весь контент, а только наиболее востребованный.

От слов к делу, конфигурация проксирующего сервера Nginx:

_cache_path /var/cache/nginx/static levels=1:2 keys_zone=static:32m inactive=1d max_size=1g;

upstream backend {
    server 192.168.0.1:80;
}

server {
        listen   80;

        server_name rascal.su www.rascal.su cdn.rascal.su;

        location / {
            _pass http://backend;
            _redirect off;
            _set_header Host $host;
            _set_header X-Real-IP $remote_addr;
            _set_header X-Forwarded-For $_add_x_forwarded_for;
            _buffer_size 16k;
            _buffers 32 16k;
            _cache off;
        }

        location ~* \.(jpg|jpeg|gif|png|ico|css|midi|wav|bmp|js|swf|flv|avi|djvu|mp3|xml|zip)$ {
            _pass http://backend;
            _redirect off;
            _set_header Host $host;
            _set_header X-Real-IP $remote_addr;
            _set_header X-Forwarded-For $_add_x_forwarded_for;
            _buffer_size 16k;
            _buffers 32 16k;

            if ($request_uri ~* "\?[0-9]+$") {
                expires max;
                break;
            }

            _cache static;
            _cache_valid 1d;
            _ignore_headers "Cache-Control" "Expires";
            _cache_key "$uri$is_args$args";
            _cache_lock on;
        }
}