openresty大名如雷贯耳,有着活跃的社区和广泛的用户。它借助强大的nginx和lua语言,构建了轻巧但是性能强大的web技术栈。
这两天开始认真关注起这个项目来,在github下载源码并且运行了试试,觉得不错。本人以https://github.com/agentzh/lua-resty-balancer这个项目为例,介绍怎么使用openresty进行一致性hash的负载均衡
流程图:
其中nginx1和nginx2指的是我在mac上按照不同的配置文件启动了两个nginx,其中监听8001端口nginx1的为服务入口,特别说明下这个nginx1是openresty提供的nginx,因为我们需要使用chash的库;而nginx2:8080则为普通的nginx,它和apache:80都是充当后端服务器的角色。
编译chash.so
openresty不包含lua-resty-balancer
这个项目,所以需要自己编译然后生成so文件。
clone下载代码,然后修改Makefile,设置lua的目录。其中在macOS上编译,要修改CFLAGS增加-Du_char="unsigned char"
|
|
之后make会生成so文件。
启动入口nginx
安装openresty就不说了,网上有很多教程。启动8001端口的nginx1。配置文件如下,其中lua_package_path和lua_package_cpath为加载chash的库so和lua文件,这个视读者自身的目录自己修改。
|
|
其中,server监听8001端口,并且把请求转发给后端。
注意chash_up:find(ngx.var.arg_key)
这一句,把ngx.var.arg_key
作为hashkey,它是nginx解析的,如果url为?key=helloworld
则arg_key
为helloworld
。
启动后端
其中8080的nginx和80端口的apache不用太多说明。
nginx:8080
|
|
apache:80是默认的apache配置文件,没有任何修改。
测试
把nginx1、nginx2、apache启动后。
在浏览器输入localhost:8001
,此时arg_key
为nil:
在浏览器输入localhost:8001?key=hello
,此时arg_key
为'hello'
:
上面表示我们的负载均衡已经完成了。
总结
整个流程不算复杂,周末下雨,在家中就搞了搞权当消遣。昨天在公司看了@agentzh在某一个nginx大会上分享OR技术栈,觉得春哥真的是很喜欢这一行,并且分享的时候大部分时间是带着微笑的,让人感觉技术人员的自信和平和。