Есть ли способ динамически настроить nginx (или другой быстрый обратный прокси-сервер)? - PullRequest
19 голосов
/ 24 января 2012

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

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

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

Ответы [ 8 ]

42 голосов
/ 24 января 2012

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

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

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

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

6 голосов
/ 14 августа 2015

Пожалуйста, попробуйте 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");
        }
2 голосов
/ 08 июля 2014

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

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

2 голосов
/ 08 июля 2014

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

2 голосов
/ 22 июля 2013

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

Он написан ребятами из Hipache.

2 голосов
/ 15 июня 2013

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

1 голос
/ 11 июня 2018

С Документы :

nginx -s reload

-s для «сигнал», где сигнал может быть «выйти», «перезагрузить», «вновь открыть» или «остановить».

0 голосов
/ 24 января 2012

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

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

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

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

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

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

...