假设我们有几个相同的节点,它们是某些n层服务的应用服务器。假设我们使用Apache ZooKeeper来保留我们分布式应用程序的所有配置。另外,我们在此应用程序前面有一个nginx作为负载均衡器和反向代理。
因此,假设我们执行的命令仅在node1上更改数据,并且在某段时间内,node2与node1不同。我们希望代理将所有特殊请求(需要特定数据)重定向到node1,直到所有信息都迁移到node2,而node2与node1具有相同的数据。
有没有办法让nginx(或其他代理)从Apache ZooKeeper读取其配置?或更广泛的:有没有办法有效地切换代理配置?当然,它应该在没有(或最小)整个系统停机的情况下完成 - 因此重新启动nginx不是一种选择。
答案 0 :(得分:42)
Nginx有两种更改配置的方法:
HUP
向主进程发出信号导致“重新加载”。 Nginx启动了一堆新工作者,让老工人优雅地关闭,即他们完成现有的请求。 没有服务中断。这种配置更改方法非常轻量且快速,但几乎没有限制:您无法更改缓存区域或重新编译Perl脚本。
USR2
信号,然后WINCH
然后QUIT
到主进程导致“可执行升级”,这个序列让我们完全重新读取整个配置,甚至升级Nginx可执行文件。它也重新加载磁盘缓存(这可能很耗时)。此方法也会导致服务中断 no 。
答案 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)
答案 7 :(得分:0)
不确定是否可以在不重新启动服务器的情况下动态更改nginx
配置。
如果我有同样的要求,我可能会进行nodejs
和zookeeper
整合。
有几个有趣的开源项目:
node-zookeeper将nodejs
与zookeeper
;
node-http-proxy代理http服务器,可用于负载平衡。
当然,他们缺乏成熟感,但对你来说可能很有趣。