安装

openresty安装

详见 openresty安装

redis安装

执行如下命令:

sudo apt-get update  
sudo apt-get install redis-server

详见 Ubuntu安装配置Redis

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请求:

  1. 先写请求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
}

}

  1. 执行命令:

    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

302 Found


openresty/1.11.2.1

性能测试

使用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/

优化点

  1. 关闭日志记录

    access_log off; error_log /usr/local/openresty/nginx/logs/dr302_node_error.log error;

  2. 打开缓存 把nginx.conf里的这行打开或加上。 lua_code_cache on;

3)使用ulimit -n 65535设置open files数。 1. 设置nginx的进程数与本服务器CPU匹配的值,如: 8 2. 关闭掉一些耗性能的进程。

踩过的坑

table的深度与浅度拷贝

  1. 现象

    当通过API批量获取配置列表时,发现不同的key获取的值是一样的, 但通过redis-cli获取是不一样且正确的。

  2. 分析

    redis存储是正确的,很有可能是中间临时存储存在覆盖的问题, 如果table每次赋值都相当于内存拷贝那样Lua的性能就会大大降低, 会不会table之间赋值就像C语言一样只赋值地址或指针。经网上查找发现table存在深度与浅度拷贝的区别。 详见:Lua实现深度拷贝

  3. 解决措施

    把中间的临时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权限问题

  1. 现象

    当使用init_worker_by_lua_file进行定时器任务时,发现不能打开或写入/usr/local/openresty/子目录下的文件, 而init_by_lua_file调用则正常。

  2. 分析

    当把路径改为/tmp/目录下则运行都正常,经定位发现nginx master以root身份运行, 而nginx worker以nobody身份运行。 查看需要读写的文件路径, 发现只有root权限才能写。

  3. 解决措施

    1) 发现代码以”r+“(更新模式,保存之前的数据)模式进行读文件,需改成”r”只读模式。 2) 把要写的文件路径改成其他可写,例如: chmod 777 data

http请求正常,而https出现“Received HTTP code 400 from proxy after CONNECT”错误.

  1. 解决措施

    1. 检查openresty安装参数,是否把对应的https参数都装上。

    2)使用curl命令请求https时不能加”-x”参数,可以把域名:IP对加入到hosts文件中即可。

微信扫一扫

作者:mospan
微信关注:墨斯潘園
本文出处:http://mospany.github.io/2017/03/02/openresty+redis-practices/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。