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

Dim*_*ima 19 configuration reverse-proxy nginx apache-zookeeper

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

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

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

Ale*_*rov 42

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

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

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

官方文件


xfe*_*eep 6

请尝试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;
}
Run Code Online (Sandbox Code Playgroud)

在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");
        }
Run Code Online (Sandbox Code Playgroud)