LINUX.ORG.RU

NginX и балансировка в статических html — закат Солнца вручную?

 ,


1

1

Задача — перевод картинок сайта на IPFS. Прописать в статическом html в качестве гейта gateway.ipfs.io — некорректно. Создание высокой нагрузки на чужой ресурс и, вообще, некомильфо. Прописать один свой сервер — во многом теряется смысл IPFS. Проще отдавать сразу статику тогда. Хочется прописать N разных внешних серверов-гейтов, и дёргать, распределив нагрузку. Список серверов не фиксированный, поскольку могут добавляться новые, какие-то могут падать.

Поэтому видится такое решение. Прописываем в статике, пусть тот же gateway.ipfs.io как fallback. А при отдаче nginx'ом меняем этот хост на свои. Для фиксированной замены — нет вопросов. ngx_http_sub_module и всё. Но нужно распределение. Т.е. нужно менять на рэндомный сервер из списка.

Вопрос, как в nginx записать в строку случайное значение из списка?

Очевидно, в голову приходит посмотреть на perl/lua модули. Но это сильно снижает смысл работы с nginx, тогда уже можно тупо на PHP сделать отдачу статики его средствами. Ну, или хотя бы Golang.

Есть ли вариант, как это сделать в nginx?

Или, может, есть какое-то радикально иное решение задачи?

★★★★★

чем тебе претит использование lua ? А так можеь свой модуль написать под nginx - он пишется с полпинка

Jopich
()

Помнится, писал для похожей задачи скрипт на баше. Если найду, скину

anonymous
()

Когда-то натыкался на модуль, кажется назывался он рандом_пейдж_модуль, но он емнип только разные страницы умел отдавать на один запрос, хотя если я тебя праильно понял то твою задачу так вполне можно решить.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

хотя если я тебя праильно понял то твою задачу так вполне можно решить

Не, это не годится. Страниц — сотни тысяч на десяток гигабайт.

KRoN73 ★★★★★
() автор топика

Заинклюдить или сослаться на js, в котором будет этот список. Пусть клиент сам выбирает, хоть рандомный, хоть по близости

Второй вариант: round-robin dns

disarmer ★★★
()

Я бы попробовал решить эту задачу с помощью JavaScript на странице. Страница грузится, срабатывает JavaScript, который подгружает список серверов с картинками и пытается с них стянуть картинки, перебирая сервера в нужном (произвольном) порядке.

chimera19
()
Ответ на: комментарий от disarmer

Заинклюдить или сослаться на js

Или fallback не получится сделать, т.к. придётся фейковые адреса прописывать, или браузер уже начнёт загрузку с прописанных адресов, пока JS после инициации страницы стартует, или JS будет блокировать загрузку страницы и параллельность. Все три варианта — плохие.

Второй вариант: round-robin dns

Базовый домен — фиксирован. И он чужой :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от disarmer

Второй вариант: round-robin dns

Этот вариант уже давно не очень то работает. С появлением IPv6 вся выдача адресов сортируется на клиенте (даже, если DNS сервер выдал адреса в случайном порядке), а так как настройки сортировки у всех по умолчанию, то и сортируется одинаково. Я это к тому, что нужно понимать, что round-robin работает совсем не рандомно.

chimera19
()

Гы. Такая же в точности задача и с ZeroNet-ресурсами :) Сейчас смотрю кучку mp4, хочу ими поделиться — и возникает такая же задача разгрузки гейтов/прокси.

...

Есть, конечно, вариант — класть в IPFS сразу страницы (раз уже итак статические) и адресовать ресурсы тупо относительно корня сайта... Но это задача перехода на IPFS сильно усложняется, вместо простой подмены URL нужно городить всю работу сайта с IPFS...

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Базовый домен — фиксирован. И он чужой :)

Можно ведь указать любой домен для статики, на котором и будет RRDNS. Например ipfs.balancer.ru, который будет отдавать в случайном порядке все шлюзы. Надо проверить конечно, что они будут работать с твоим Host в запросе

disarmer ★★★
()
Ответ на: комментарий от chimera19

С появлением IPv6 вся выдача адресов сортируется на клиенте

Это где такое? Нашёл RFC 3484, но он только для ipv6.

С ip4 насколько я знаю, такие проблемы были только с непопулярными версиями винды: https://blogs.technet.microsoft.com/networking/2009/04/17/dns-round-robin-and...

disarmer ★★★
()
Ответ на: комментарий от disarmer

Можно ведь указать любой домен для статики

С учётом того, что в теории статика может пережить домен, а базовый домен заявлен в рекомендациях и его подменяет, например, браузерный плагин на локалхостовый, хочется иметь именно стандартный базовый домен :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от disarmer

Это где такое? Нашёл RFC 3484, но он только для ipv6.

Можно начать читать отсюда https://habrahabr.ru/company/centosadmin/blog/282638/ (чуть чуть промотать до «DNS Round Robin has never been an effective means of load-balancing, and is less so today, as applications switch from gethostbyname to getaddrinfo for IPv6 support:», где начнутся ссылки, например, сюда https://daniel.haxx.se/blog/2012/01/03/getaddrinfo-with-round-robin-dns-and-h...

Я сам особо не вникал (в смысле чтения RFC, настройки gai.conf и проведения собственных экспериментов), но суть в том, что с появлением IPv6, появился getaddrinfo() вместо gethostbyname(), поэтому round robin работает совсем не так, как многим хочется, и от него отказываются (например Google DNS 8.8.8.8, который у всех либо по умолчанию, либо как fallback).

chimera19
()

Сделай upstream в nginx и распредели по weight чем это не подходит? Это заодно и от назойливых проблем с CORS лишит.

anonymous_sama ★★★★★
()

как в nginx записать в строку случайное значение из списка?

http {
    server {
        listen 127.0.0.1:15001;
        location / {
            proxy_pass http://example.org/;
            sub_filter что-менять replacement1;
            sub_filter_once off;
        }
    }

    server {
        listen 127.0.0.1:15002;
        location / {
            proxy_pass http://example.org/;
            sub_filter что-менять replacement2;
            sub_filter_once off;
        }
    }

    server {
        listen 127.0.0.1:15003;
        location / {
            proxy_pass http://example.org/;
            sub_filter что-менять replacement3;
            sub_filter_once off;
        }
    }

    upstream backend_proxy {
        least_conn;
        server 127.0.0.1:15001;
        server 127.0.0.1:15002;
        server 127.0.0.1:15003;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend_proxy/;
        }
    }
}
i-rinat ★★★★★
()
Ответ на: комментарий от KRoN73

А ты тот lua в nginx бенчмаркал? Он вроде толком не просаживает производительность

MrClon ★★★★★
()
Ответ на: комментарий от chimera19

УМР, ЧЯДНТ?

$ host ya.ru 8.8.8.8 | grep 'has address'
ya.ru has address 93.158.134.3
ya.ru has address 213.180.193.3
ya.ru has address 213.180.204.3
$ host ya.ru 8.8.8.8 | grep 'has address'
ya.ru has address 213.180.204.3
ya.ru has address 213.180.193.3
ya.ru has address 93.158.134.3

MrClon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.