gx_lua将lua嵌入到nginx,让nginx执行lua脚本,高并发,非阻塞的处理各种请求。
url请求nginx服务器,然后lua查询redis,返回json数据。
备注:centos或者redhat系统请跳转到nginx + ngx_lua安装测试
一.安装lua
1
2
3
|
# apt-get install lua5.1
# apt-get install liblua5.1-dev
# apt-get install liblua5.1-socket2
|
二.安装nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# apt-get install git-core
# git clone https://github.com/simpl/ngx_devel_kit.git
# git clone https://github.com/chaoslawful/lua-nginx-module.git
# git clone https://github.com/agentzh/redis2-nginx-module.git
# git clone https://github.com/agentzh/set-misc-nginx-module.git
# git clone https://github.com/agentzh/echo-nginx-module.git
# git clone https://github.com/catap/ngx_http_upstream_keepalive.git
# apt-get install libpcre3 libpcre3-dev libltdl-dev libssl-dev libjpeg62 libjpeg62-dev libpng12-0 libpng12-dev libxml2-dev libcurl4-openssl-dev libmcrypt-dev autoconf libxslt1-dev libgd2-noxpm-dev libgeoip-dev libperl-dev -y
# wget http://nginx.org/download/nginx-1.0.8.tar.gz
# tar zxvf nginx-1.0.8.tar.gz
# cd nginx-1.0.8
# ./configure --prefix=/usr/local/nginx --with-debug --with-http_addition_module \
--
with
-
http_dav_module
--
with
-
http_flv_module
--
with
-
http_geoip
_module
\
--
with
-
http_gzip_static_module
--
with
-
http_image_filter_module
--
with
-
http_perl
_module
\
--
with
-
http_random_index_module
--
with
-
http_realip_module
--
with
-
http_secure_link
_module
\
--
with
-
http_stub_status_module
--
with
-
http_ssl_module
--
with
-
http_sub
_module
\
--
with
-
http_xslt_module
--
with
-
ipv6
--
with
-
sha1
=
/
usr
/
include
/
openssl
\
--
with
-
md5
=
/
usr
/
include
/
openssl
--
with
-
mail
--
with
-
mail_ssl
_module
\
--
add
-
module
=
.
.
/
ngx_devel
_kit
\
--
add
-
module
=
.
.
/
echo
-
nginx
-
module
\
--
add
-
module
=
.
.
/
lua
-
nginx
-
module
\
--
add
-
module
=
.
.
/
redis2
-
nginx
-
module
\
--
add
-
module
=
.
.
/
ngx_http_upstream
_keepalive
\
--
add
-
module
=
.
.
/
set
-
misc
-
nginx
-
module
# make
# make install
|
三.安装lua-redis-parser
1
2
3
4
|
# git clone https://github.com/agentzh/lua-redis-parser.git
# export LUA_INCLUDE_DIR=/usr/include/lua5.1
# make CC=gcc
# make install CC=gcc
|
四.安装json
1
2
3
|
# wget http://files.luaforge.net/releases/json/json/0.9.50/json4lua-0.9.50.zip
# unzip json4lua-0.9.50.zip
# cp json4lua-0.9.50/json/json.lua /usr/share/lua/5.1/
|
五.安装redis-lua
1
2
|
# git clone https://github.com/nrk/redis-lua.git
# cp redis-lua/src/redis.lua /usr/share/lua/5.1/
|
六.配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
user
www
-
data
;
worker
_processes
8
;
worker_cpu
_affinity
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
;
error_log
logs
/
error
.
log
notice
;
pid
logs
/
nginx
.
pid
;
worker_rlimit
_nofile
60000
;
events
{
worker
_connections
1024
;
use
epoll
;
}
http
{
include
mime
.
types
;
default_type
application
/
octet
-
stream
;
access_log
logs
/
access
.
log
;
sendfile
on
;
tcp_nopush
on
;
tcp_nodelay
on
;
keepalive
_timeout
60
;
types_hash_max
_size
2048
;
server_tokens
off
;
lua_code_cache
on
;
upstream
redis_pool
{
server
192.168.1.39
:
6379
;
keepalive
1024
single
;
//定义连接池大小,当连接数达到此数后,后续的连接为短连接
}
server
{
listen
80
;
server
_name
192.168.1.211
;
location
/
get_redis
{
#internal;
set_unescape
_uri
$
key
$
arg_key
;
redis2_query
hgetall
$
key
;
redis2_pass
redis_pool
;
}
location
/
json
{
content_by_lua_file
conf
/
fuck
.
lua
;
}
}
}
|
# vim fuck.lua
1
2
3
4
5
6
7
8
9
10
11
12
|
local
json
=
require
(
"json"
)
local
parser
=
require
(
"redis.parser"
)
local
res
=
ngx
.
location
.
capture
(
"/get_redis"
,
{
args
=
{
key
=
ngx
.
var
.
arg
_key
}
}
)
if
res
.
status
==
200
then
reply
=
parser
.
parse_reply
(
res
.
body
)
value
=
json
.
encode
(
reply
)
ngx
.
say
(
value
)
a
=
json
.
decode
(
value
)
ngx
.
say
(
a
[
2
]
)
end
|
七.测试
# redis-cli -h 192.168.1.39
1
2
3
|
redis
192.168.1.39
:
6379
>
HMSET
ttlsa
www
www
.
ttlsa
.
com
mail
mail
.
ttlsa
.
com
OK
|
# curl 'http://192.168.1.211/json?key=ttlsa'
1
|
[
"www"
,
"www.ttlsa.com"
,
"mail"
,
"mail.ttlsa.com"
]
|
www.ttlsa.com