ZeroNet Blogs

Static ZeroNet blogs mirror

Закат солнца вручную. Георепликация и Round Robin (черновик)

- Posted in Infonesy.Blog by

У нас было 2 мешка травы, 75 таблеток мескалина, 5 марок мощнейшей кислоты, полсолонки кокаина и гора возбудителей, успокоительных и всего такого, всех цветов, а ещё литр текилы, литр рома, ящик пива, пол-литра эфира и две дюжины амила. Не то, чтобы это всё было нужно в поездке, но раз начал коллекционировать наркоту, то иди в своём увлечении до конца. Единственное, что меня беспокоило — это эфир. В мире нет никого более беспомощного, безответственного и безнравственного, чем человек в эфирном запое. И я знал, что довольно скоро мы в это окунёмся.

Как я ранее писал, разочарование в IPFS заставило искать иные способы георепликации. Плюс к этому — глюки Cloudflare, из-за которых пришлось отказаться от их кеширования, что привело к росту нагрузки на сервер и необходимости растаскивать нагрузку по нескольким серверам. Очевидное решение — Round Robin DNS. Но вылезает несколько мелких проблем:

  • Файлы, которые аплоадятся только на одну ноду, не появляются мгновенно на других при использовании любых средств синхронизации.
  • Автоматика получения и обновления сертификатов Let's Encrypt на Round Robin начинает буксовать.

Итак, у нас было три сервера:


  • Быстрый, основной, на Hetzner, с древними HDD, которых не хватает на высокую нагрузку
  • Быстрый, новый, на Scaleway. С SSD, но с малым объёмом диска, куда все аттачи тупо не влезут.
  • Тормозной, очень медленный VPS у Time4VPS, но с самым дешёвым терабайтом места.

​​​​​​​тут я замечу, что это [пока ещё?] не статья с точными инструкциями, а что-то типа блог-записи с мыслями. Может быть, со временем, доведу и до уровня статьи.

Задача.

Это позволит раскидать нагрузку по разным серверам и задействовать Round Robin DNS, когда одному доменному имени отвечают несколько IP.

Это решается, конечно, элементарно. Например, на NginX:

location ~ ^/forums/attaches/(\w\w/\w\w.*)$ {
    rewrite ^/forums/attaches/(\w\w/\w\w.*)$ <https://archive.attaches.forums.a0z.ru/$1> permanent;
}

location ~ ^/forums/attaches/((\d\d\d\d).*)$ {
    rewrite ^/forums/attaches/(\d\d\d\d)/(.+)$ <https://$1.f.a0z.ru/$2> permanent;
}

Вот дальше было хитрее.

Во-первых, синхронизация файлов между серверами. Я задействовал для этого Syncthing. Хотя он и тормозит при пересканировании, но его можно поставить очень редким (оставив свежее обновление по syncthing-inotify).

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

Это проблему я решил NginX-проксированием на вторичных серверах. Если файл существует, то он показывается. Если нет, то идёт прокси-запрос к мастер-серверу:

server_name 2018.f.a0z.ru;
location / {
# ...
    try_files $uri @htz;
}

location @htz {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass <http://htz.wrk.ru;>
}

# ...

Таким образом, с любого вторичного сервера файл доступе даже когда синхронизация ещё не произошла.

Дальше — вопрос сертификата Let's Encrypt при использовании Round Robin DNS. Тут пришлось много возиться и экспериментировать. Я опущу все промежуточные проблемы и эксперименты и поделюсь итоговым решением.

На всех вторичных серверах нужно направить запросы с подкаталогу /.well-known/acme-challenge на мастер-сервер:

location /.well-known/acme-challenge/ {
    proxy_set_header    Host                $host;
    proxy_pass          <http://htz.wrk.ru;>
}

На мастер-сервере отправляем отдачу этого подкаталога из конкретного места сервера:

location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root /var/www/html/letsencrypt;
}

Прописываем этот путь в настройках /etc/letsencrypt/cli.ini:

authenticator = webroot
webroot-path = /var/www/html/letsencrypt
post-hook = service nginx reload
text = True

Также там же жёстко прописываем плагин аутентификации по умолчанию (webroot). Нужно убедиться, что данный каталог нормально отдаётся со вторичных серверов. Потом можно получать сертификаты:

./certbot-auto certonly -d 2016.f.a0z.ru

(продолжение следует)

Comments