Configuration 有没有办法动态配置nginx(或其他快速反向代理)?
假设我们有几个相同的节点,它们是某个n层服务的应用服务器。假设我们使用ApacheZooKeeper来保存分布式应用程序的所有配置。另外,我们在这个应用程序前面有一个nginx作为负载平衡器和反向代理 假设我们执行一个命令,该命令只更改节点1上的数据,并且在一段时间内节点2与节点1不同。我们希望代理将所有特殊请求(需要特定数据)重定向到node1,直到所有信息都迁移到node2,并且node2与node1具有相同的数据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读取其配
有没有办法让nginx(或其他代理)从apachezookeeper读取其配置?或者更广泛:是否有任何方法可以有效地动态切换代理配置?当然,这应该在整个系统不停机的情况下(或以最小的停机时间)完成-因此重新启动nginx不是选项。不确定是否可以在不重新启动服务器的情况下动态更改
nginx
配置
如果我有同样的需求,我可能会深入研究nodejs
和zookeeper
集成
有几个有趣的开源项目:
将nodejs
与zookeeper
集成
可用于负载平衡的代理http服务器
当然,它们还不够成熟,但您可能会对它们感兴趣。Nginx有两种更改配置的方法:
主进程的信号导致“重新加载”。Nginx启动一组新的工作进程,并允许旧的工作进程优雅地关闭,即完成现有的请求。没有服务中断。这种配置更改方法非常轻量级和快速,但几乎没有限制:不能更改缓存区域或重新编译Perl脚本HUP
信号,然后USR2
然后WINCH
到主进程,结果是“可执行升级”,此序列允许完全重新读取整个配置,甚至升级Nginx可执行文件。它也会重新加载磁盘缓存(这可能很耗时)。此方法也会导致无服务中断QUIT
作为更新:将其主机配置存储在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
httpdRewriteMap
指令使用数据库/文件映射谢谢!我对nginx还不是很在行,你给了我一条很好的信息nk about.这应该是官方的回答,直到信息完全迁移到给定的节点,你能从该节点返回5xx代码吗?单个实例每年1900美元。
nginx -s reload