Как организовать на LEMP сервере отдачу картинок с CDN, только если на сайт идет большая нагрузка?
Есть сайт, живет на LEMP сервере (Linux, Nginx, MySQL, Php) основной контент это картинки, при большой нагрузке ~2000 тыс человек на сайте, сервер не справляется с отдачей статики, поэтому картинки вынесены на CDN. Но CDN кушает деньги, и 80% времени сайт не нагружен. Нужно сделать так, чтобы в эти 80% времени статика отдавалась с основного сервера, а как случается нагрузка, автоматически отдавались картинки с CDN. Есть идеи?
Как вариант, периодически netstat-ом считать соединения; при превышении какого-то количества включать cdn, а при уменьшении показателя чуть ниже предела переводить отдачу обратно. А на dns тоже кэш, так что не вариант.
Не меняя - никак, если только не ставить дополнительный прокси (например, на nginx), который в зависимости от настроек будет проксить запросы к статике то на cdn, то на основной сервер. Нужно делать, видимо, настройки вывода html-страниц с URL-ами на статику, которые при смене настроек меняются. И стоит помнить, что при смене ссылок на cdn-овские количество соединений может несколько уменьшиться за счёт того, что браузеры полезут за статикой на cdn, хотя посещаемость при этом останется большой, и не отключать cdn раньше времени.
lubezniy: Спасибо за ответ. Я как раз и пытаюсь понять как можно сделать прокси сервер который будет сам регулировать куда слать запрос, на сервер или на cdn, но при этом урлы статики не менять, они будут указывать на прокси сервер. Уверены что вообще никак? Мне все же кажется, что можно сделать так чтобы урл картинок не менялись вообще...
Скажем так: установка прокси - это таки извращение, т. к. при этом теряются все преимущества CDN, плюс тратятся деньги на содержание этого прокси. Уж лучше тогда отдельный сервер или виртуалку с nginx под статику выделить, если нагрузка не слишком большая. Конечно, соблазнительно выглядит round-robin на уровне DNS (когда на запрос одного и того же доменного имени DNS-сервер отдаёт разные IP-адреса по очереди или в зависимости от запрашивающего), но: во-первых, клиенты сами кэшируют результат запроса к DNS-серверу; во-вторых, это же делают многочисленные пользовательские роутеры, причём нередко они плюют на TTL из ответа (по сути - срок действия результата запроса в секундах) и будут чуть ли ни до своей перезагрузки возвращать пользователю ip из своего кэша, даже если там уже ничего нет, а на DNS настройка другая уже как несколько часов. Поэтому разные URL, на мой взгляд, более кошерны.
Если статика большая по объёму (мегабайты и выше) и не слишком большая по количеству файлов, то вариант - сделать скрипт, который будет принимать запросы на статику и возвращать в ответ HTTP-редирект с кодом 302 (Moved temporarily) на один из нескольких URL-ов конкретного файла, расположенные на разных серверах (например, на основном сервере и в CDN). Базу URL-ов можно при этом держать в ОЗУ, чтобы не тратить драгоценные IOPS на не слишком мощном сервере или даже виртуалке. В этом скрипте уже можно прописать, какие урлы можно отдавать в конкретный момент (в зависимости от настроек), а какие нельзя (например, на выключенный сервер или незадействованную CDN). Такая схема позволяет держать очень приличную нагрузку и масштабироваться путём банального добавления новых серверов.
Как вариант, можно при повышении нагрузки подменять конфиг nginx так, чтобы на запросы статики он отдавал 307-й (временный) редирект на CDN. Это съест часть преимуществ CDN (один лишний запрос) но не потребует ломать кэш HTML. Но вообще решение спорное, имхо лучше менять URL.