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;
}
}