Настройка Nginx с целью использования бесплатной CDN

21.12.2012
CoralCDN LogoСуществует бесплатное решение для размещения отдельных файлов и целых страниц — CoralCDN. В простейшем случае чтобы пользователь получил что-то с нашего сайта через эту сеть, достаточно в URL нашего ресурса добавить после имени хоста .nuyd.net — в этом случае файл будет закеширован Coral и отдан им же. Идея серверного решения под CoralCDN в использовании условного перенаправления. Результаты:

location ~ .(jpg|png|gif|jpeg|css|js)$ {
    	expires 2w;
	if ($http_user_agent ~ ^CoralWebPrx) { break; }
	if ($query_string ~ (^|&)coral-no-serve$) { break; }
	add_header X-Coral-Control "redirect-home";
	rewrite ^/(.*) $scheme://$host.nyud.net/$1? redirect;
}

Эта часть конфигурации Nginx позволяет всю статику перенаправить через чужие сервера.

Почему так

Суть работы Coral в том, чтобы взять ресурс у нас и закешировать его у себя. Стало быть, простая идея все запросы на статику всегда перенаправлять на CoralCDN сразу же приведет к бесконечной переадресации между нашим сервером и CDN. Для того, чтобы избежать этого — ставим проверку на http_user_agent:


if ($http_user_agent ~ ^CoralWebPrx) { break; }

Далее. Сеть Coral не всегда отдаст нам желаемую копию. В некоторых случаях узел сети откажется нас обслуживать и перенаправит запрос обратно, добавив GET-параметр coral-no-serve. Значит — проверяем GET-параметры.


if ($query_string ~ (^|&)coral-no-serve$) { break; }

Зачем нужен дополнительный заголовок X-Coral-Control при перенаправлении запроса к CoralCDN? Дело в том, что если с наш хост создает слишком большую нагрузку на CDN – нас откажутся обслуживать, но по умолчанию нас уже не отправят обратно, а выдадут 403 FORBIDDEN заголовок. Здесь мы можем решить оставить это так, как есть. От нагрузки сервер упал, бывает. Но мы можем попытаться отдать свой ресурс сами. Для этого укажем Coral, что запрос надо вернуть обратно, на настоящий ресурс в случае, если нагрузка от нас слишком велика. Тогда все пойдет по вышеупомянутому пути с GET-параметром coral-no-serve.

Зачем указаван expires? Дело в том, что если не указывать никакого срока годности, то по-умолчанию Coral будет хранить его 12 часов.


Ограничения

Не все и не всегда может быть перенаправлено через Coral. Есть 3 причины, по которым узел CDN может отказать нам в обслуживании:

  • Узел слишком нагружен. Значит что в течении пиковая нагрузка отдачи за час больше 1.5 Гб, или средняя нагрузка больше 500Мб.
  • Узел отдал траффика больше некоторого, заранее не известного, предела для конкретного нашего домена.
  • Файл, который мы хотим закешировать в CDN более 50 Мб. В данном случае запрос будет возвращен обратно GET параметром coral-no-serve.

Ссылки