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

时间:2012-01-24 06:12:04

标签: configuration nginx reverse-proxy apache-zookeeper

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

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

有没有办法让nginx(或其他代理)从Apache ZooKeeper读取其配置?或更广泛的:有没有办法有效地切换代理配置?当然,它应该在没有(或最小)整个系统停机的情况下完成 - 因此重新启动nginx不是一种选择。

8 个答案:

答案 0 :(得分:42)

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

  • HUP向主进程发出信号导致“重新加载”。 Nginx启动了一堆新工作者,让老工人优雅地关闭,即他们完成现有的请求。 没有服务中断。这种配置更改方法非常轻量且快速,但几乎没有限制:您无法更改缓存区域或重新编译Perl脚本。

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

Official documentation

答案 1 :(得分:6)

请尝试Nginx-Clojure。我们可以使用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");
        }

答案 2 :(得分:2)

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

答案 3 :(得分:2)

有一个有趣的项目使用nginx Lua来动态配置nginx并完全按照自己的意愿行事(https://github.com/samalba/hipache-nginx

它是由Hipache背后的人写的。

答案 4 :(得分:2)

这可能会迟到但如果你有钱的话。 Nginx plus is exactly for you.它使用简单的网址调用来动态获取新配置。

答案 5 :(得分:2)

可以使用HAProxy及其UNIX域套接字接口:http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#9.2

它支持动态切换服务器或整个前端从下到上和后退。使用配置文件定义两组前端,每个前端都为一个特定状态配置,您将能够实现您想要的目标。

答案 6 :(得分:1)

来自Docs

nginx -s reload

-s用于“信号”,其中信号可以“退出”,“重新加载”,“重新打开”或“停止”。

答案 7 :(得分:0)

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

如果我有同样的要求,我可能会进行nodejszookeeper整合。

有几个有趣的开源项目:

node-zookeepernodejszookeeper;

集成在一起

node-http-proxy代理http服务器,可用于负载平衡。

当然,他们缺乏成熟感,但对你来说可能很有趣。