А почему не скажем cloudflare или cloudfront. _https://www.datanyze.com/market-share/site-delivery/Kazakhstan/cloudflare-cdn-market-share


Насколько я знаю оба провайдера дают API для провайдеров, также первый еще и сертификат выдает. Есть ли какие то преимущества вашей реализации?

Спасибо за интересную ссылку. Например, одним из условий размещения у мобильных операторов является возможность ограничить раздачу контента только их клиентам. Плюс различные юридические тонкости. Трёхсторонний договор с западной компанией не всех обрадует. В общем, своё получается проще и гибче.

По ряду причин, описанных в документации к lua-nginx-module из состава OpenResty, выгоднее всегда использовать локальные объявления.

Для того, чтобы быстро проверить объявления в вашем коде, можно воспользоваться утилитой lua-releng от тех же авторов.

Вывод для вашего кода:
vladislav@dt1:~$ ./lua-releng init.lua 
WARNING: No "_VERSION" or "version" field found in `init.lua`.
Checking use of Lua global variables in file init.lua...
	op no.	line	instruction	args	; code
	2	[2]	SETGLOBAL	0 -1	; getCdnHosts
	4	[11]	SETGLOBAL	0 -2	; stringToTable
	6	[27]	SETGLOBAL	0 -3	; valueExists
Checking line length exceeding 80...
vladislav@dt1:~$ ./lua-releng body_filter.lua 
WARNING: No "_VERSION" or "version" field found in `body_filter.lua`.
Checking use of Lua global variables in file body_filter.lua...
	op no.	line	instruction	args	; code
	1	[1]	GETGLOBAL	0 -2	; getCdnHosts
	6	[1]	SETGLOBAL	0 -1	; allCdnHosts
	7	[2]	GETGLOBAL	0 -7	; stringToTable
	13	[2]	SETGLOBAL	0 -6	; replaceHosts
	23	[3]	SETGLOBAL	0 -9	; cdnHost
	27	[4]	SETGLOBAL	0 -13	; replaceEof
	28	[6]	GETGLOBAL	0 -9	; cdnHost
	31	[6]	GETGLOBAL	0 -17	; valueExists
	32	[6]	GETGLOBAL	1 -1	; allCdnHosts
	33	[6]	GETGLOBAL	2 -9	; cdnHost
	38	[8]	GETGLOBAL	1 -6	; replaceHosts
	48	[9]	GETGLOBAL	8 -9	; cdnHost
	56	[13]	SETGLOBAL	8 -13	; replaceEof
	66	[21]	GETGLOBAL	5 -1	; allCdnHosts
	91	[28]	SETGLOBAL	4 -13	; replaceEof
	94	[32]	GETGLOBAL	1 -13	; replaceEof
Checking line length exceeding 80...
body_filter.lua:3:            cdnHost = ngx.var["cookie_" .. ngx.var["cdn_project"] .. "_cdn_host"]
body_filter.lua:18:                local scriptStr = "<script src='/cdn.js' type='text/javascript'></script>" ..
body_filter.lua:21:                        "getFastestHost('" .. table.concat(allCdnHosts, "', '") .. "')" ..
body_filter.lua:25:                local newStr, n, err = ngx.re.gsub(ngx.arg[1], "(</body>)", scriptStr .. "$1", "i")

Спасибо за замечание :)

А почему не Anycast?

Если я правильно понимаю, нужна автономка, а это сильно дороже.

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

Конечно, есть и минусы, например — нельзя перенаправить часть нагрузки, только всё или ничего. Нужна своя автономка, нужно пириться, нужно уметь настраивать всё это.
Мы — это компания «Колёса Крыша Маркет»
Либо мои колёса виноваты, либо у вас действительно очень смешное название, для России.
(есть у нас такой «КрепМаркет», крепёж продаёт)
Ой, простите, прочитал по диагонали и подумал что новый CDN в Казахстане называется «Колёса Крыша Маркет».
Спасибо, идея хорошая. У нас файлы размещаются аналогично, только используем мы nginx вместе с tmpfs вместо memcached.
А заливку фоток на множество серверов каким образом делаете?

Файлы храним в Ceph, отложенную репликацию между дата-центрами с активным бэкапом в AWS S3 реализовали сами на RabbiyMQ + Go

> RabbiyMQ + Go

Вместо кролика на рассмотрение: nats

Когда хранилище делали нужно было «ещё вчера», поэтому выбрали то, что умеем и знаем. К nats пока присматриваемся.

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

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

Домен один, да и данных в сравнении с фотками гораздо меньше, след. тупит тоже меньше.

Это вот этот пиксель?

Mixed Content: The page at 'https://kolesa.kz/' was loaded over HTTPS, but requested an insecure image 'http://sync-eu.exe.bid/image?source=mgid&id=h4ly0I_tPEx7'. This content should also be served over HTTPS.
Только полноправные пользователи могут оставлять комментарии.
Войдите, пожалуйста.