Есть ли способ настроить nginx (или другой быстрый обратный прокси) динамически?
Предположим, что у нас есть несколько одинаковых узлов, которые являются серверами приложений некоторой службы n-уровня. И предположим, что мы используем Apache ZooKeeper, чтобы сохранить всю конфигурацию нашего распределенного приложения. Кроме того, у нас есть nginx в качестве балансировщика нагрузки и обратного прокси-сервера перед этим приложением.
Итак, скажем, мы выполняем команду, которая изменяет данные только на node1, и на некоторый период времени node2 отличается от node1. И мы хотим, чтобы прокси перенаправлял все специальные запросы (которые нуждаются в данных конкретных данных) на узел1 до тех пор, пока вся информация не переместилась на узел2, а node2 не будет иметь те же данные, что и node1.
Есть ли способ сделать nginx (или другой прокси) читать его конфигурацию из Apache ZooKeeper? Или более шире: есть ли способ эффективно переключаться на прокси-конфигурацию на лету? И, конечно же, это должно быть сделано без (или с минимальным) простоем всей системы - поэтому перезапуск nginx не является вариантом.
Ответы
Ответ 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, который можно использовать для балансировки нагрузки.
Конечно, им не хватает зрелости, но они могут быть интересны для вас.