Nginx之lua开发实战
1. Redis操作
1. nginx支持3种方法访问Redis
1)HttpRedis : 提供指令少,功能单一
2)HttpRedis2Module : 比 HttpRedis 操作更灵活,功能更强大
3)Lua-resty-redis 库 : Openresty 提供的操作 Redis 的接口库,需要通过 --with-luajit 编译安装
2. HttpRedis
只支持Redis的get命令和select命令
1. 例子:
http {
upstream redis_backend {
server 127.0.0.1:6379;
}
server {
listen 80;
location / {
set $redis_key $uri;
redis_pass redis_backend;
default_type text/html;
error_page 404 = @backend;
}
location @backend {
proxy_pass http://127.0.0.1:8080;
}
}
}
2. 请求地址: curl http://localhost/ceshi.html
因为在redis中,没有ceshi.html这个key,所以导致访问404错误,请求反向代理到8080上。
在redis中,创建对应的key,ceshi.html,那么返回对应的key的值。
3. HttpRedis常用的指令
1. redis_pass
语法: redis_pass [name:port]
默认: none
上下文: http,server,location
2. redis_bind
语法: redis_bind [addr]
默认: none
上下文: http,server,location
3. redis_read_timeout
语法: redis_read_timeout [time]
默认: 60000
上下文: http,server,location
说明: 以毫秒为单位的redis读取超时值
4. redis_send_timeout
语法: redis_send_timeout [time]
默认: 60000
上下文: http,server,location
说明: 以毫秒为单位的redis发送超时值
5. redis_buffer_size
语法: redis_buffer_size [size]
默认: see getpagesize
上下文: http,server,location
说明: 以字节为单位的发送和接受缓冲区尺寸
6. redis_next_upstream
语法: redis_next_upstream [error] [timeout] [invalid_response] [not_fount] [off]
默认: error timeout
上下文: http,server,location
说明: 定义哪个失败条件可以引导请求向下一个upstream内server项流转。
只有在redis_pass中使用的upstream中有两个以上server的情况下才有效。
7. redis_connect_timeout
语法: redis_connect_timeout [time]
默认: 60000
上下文: http,server,location
说明: 以毫秒为单位的redis连接超时值
8. redis_gzip_flag
语法: redis_gzip_flag [number]
默认: unset
上下文: location
说明: 使用gzip压缩标志
4. HttpRedis变量
1. $redis_key key值
2. $redis_db redis数据库数量
3. HttpRedis2Module
1. 模块
ngx_http_redis2_module
作用: 允许Nginx通过TCP协议直接与Redis通信,支持多条命令
2. 安装方式
./configure --add-module=/path/to/redis2-nginx-module make && make install
如果你用的是OpenResty,这个模块已经内置。
3. 例子1
取值赋值
http {
server {
listen 8080;
# GET 取值
location /redis2_get {
set_unescape_uri $key $arg_key;
redis2_query get $key;
redis2_pass 127.0.0.1:6379;
}
# SET 赋值
location /redis2_set {
set_unescape_uri $key $arg_key;
set_unescape_uri $value $arg_value;
redis2_query set $key $value;
redis2_pass 127.0.0.1:6379;
}
# 删除键
location /redis2_del {
set_unescape_uri $key $arg_key;
redis2_query del $key;
redis2_pass 127.0.0.1:6379;
}
}
}
测试命令:
# 写入 curl "http://localhost:8080/redis2_set?key=user:1&value=Tom" # 读取 curl "http://localhost:8080/redis2_get?key=user:1" # 删除 curl "http://localhost:8080/redis2_del?key=user:1"
4. 例子2
一次执行多条命令
location /redis2_multi {
set_unescape_uri $key1 $arg_key1;
set_unescape_uri $val1 $arg_val1;
set_unescape_uri $key2 $arg_key2;
set_unescape_uri $val2 $arg_val2;
redis2_query set $key1 $val1;
redis2_query set $key2 $val2;
redis2_query mget $key1 $key2;
redis2_pass 127.0.0.1:6379;
}
访问地址: curl "http://localhost:8080/redis2_multi?key1=a&val1=1&key2=b&val2=2"
5. 常用指令
| 指令名 | 作用 | 使用范围 |
| ------------------------ | ---------------------------- | ---------------------- |
| `redis2_query` | 指定要发送到 Redis 的命令(可多次调用) | location |
| `redis2_pass` | 指定 Redis 服务器地址(IP或upstream) | location |
| `set_unescape_uri` | 解码 URI 参数,用于 redis key/value | location |
| `redis2_connect_timeout` | 设置连接 Redis 的超时时间 | http, server, location |
| `redis2_send_timeout` | 设置向 Redis 发送请求的超时时间 | http, server, location |
| `redis2_read_timeout` | 设置从 Redis 读取响应的超时时间 | http, server, location |
| `redis2_buffer_size` | 设置接收 Redis 响应的 buffer 大小 | http, server, location |
| `redis2_next_upstream` | 当连接失败时,指定是否重试下一个 upstream | location |
| `redis2_raw_queries` | 直接发送原始 Redis 协议命令(高级用法) | location |
1. redis2_query 执行redis命令,可以多次使用
location /get {
set_unescape_uri $key $arg_key;
redis2_query get $key;
redis2_pass 127.0.0.1:6379;
}
location /multi {
redis2_query set foo 123;
redis2_query set bar 456;
redis2_query mget foo bar;
redis2_pass 127.0.0.1:6379;
}
2. redis2_pass 指定redis地址
location /redis {
redis2_query get foo;
redis2_pass 127.0.0.1:6379;
}
另外一种写法
upstream redis_backend {
server 127.0.0.1:6379;
server 127.0.0.2:6379 backup;
}
location / {
redis2_query get foo;
redis2_pass redis_backend;
}
3. set_unescape_uri 用于将请求参数解码后存入变量,避免key/value被URL编码
set_unescape_uri $key $arg_key; set_unescape_uri $value $arg_value; redis2_query set $key $value;
4. redis2_connect_timeout 设置连接redis的超时时间(毫秒或秒)
redis2_connect_timeout 100ms;
默认60s
5. redis2_send_timeout 设置向redis发送数据的超时时间
redis2_send_timeout 200ms;
6. redis2_read_timeout 设置从redis读取响应的超时时间
redis2_read_timeout 1s;
7. redis2_buffer_size 设置接受redis回复的buffer大小,默认是4k
redis2_buffer_size 8k;
8. redis2_next_upstream 指定如果连接失败或超时,是否重试下一个upstream
redis2_next_upstream error timeout invalid_response;
可选项包括:
error
timeout
invalid_response
not_found
off
9. redis2_raw_queries 允许直接发送redis协议格式的命令
4. lua-resty-redis

浙公网安备 33010602011771号