首页分析
表:
首页门户系统需要展示各种各样的广告数据。如图,以jd为例:
变更频率低的数据,如何提升访问速度?
1.数据做成静态页[商品详情页]
2.做缓存[Redis]
lua的安装
虚拟机中已经安装好了,略
测试看lua是否安装成功:
ctrl+c退出
LUA的基本语法(了解)
了解即可,这里略过,不是我们关注的重点
OpenResty介绍
OpenResty(又称:ngx_openresty) 是一个基于 nginx的可伸缩的 Web 平台,由中国人章亦春发起,提供了很多高质量的第三方模块。
OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,
OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统。
360,UPYUN,阿里云,新浪,腾讯网,去哪儿网,酷狗音乐等都是 OpenResty 的深度用户。
OpenResty 简单理解成 就相当于封装了nginx,并且集成了LUA脚本,开发人员只需要简单的其提供了模块就可以实现相关的逻辑,而不再像之前,还需要在nginx中自己编写lua的脚本,再进行调用了。
原本nginx并发大概是5万,现在大大提高了!OpenResty是1万——100万。
安装openresty
linux安装openresty:
1.添加仓库执行命令
yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
2.执行安装
yum install openresty
3.安装成功后,在默认的目录下:
/usr/local/openresty
说明已经安装成功了!
安装nginx
默认已经安装好了nginx,在目录:/usr/local/openresty/nginx 下。
修改/usr/local/openresty/nginx/conf/nginx.conf,将配置文件使用的根设置为root,目的就是将来要使用lua脚本的时候 ,直接可以加载在root下的lua脚本。
cd /usr/local/openresty/nginx/conf
vi nginx.conf
修改代码如下:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一步步往下操作,发现虚拟机上已经帮我配置好了,那我暂时不用配的了。
详细如下:
user root root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#定义Nginx缓存模块,模块名字叫dis_cache,容量大小128M
lua_shared_dict dis_cache 128m;
#限流设置
limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=2r/s;
#根据IP地址来限制,存储内存大小10M
limit_conn_zone $binary_remote_addr zone=addr:10m;
#个人IP显示
limit_conn_zone $binary_remote_addr zone=perip:10m;
#针对整个服务所有的并发量控制
limit_conn_zone $server_name zone=perserver:10m;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
#监听的域名
server_name localhost;
#192.168.211.1
location /brand {
limit_conn perip 3; #单个客户端ip与服务器的连接数.
limit_conn perserver 5; #限制与服务器的总连接数
#同一个IP只允许有2个并发连接
#limit_conn addr 2;
#所有以/brand的请求,都将交给 192.168.211.1服务器的18081程序处理.
proxy_pass http://192.168.211.1:18081;
}
#表示所有以 localhost/read_content的请求都由该配置处理
location /read_content {
#使用指定限流配置,burst=4表示允许同时有4个并发连接,如果不能同时处理,则会放入队列,等请求处理完成后,再从队列中拿请求
#nodelay 并行处理所有请求
limit_req zone=contentRateLimit burst=4 nodelay;
#content_by_lua_file:所有请求都交给指定的lua脚本处理(/root/lua/read_content.lua)
content_by_lua_file /usr/local/server/lua65/read_content.lua;
}
#表示所有以 localhost/update_content的请求都由该配置处理
"nginx.conf" 65L, 2072C
咦,出乎意料,竟然有这么多配置,说明虚拟机上已经帮我配置好了,那我暂时不用配的了。
退出按Esc——>shift+冒号——>q!
补充下linux中vi退出简单操作:https://blog.csdn.net/weixin_43970743/article/details/97144222
进入编辑模式,按 o 进行编辑
编辑结束,按ESC 键 跳到命令模式,然后输入退出命令:
:w保存文件但不退出vi 编辑
:w! 强制保存,不退出vi 编辑
:w file将修改另存到file中,不退出vi 编辑
:wq保存文件并退出vi 编辑
:wq!强制保存文件并退出vi 编辑
q:不保存文件并退出vi 编辑
:q!不保存文件并强制退出vi 编辑
:e!放弃所有修改,从上次保存文件开始在编辑
测试访问:
重启下centos虚拟机,然后访问测试Nginx
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
广告缓存的载入与读取
Lua+Nginx配置
(1)实现思路-查询数据放入redis中
实现思路:
定义请求:用于查询数据库中的数据更新到redis中。
a.连接mysql ,按照广告分类ID读取广告列表,转换为json字符串。
b.连接redis,将广告列表json字符串存入redis 。
定义请求:
请求:
/update_content
参数:
id --指定广告分类的id
返回值:
json
请求地址:
创建/root/lua目录,在该目录下创建update_content.lua: 目的就是连接mysql 查询数据 并存储到redis中。
update_content.lua内容如下:
ngx.header.content_type="application/json;charset=utf8"
local cjson = require("cjson")
local mysql = require("resty.mysql")
local uri_args = ngx.req.get_uri_args()
local id = uri_args["id"]
local db = mysql:new()
db:set_timeout(1000)
local props = {
host = "192.168.2.132",
port = 3306,
database = "changgou_content",
user = "root",
password = "123456"
}
local res = db:connect(props)
local select_sql = "select url,pic from tb_content where status ='1' and category_id="..id.." order by sort_order"
res = db:query(select_sql)
db:close()
local redis = require("resty.redis")
local red = redis:new()
red:set_timeout(2000)
local ip ="192.168.2.132"
local port = 6379
red:connect(ip,port)
red:set("content_"..id,cjson.encode(res))
red:close()
ngx.say("{flag:true}")
具体可参考项目文档
老师讲解:
目前只是测试,暂时不存nginx:
解释各项配置:
下面是我的操作:
发现已经存在该文件了:
但是ip不对,需要改成192.168.2.132
按insert开始修改,修改好按Esc——>Shift+冒号——>wq——Enter退出
发现也已经配好了:
但是要把 content_by_lua_file /usr/local/server/lua65/read_content.lua;改下,因为我没有新建lua65这个文件夹,删掉,保存,退出
后来发现还是多余两个文件夹,也删掉
哎,发现不是usr,而是root文件夹
修好保存后记得重新加载:
cd ../sbin
./nginx -s reload
测试:http://192.168.2.132/update_content?id=1
成功!
也存入了redis
存已经可以存了,但是读不出来,下面我们学习使用OpenResty实现广告缓存的读取。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(2)实现思路-从redis中获取数据
实现思路:
定义请求,用户根据广告分类的ID 获取广告的列表。通过lua脚本直接从redis中获取数据即可。
定义请求:
请求:/read_content
参数:id
返回值:json
在/root/lua目录下创建read_content.lua:
--设置响应头类型
ngx.header.content_type="application/json;charset=utf8"
--获取请求中的参数ID
local uri_args = ngx.req.get_uri_args();
local id = uri_args["id"];
--引入redis库
local redis = require("resty.redis");
--创建redis对象
local red = redis:new()
--设置超时时间
red:set_timeout(2000)
--连接
local ok, err = red:connect("192.168.211.132", 6379)
--获取key的值
local rescontent=red:get("content_"..id)
--输出到返回响应中
ngx.say(rescontent)
--关闭连接
red:close()
在/usr/local/openresty/nginx/conf/nginx.conf中配置如下:
我的操作如下:
已经存在read_content.lua文件了
ip地址不对,修改成192.168.2.132,保存后退出
老师对配置讲解:
(3)加入openresty本地缓存
如上的方式没有问题,但是如果请求都到redis,redis压力也很大,所以我们一般采用多级缓存的方式来减少下游系统的服务压力。参考基本思路图的实现。
先查询openresty本地缓存 如果 没有
再查询redis中的数据,如果没有
再查询mysql中的数据,但凡有数据 则返回即可。
修改read_content.lua文件,代码如下:
我的操作如下:
测试:http://192.168.2.132/read_content?id=1
成功!就算删了数据库表中的数据,也可以从redis中读取。。。