nginx+lua+redis构建高并发应用(转)

nginx+lua+redis构建高并发应用

ngx_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

http://www.ttlsa.com/nginx/nginx-lua-redis/

时间: 2024-08-03 16:18:58

nginx+lua+redis构建高并发应用(转)的相关文章

Nginx+Lua+Redis构建高并发Web应用_nginx

本文介绍如何用Nginx+Lua+Redis来构建高并发Web应用,Curl请求Nginx,Nginx通过Lua查询Redis,返回json数据. 一.安装1.安装lua-redis-parser 复制代码 代码如下: #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 2.安

详解利用redis + lua解决抢红包高并发的问题_Redis

抢红包的需求分析 抢红包的场景有点像秒杀,但是要比秒杀简单点. 因为秒杀通常要和库存相关.而抢红包则可以允许有些红包没有被抢到,因为发红包的人不会有损失,没抢完的钱再退回给发红包的人即可. 另外像小米这样的抢购也要比淘宝的要简单,也是因为像小米这样是一个公司的,如果有少量没有抢到,则下次再抢,人工修复下数据是很简单的事.而像淘宝这么多商品,要是每一个都存在着修复数据的风险,那如果出故障了则很麻烦. 基于redis的抢红包方案 下面介绍一种基于Redis的抢红包方案. 把原始的红包称为大红包,拆分

【重要】Nginx模块Lua-Nginx-Module学习笔记(三)Nginx + Lua + Redis 已安装成功(非openresty 方式安装)

源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一. 目标 使用Redis做分布式缓存:使用lua API来访问redis缓存:使用nginx向客户端提供服务,ngx_lua将lua嵌入到nginx,让nginx执行lua脚本,高并发,非阻塞的处理各种请求.url请求nginx服务器,然后lua查询redis,返回json数据. 二.准备工作 系统环境:Ubuntu 14.0 (64位) Redis服务安装:apt-get install redi

nginx lua redis 访问频率限制(转)

1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的需求. Nginx处理请求的过程一共划分为11个阶段,分别是: post-read.server-rewrite.find-config.rewrite.post-rewrite. preaccess.access.post-access.try-files.content.log. 在openre

nginx lua redis 访问频率限制的两个例子

1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的需求. Nginx处理请求的过程一共划分为11个阶段,分别是: post-read.server-rewrite.find-config.rewrite.post-rewrite. preaccess.access.post-access.try-files.content.log. 在openre

基于Nginx和Consul构建高可用及自动发现的Docker服务架构

本文讲的是基于Nginx和Consul构建高可用及自动发现的Docker服务架构[编者的话]本文对于Docker和Consul Template以及Nginx如何结合使用做了较为详细的介绍. [上海站|3天烧脑式微服务架构训练营]培训内容包括:DevOps.微服务.Spring Cloud.Eureka.Ribbon.Feign.Hystrix.Zuul.Spring Cloud Config.Spring Cloud Sleuth等. 导读 如果你在大量接触或使用微服务的话,你可能会碰到一个问

利用redis + lua解决抢红包高并发的问题

抢红包的需求分析 抢红包的场景有点像秒杀,但是要比秒杀简单点. 因为秒杀通常要和库存相关.而抢红包则可以允许有些红包没有被抢到,因为发红包的人不会有损失,没抢完的钱再退回给发红包的人即可. 另外像小米这样的抢购也要比淘宝的要简单,也是因为像小米这样是一个公司的,如果有少量没有抢到,则下次再抢,人工修复下数据是很简单的事.而像淘宝这么多商品,要是每一个都存在着修复数据的风险,那如果出故障了则很麻烦. 淘宝的专家丁奇有个文章有写到淘宝是如何应对秒杀的:<秒杀场景下MySQL的低效–原因和改进> h

Nginx + Lua + redis (一)(转)

使用 Lua 脚本语言操作 Redis. 由于大量的 Lua 代码写在 Nginx 中,会使配置文件显得很繁琐,所以这里使用 content_by_lua_file 来引入 Lua 脚本文件. 要使用 content_by_lua_file,需要安装 nginx_lua_module 模块. 安装介绍,猛击这里:nginx_lua_module 大神 章亦春 提供了一个很方便的开发包,如下:   [plain] view plain copy    print? git clone https:

nginx+lua+redis实现反向代理配置

背景 最近要进行IVR的重构, 我们现在系统接了三家IVR服务商, N个业务, 由于IVR这玩意一般只能外网回调, 而开发环境又不允许外网随便访问, 着实烦人. 所有我们打算重构一把, 封装多家IVR, 对业务透明, 同时回调可以针对多家IVR服务商的不同callid直接转发到当时请求的同学的 开发域名去. 而不同的IVR服务商的callid参数是不同的,有的是在url里面(call_id), 有的则是直接post的json数据(callid), 所以太扯了. 直接用lua处理下, 查下redi