25

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

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

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

4

8 回答 8

49

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

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

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

官方文档

于 2012-01-24T14:46:11.747 回答
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;
}

在 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");
        }
于 2015-08-14T02:31:37.867 回答
3

这可能会迟到,但如果你有钱的话。Nginx plus 正是为你准备的。它使用一个简单的 url 调用来动态获取新的配置。

于 2014-07-08T14:56:44.687 回答
2

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

于 2013-06-15T08:51:01.303 回答
2

有一个有趣的项目使用 nginx Lua 允许动态配置 nginx 并完全按照您的意愿进行操作(https://github.com/samalba/hipache-nginx

它是由 Hipache 背后的人编写的。

于 2013-07-22T17:29:01.993 回答
2

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

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

于 2014-07-08T15:13:23.507 回答
0

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

如果我有相同的要求,我可能会深入研究nodejszookeeper集成。

有几个有趣的开源项目:

node- zookeeper与nodejs;zookeeper

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

当然,它们缺乏成熟度,但它们可能对您来说很有趣。

于 2012-01-24T08:54:11.457 回答
0

文档

nginx -s reload

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

于 2018-06-11T10:58:32.087 回答