Configuration 有没有办法动态配置nginx(或其他快速反向代理)?

Configuration 有没有办法动态配置nginx(或其他快速反向代理)?,configuration,nginx,reverse-proxy,apache-zookeeper,Configuration,Nginx,Reverse Proxy,Apache Zookeeper,假设我们有几个相同的节点,它们是某个n层服务的应用服务器。假设我们使用ApacheZooKeeper来保存分布式应用程序的所有配置。另外,我们在这个应用程序前面有一个nginx作为负载平衡器和反向代理 假设我们执行一个命令,该命令只更改节点1上的数据,并且在一段时间内节点2与节点1不同。我们希望代理将所有特殊请求(需要特定数据)重定向到node1,直到所有信息都迁移到node2,并且node2与node1具有相同的数据 有没有办法让nginx(或其他代理)从apachezookeeper读取其配

假设我们有几个相同的节点,它们是某个n层服务的应用服务器。假设我们使用ApacheZooKeeper来保存分布式应用程序的所有配置。另外,我们在这个应用程序前面有一个nginx作为负载平衡器和反向代理

假设我们执行一个命令,该命令只更改节点1上的数据,并且在一段时间内节点2与节点1不同。我们希望代理将所有特殊请求(需要特定数据)重定向到node1,直到所有信息都迁移到node2,并且node2与node1具有相同的数据


有没有办法让nginx(或其他代理)从apachezookeeper读取其配置?或者更广泛:是否有任何方法可以有效地动态切换代理配置?当然,这应该在整个系统不停机的情况下(或以最小的停机时间)完成-因此重新启动nginx不是选项。

不确定是否可以在不重新启动服务器的情况下动态更改
nginx
配置

如果我有同样的需求,我可能会深入研究
nodejs
zookeeper
集成

有几个有趣的开源项目:

nodejs
zookeeper
集成

可用于负载平衡的代理http服务器


当然,它们还不够成熟,但您可能会对它们感兴趣。

Nginx有两种更改配置的方法:

  • HUP
    主进程的信号导致“重新加载”。Nginx启动一组新的工作进程,并允许旧的工作进程优雅地关闭,即完成现有的请求。没有服务中断。这种配置更改方法非常轻量级和快速,但几乎没有限制:不能更改缓存区域或重新编译Perl脚本

  • USR2
    信号,然后
    WINCH
    然后
    QUIT
    到主进程,结果是“可执行升级”,此序列允许完全重新读取整个配置,甚至升级Nginx可执行文件。它也会重新加载磁盘缓存(这可能很耗时)。此方法也会导致服务中断


作为更新:将其主机配置存储在redis中,可在运行时轻松操作。它还基于node.js和node http proxy。

有一个有趣的项目,它使用nginx Lua来允许动态配置nginx,并完全按照您的意愿执行()


这是Hipache背后的人写的。

这可能会很晚,但如果你有钱的话。它使用一个简单的url调用动态获取新配置。

可以使用HAProxy及其UNIX域套接字接口:

它支持动态地将服务器或整个前端从下向上再向后切换。有了一个定义了两组前端的配置文件,每个前端配置为一种特定状态,您就可以实现您想要的功能。

请尝试。我们可以使用clojure/java/groovy重写处理程序访问zookeeper,然后更新一些nginx变量以动态更改代理目标。e、 g

在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");
        }
公共静态类MyRewriteHandler实现NginxJavaRingHandler{
@凌驾
公共对象[]调用(映射请求){
//访问动物园管理员
...............
//更改nginx变量mytarget
((NginxJavaRequest)request).setVaraible(“mytarget”http://some-host-or-url");
}
来自:


-s
代表“信号”,其中信号可以是“退出”、“重新加载”、“重新打开”或“停止”。

Thanx!非常有趣的想法,我来看看。有可能:
nginx-reload
httpd
RewriteMap
指令使用数据库/文件映射谢谢!我对nginx还不是很在行,你给了我一条很好的信息nk about.这应该是官方的回答,直到信息完全迁移到给定的节点,你能从该节点返回5xx代码吗?单个实例每年1900美元。
nginx -s reload