openresty+redis实践记录
安装
openresty安装
详见 openresty安装
redis安装
执行如下命令:
sudo apt-get update
sudo apt-get install redis-server
redis启动
执行如下命令:
redis-server /etc/redis/redis-master.conf
如需启动redis slave,只需把原有配置修改如下几行即可。
slaveof 192.168.1.1 7648
slave-priority 100
slave-read-only yes
slave-serve-stale-data yes
openresty启动
执行如下命令:
root@bj94:/usr/local/openresty/nginx# pwd
/usr/local/openresty/nginx
root@bj94:/usr/local/openresty/nginx# ./sbin/nginx -p `pwd` -c conf/nginx.conf
nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/local/openresty/nginx/conf/nginx.conf:29
root@bj94:/usr/local/openresty/nginx#
常用命令
redis
命令 | 描述 |
---|---|
DBSIZE | 返回当前数据里面keys的数量 |
编写API
根据项目要求编写openresty+lua的增删改查API接口。
测试
发送请求
使用curl命令发送http json请求:
- 先写请求json
root@bj94:~/dr302client# cat add.json {
“www.example.com”: {
"sub\_domain": "@", "record\_type": "CNAME", "record\_line": "all", "record\_line\_id": "00000000", "value": "all.china.qiniu.qnydns.com", "mx": 1, "ttl": 86400, "status": "enable", "weight": 100 }
}
执行命令:
curl -i -H ‘content-type: application/json’ -X POST -d @add.json http://dev.mgrconfig.api.qiniudns.com/qiniu/dr302/records/add
回复响应
根据不同返回码表示操作结果。
root@bj94:~/dr302client# curl -i -H ‘content-type: application/json’ -X POST -d @addA.json http://dev.mgrconfig.api.qiniudns.com/qiniu/dr302/records/add
HTTP/1.1 200 OK Date: Thu, 09 Mar 2017 03:01:17 GMT Content-Type: text/plain Transfer-Encoding: chunked Connection: keep-alive Server: DR302-MGR
{ “status”:{ “created_at”:“2017-03-09 11:01:17”, “code”:0, “message”:“success” }, “record”:{ “status”:“enable”, “key”:“www.example.com#all”, “name”:“@” } }
查看存储
执行命令:
(echo "select 10"; echo "hgetall www.example.com#all") | redis-cli -a cdnfusion -p 7648"
避免中文乱码,加–raw选项:
(echo "select 10"; echo "hgetall www.example.com#all") | redis-cli -a cdnfusion -p 7648 --raw
显示如下:
root@bj94:~/dr302client# (echo “select 10”; echo “hgetall www.example.com#all”) | redis-cli -a cdnfusion -p 7648 OK 1. “weight” 2. “20” 3. “record_type” 4. “A” 5. “record_line” 6. “all” 7. “status” 8. “enable” 9. “mx” 10. “1” 11. “value” 12. “1.1.1.1#10|2.2.2.2#20” 13. “ttl” 14. “86400” 15. “record_line_id” 16. “00000000” 17. “sub_domain” 18. “@”
302测试
请求
curl http://192.168.92.94:8302/ -H "host: www.example.com"
响应
响应如下:
root@bj94:~/dr302client# curl http://192.168.92.94:8302/ -H “host: www.example.com” -v * Trying 192.168.92.94… * Connected to 192.168.92.94 (192.168.92.94) port 8302 (#0) > GET / HTTP/1.1 > host: www.example.com > User-Agent: curl/7.47.0 > Accept: / > < HTTP/1.1 302 Moved Temporarily < Date: Fri, 07 Apr 2017 02:30:50 GMT < Content-Type: text/html < Content-Length: 167 < Connection: keep-alive < Server: DR302-NODE < Location: http://2.2.2.2/www.example.com/ <
302 Found
性能测试
使用ab测试DR302服务器的性能。
测试步骤
1) 由于ab不支持参数修改HOST字段,需把要测试的域名IP对设置到/etc/hosts中。如: 192.168.92.94 www.example.com 1. ab测试输出信息,查看项“ Requests per second”。 a) 带有keepalive的性能为80000QPS。 ab -kc 1024 -n 1000000 http://www.example.com:8302/ b) 不带keepalive的性能为16000QPS。 ab -c 1024 -n 1000000 http://www.example.com:8302/
优化点
关闭日志记录
access_log off; error_log /usr/local/openresty/nginx/logs/dr302_node_error.log error;
打开缓存 把nginx.conf里的这行打开或加上。 lua_code_cache on;
3)使用ulimit -n 65535设置open files数。 1. 设置nginx的进程数与本服务器CPU匹配的值,如: 8 2. 关闭掉一些耗性能的进程。
踩过的坑
table的深度与浅度拷贝
现象
当通过API批量获取配置列表时,发现不同的key获取的值是一样的, 但通过redis-cli获取是不一样且正确的。
分析
redis存储是正确的,很有可能是中间临时存储存在覆盖的问题, 如果table每次赋值都相当于内存拷贝那样Lua的性能就会大大降低, 会不会table之间赋值就像C语言一样只赋值地址或指针。经网上查找发现table存在深度与浅度拷贝的区别。 详见:Lua实现深度拷贝
解决措施
把中间的临时table变量放入当前语句块中并加local标识,猜测在当前语句块临时table可能会随时被释放掉, 因此它赋值给其他作用域更大的变量时使用深拷贝。
hgetall结果与Lua table转换
使用hgetall获取redis的内容需经转换后才能被Lua table使用。 转换关键代码如下:
1 local v = red:hgetall(innerk)
2 if v == nil then
3 log(ERR, "get redis empty key: ", innerk)
4 return nil
5 end
6 for key,val in pairs(v) do
7 if key%2 ~= 0 then
8 result[v[key]] = v[key+1];
9 end
10 end
nginx worker权限问题
现象
当使用init_worker_by_lua_file进行定时器任务时,发现不能打开或写入/usr/local/openresty/子目录下的文件, 而init_by_lua_file调用则正常。
分析
当把路径改为/tmp/目录下则运行都正常,经定位发现nginx master以root身份运行, 而nginx worker以nobody身份运行。 查看需要读写的文件路径, 发现只有root权限才能写。
解决措施
1) 发现代码以”r+“(更新模式,保存之前的数据)模式进行读文件,需改成”r”只读模式。 2) 把要写的文件路径改成其他可写,例如: chmod 777 data
http请求正常,而https出现“Received HTTP code 400 from proxy after CONNECT”错误.
解决措施
- 检查openresty安装参数,是否把对应的https参数都装上。
2)使用curl命令请求https时不能加”-x”参数,可以把域名:IP对加入到hosts文件中即可。
- 检查openresty安装参数,是否把对应的https参数都装上。
作者:mospan
微信关注:墨斯潘園
本文出处:http://mospany.github.io/2017/03/02/openresty+redis-practices/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。