Подтвердить что ты не робот

Есть ли способ настроить nginx (или другой быстрый обратный прокси) динамически?

Предположим, что у нас есть несколько одинаковых узлов, которые являются серверами приложений некоторой службы n-уровня. И предположим, что мы используем Apache ZooKeeper, чтобы сохранить всю конфигурацию нашего распределенного приложения. Кроме того, у нас есть nginx в качестве балансировщика нагрузки и обратного прокси-сервера перед этим приложением.

Итак, скажем, мы выполняем команду, которая изменяет данные только на node1, и на некоторый период времени node2 отличается от node1. И мы хотим, чтобы прокси перенаправлял все специальные запросы (которые нуждаются в данных конкретных данных) на узел1 до тех пор, пока вся информация не переместилась на узел2, а node2 не будет иметь те же данные, что и node1.

Есть ли способ сделать nginx (или другой прокси) читать его конфигурацию из Apache ZooKeeper? Или более шире: есть ли способ эффективно переключаться на прокси-конфигурацию на лету? И, конечно же, это должно быть сделано без (или с минимальным) простоем всей системы - поэтому перезапуск nginx не является вариантом.

4b9b3361

Ответ 1

Nginx имеет два способа изменения конфигурации:

  • HUP Сигнал к основному процессу приводит к "перезагрузке". Nginx начинает кучу новых работников и позволяет старым работникам законно закрываться, то есть заканчивать существующие запросы. Существует нет прерывание обслуживания. Этот способ изменения конфигурации очень легкий и быстрый, но имеет несколько ограничений: вы не можете изменять зоны кэша или перекомпилировать скрипты Perl.

  • USR2, затем WINCH, а затем QUIT к основному процессу приведет к "исполняемому обновлению", и эта последовательность позволяет полностью перечитать всю конфигурацию и даже обновить исполняемый файл Nginx. Он также перезагружает дисковые кэши (что может занять много времени). Этот метод приводит к прерыванию службы no.

Официальная документация

Ответ 2

Попробуйте Nginx-Clojure. Мы можем использовать обработчик перезаписи clojure/java/groovy для доступа к zookeeper, а затем обновить некоторые nginx-переменные для динамического изменения прокси-сервера. например.

В nginx.conf

set $mytarget "";

location / {
   rewrite_handler_type java;
   ## We will change $mytarget in MyRewriteHandler
   rewrite_handler_name my.MyRewriteHandler;
   proxy_pass $mytarget;
}

В MyRewriteHandler.java

public static class MyRewriteHandler implements NginxJavaRingHandler {

        @Override
        public Object[] invoke(Map<String, Object> request) {
           //access zookeeper
           ...............
           //change nginx variable mytarget
           ((NginxJavaRequest)request).setVaraible("mytarget", "http://some-host-or-url");
        }

Ответ 3

Как обновление: Hipache хранит конфигурацию своего хоста в redis, что легко можно манипулировать во время выполнения. Он также основан на node.js и node -http-proxy.

Ответ 4

Возможно использование HAProxy и его интерфейса сокета домена UNIX: http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#9.2.

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

Ответ 5

Есть интересный проект с использованием nginx Lua, который позволяет динамически настраивать nginx и делать именно то, что вы хотите (https://github.com/samalba/hipache-nginx)

Это написано ребятами из-за Хипаче.

Ответ 6

Это может быть поздно, но если у вас есть деньги. Nginx plus именно для вас. Он использует простой URL-адрес для получения новых конфигураций "на лету".

Ответ 7

Не уверен, что можно динамически изменить конфигурацию nginx без перезапуска сервера.

Если бы у меня было такое же требование, я бы, вероятно, вникнул в интеграцию nodejs и zookeeper.

Существует несколько интересных проектов с открытым исходным кодом:

node-zookeeper объединяет nodejs с zookeeper;

node-http-proxy прокси-сервер HTTP, который можно использовать для балансировки нагрузки.

Конечно, им не хватает зрелости, но они могут быть интересны для вас.