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