V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hokerlinux
V2EX  ›  程序员

求助各路大神,想开发一个 nginx 模块动态从 zookeeper 获取配置参数,应该采用什么模块

  •  
  •   hokerlinux · 2017-01-10 08:49:38 +08:00 · 5165 次点击
    这是一个创建于 2876 天前的主题,其中的信息可能已经有所发展或是发生改变。
    求助各路大神,想开发一个 nginx 模块动态从 zookeeper 获取配置参数,应该采用什么模块开发, upstream ? event ?有什么可以参考的模块程序例子
    31 条回复    2017-01-11 14:43:14 +08:00
    Powered
        1
    Powered  
       2017-01-10 08:57:18 +08:00 via iPhone
    给出一个自己的方案。

    java 先解析 nginx 的 conf ,监听 zookeeper ,动态修改 conf 文件。

    也就是利用了 zookeeper 自带的通知功能,用 java 桥接了 zookeeper 和 nginx 配置文件。
    gaodq
        2
    gaodq  
       2017-01-10 09:05:38 +08:00
    可以试一下 QConf , https://github.com/Qihoo360/Qconf ,一个分布式配置管理系统
    hokerlinux
        3
    hokerlinux  
    OP
       2017-01-10 09:06:51 +08:00
    @Powered 感谢您的回复,但我还是想用最直接方式去做,不然我就用 bash shell 了,而且我只会 c 不会 java
    hokerlinux
        4
    hokerlinux  
    OP
       2017-01-10 09:12:06 +08:00
    @gaodq 感谢回复,其实我是想实现 后台 http 的 API 注册, nginx 发现该 API ,并及时更新 upstrem ,是不是有点异想天开^^
    gaodq
        5
    gaodq  
       2017-01-10 09:15:07 +08:00
    @hokerlinux 没太看明白 2333 , QConf 是从 zookeeper 动态获取配置,然后对外提供接口获取最新配置,感觉跟你需求有点像就推荐了:)
    hokerlinux
        6
    hokerlinux  
    OP
       2017-01-10 09:15:12 +08:00
    主要是看到国外有人这么做,想挑战一下,提升技能,一直想了解 nginx 开发,再一个跟上级承诺了,囧
    hokerlinux
        7
    hokerlinux  
    OP
       2017-01-10 09:17:12 +08:00
    @gaodq 仍然感谢
    defunct9
        8
    defunct9  
       2017-01-10 09:22:00 +08:00
    有用 kazoo 、 java 的, c 写就比较重了,因为本身 zookeeper 是 Java 的。且这个场景不太适合,你写就明白了。得在 zookeeper 上挂钩子,还需要动态更新 nginx
    bzzhou
        9
    bzzhou  
       2017-01-10 09:28:04 +08:00
    赞同 @Powered 的方案,可以参考 consul2template ,非常简单可靠
    直接在 nginx 内部实现,要考虑的细节就会多很多,从工程收益来说,不划算。
    cloverstd
        10
    cloverstd  
       2017-01-10 09:30:01 +08:00 via iPhone
    指个歪路,可以参考 bamboo
    hokerlinux
        11
    hokerlinux  
    OP
       2017-01-10 09:30:16 +08:00
    @defunct9 感谢回复,我已经了解了一些, zookeeper 有 c 语言的客户端 API ,并写了简单的 c 的测试程序,利用它的这个 API , c 写起来也不是很麻烦,只是看怎么把这个客户端程序融合为 nginx 的模块
    Allianzcortex
        12
    Allianzcortex  
       2017-01-10 09:31:01 +08:00
    内部用 bash 来调自带的四字命令?
    hokerlinux
        13
    hokerlinux  
    OP
       2017-01-10 09:33:47 +08:00
    @bzzhou @cloverstd 谢谢,我去了解一下
    hokerlinux
        14
    hokerlinux  
    OP
       2017-01-10 09:37:12 +08:00
    janxin
        15
    janxin  
       2017-01-10 09:43:52 +08:00
    nginx plus 提供微服务动态管理功能吧,这类肯定可以实现的
    hokerlinux
        16
    hokerlinux  
    OP
       2017-01-10 09:46:56 +08:00
    @janxin 感谢回复,正是看到 nginx plus 可以实现又要收费,才想自己实现的,但自己又没做过 nginx 的开发
    rrfeng
        17
    rrfeng  
       2017-01-10 09:55:33 +08:00 via Android
    这个要看什么配置参数。

    upstream 的话有一大把方案,但是基于 zk 的比较少。

    很多其他配置并没有 Nginx API 可以修改所以不能动态。

    我有一个 etcd 的你要不要试试
    djx339
        18
    djx339  
       2017-01-10 10:02:41 +08:00
    推荐 confd, 写个配置文件和模板就能满足你的需求, 可以参考 https://github.com/kelseyhightower/confd/blob/master/docs/quick-start-guide.md#create-template-resources
    dndx
        19
    dndx  
       2017-01-10 10:04:41 +08:00 via iPhone
    OpenResty + balancer_by_lua 基本可以达到你的要求。
    hokerlinux
        20
    hokerlinux  
    OP
       2017-01-10 10:06:47 +08:00
    @rrfeng 主要是用于发现需要反向代理的 http API ,即 upstrem 的那些地址,这些后台也会注册自己的接口,如果方便,发一份 etcd 的实现到 [email protected] ,我参考一下,非常感谢 :)
    hokerlinux
        21
    hokerlinux  
    OP
       2017-01-10 10:12:12 +08:00
    @djx339 @dndx 谢谢,我去了解一下
    hokerlinux
        22
    hokerlinux  
    OP
       2017-01-10 10:16:15 +08:00
    @rrfeng 请问 upstrem 配置的后台地址可以动态修改吗?
    hokerlinux
        23
    hokerlinux  
    OP
       2017-01-10 10:17:43 +08:00
    @rrfeng 哦,看懂了,你的意思是可以得
    mingyi0
        24
    mingyi0  
       2017-01-10 10:25:03 +08:00
    可以看看 nginx upsync
    hokerlinux
        25
    hokerlinux  
    OP
       2017-01-10 10:35:33 +08:00
    @mingyi0 好的,谢谢
    rrfeng
        26
    rrfeng  
       2017-01-10 14:31:38 +08:00   ❤️ 1
    https://github.com/rrfeng/lua-resty-upstream-etcd

    在重写,所以这个目前还没用
    hokerlinux
        27
    hokerlinux  
    OP
       2017-01-10 14:46:25 +08:00
    @rrfeng 嗯,主要是向高手学习 :)
    lgpqdwjh
        28
    lgpqdwjh  
       2017-01-10 16:24:36 +08:00
    nginx 自己更新自己, 这个恐怕有点艰难, 可行性我还没有尝试过。

    我这边是外建一个 register 负责处理注册请求, 有点像 confd , 但有损耗, 需要 kill -HUB,

    不过我负责注册的请求时分布式的, 不影响业务, 目前也在想办法解决这样的问题。 关注。
    fengjianxinghun
        29
    fengjianxinghun  
       2017-01-10 16:30:09 +08:00
    openresty
    hermer
        30
    hermer  
       2017-01-10 17:35:55 +08:00
    同意 29 楼 ,用 lua
    hokerlinux
        31
    hokerlinux  
    OP
       2017-01-11 14:43:14 +08:00
    @lgpqdwjh nginx 已经有模块实现这样的功能 nginx upsync module
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1174 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:02 · PVG 07:02 · LAX 15:02 · JFK 18:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.