共计 2296 个字符,预计需要花费 6 分钟才能阅读完成。
上一篇博主介绍了通过module把共享数据限制在各自worker进程间,此处就讲下不同worker进程的数据如何共享
根据官方的说法,若是要在服务器范围内,即不同worker工作进程间进行数据通信,可以使用以下方式:
- 使用此模块提供的ngx.shared.DICT API。
- 仅使用单个 Nginx worker 和单个服务器(但是,当有多核 CPU 或单机中有多个 CPU 时,不建议这样做)。
- 使用 、 或 等
memcached
数据存储redis
机制。OpenResty 官方版本附带了一组配套的 Nginx 模块和 Lua 库,它们提供了与这些数据存储机制的接口。MySQL / PostgreSQL
此篇我们就记录第一种方式,第二种略,第三种我还不会emmmmm
ngx.shared.DICT
使用方式
syntax: dict = ngx.shared.DICT
syntax: dict = ngx.shared[name_var]
context: init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*, exit_worker_by_lua*, ssl_client_hello_by_lua*
使用该方式要用到另外一个方法:lua_shared_dict
syntax: lua_shared_dict <name> <size>
default: no
context: http
phase: depends on usage
该方法是用来定义一块共享内存空间,所有worker都可以使用,定义共享内存空间样例:
http {
lua_shared_dict api_counter 1m;
...
}
上面已经定义了一块共享内存空间,接下来使用ngx.share.DICT内的方法来操作这块空间
使用set方法设置key/value,使用get取除key/value
location /api/sayHi {
content_by_lua_block {
ngx.say('Hi xadocker!')
--- 调用子请求
local res = ngx.location.capture("/counter")
ngx.log(ngx.INFO,res.status,res.body)
}
}
location /counter {
# 配置为仅内部访问
internal;
content_by_lua_block {
local api_counter = ngx.shared.api_counter
local num,flag =api_counter:get("sum")
if nil == num then
api_counter:set("sum",1)
else
api_counter:set("sum",num+1)
end
ngx.say("STORED OK")
}
}
location /getCounter {
content_by_lua_block {
local api_counter = ngx.shared.api_counter
ngx.say(api_counter:get("sum"))
}
}
测试运行
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/api/sayHi
Hi xadocker!
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/api/sayHi
Hi xadocker!
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/api/sayHi
Hi xadocker!
# 内部接口,无法外部访问
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/counter
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>openresty/1.17.8.2</center>
</body>
</html>
# 获取/api/sayHi接口统计次数
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/getCounter
3
# reload也不会释放该shared空间,只有重启openresty
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/getCounter
403
[root@nginx-cluster conf.d]# openresty -s reload
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/getCounter
403
nginx.shared.DICT的方法有很多,有兴趣的读者可以参考下:
- get
- get_stale
- set
- safe_set
- add
- safe_add
- replace
- delete
- incr
- lpush
- rpush
- lpop
- rpop
- llen
- ttl
- expire
- flush_all
- flush_expired
- get_keys
- capacity
- free_space
正文完