lua与Openresty,多级缓存
1.nginx优化
一个简单的nginx配置文件:
user nginx; #用户
worker_processes auto;#进程数量 推荐auto,自动去服务器的cpu核心数
error_log /var/log/nginx/error.log error;
pid /var/run/nginx.pid;
worker_rlimit_nofile 204800;
events
{
use epoll;#使用Linux中效率最高的epoll
worker_connections 204800;
}
http
{
include mime.types;#nginx支持的文件类型
default_type application/octet-stream;
charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
keys_zone=TEST:10m
inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 8k;
fastcgi_temp_file_write_size 8k;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
include /etc/nginx/conf.d/*.conf;
}
2. 多级缓存
2.1 lua与Openresty介绍
lua是一个小巧的脚本语言,由标准C编写而成,几乎在所有操作系统和平台上都可以编译运行。其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
应用场景:游戏开发、独立应用脚本、redis中嵌套调用实现类似事务的功能,web容器汇总处理NGINX的过滤缓存等等逻辑
Openresty介绍
OpenResty是一个基于Nginx与Lua的高性能web平台,由中国人章亦春发起,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便搭建能处理超高并发、扩展性极高的动态Web应用、web服务和动态网关
OpenResty简单理解成就相当于封装了NGINX,并且集成了LUA脚本,开发人员只需要简单的使用其提供了模块就可以实现相关的逻辑,而不像之前,还需要在NGINX中编写lua的脚本。
安装
- 拉取一个Openresty的镜像
docker pull openresty/openresty
- 随便构建一个容器
docker run -p 90:90 -d --name openresty openresty/openresty
- 进入容器,查看配置文件的路径
docker exec -it openresty bash
cd /etc/nginx/conf.d
- 退出容器,复制容器中配置文件到宿主机
docker cp openresty:/etc/nginx/conf.d/default.conf /docker/openresty/conf/default.conf
docker stop openresty
docker rm openresty
docker run -p 90:90 -d --name openresty -v /docker/openresty/conf/default.conf:/etc/nginx/conf.d/default.conf --privileged=true openresty/openresty
- 修改配置文件
# 修改 nginx.conf 文件
http {
#添加设置共享内存 dis_cache 对象大小
lua_shared_dict dis_cache 120m;
}
server
{
listen 90;
listen [::]:90;
server_name localhost;
root /docker/www/webserver;
index index.html;
location /lmrs_home_index {
content_by_lua_file /docker/www/lua/lmrs_home_index.lua;
}
}
2.2 首页多级缓存策略(这里以商城首页的分类数据为例,实际场景还有:猜你喜欢的商品,热商品)
1、使用Lua查询Nginx缓存,如果有缓存,则直接将缓存中的分类数据返回
2、如果Nginx缓存中没有分类数据,则通过Lua脚本查询Redis,如果Redis中有数据,则将数据存入到Nginx缓存中,并返回查询到的数据
3、如果Redis中也没有缓存,则此时通过Lua脚本查询Mysql,如果Mysql中有数据,将分类数据存入到Redis缓存,并返回数据
ngx.header.content_type = "application/json;charset=utf8"
local cache_ngx = ngx.shared.dis_cache;
local contentCache = cache_ngx:get("home_index");
if contentCache == "" or contentCache == nil then
local redis = require("resty.redis");
local red = redis:new()
red:set_timeout(2000)
red:connect("172.17.0.5", 6379)
local rescontent = red:get("home_index");
if ngx.null == rescontent or false == rescontent or "" == rescontent then
local cjson = require("cjson");
local mysql = require("resty.mysql");
local db = mysql:new();
db:set_timeout(2000)
local props = {
host = "172.17.0.4",
port = 3306,
database = "shops",
user = "root",
password = "root"
}
local res = db:connect(props);
local select_sql = "select * from product_categorys"
res = db:query(select_sql);
local responsejson = cjson.encode(res);
red:set("home_index", responsejson);
ngx.say(responsejson);
db:close()
else
cache_ngx:set("home_index", rescontent, 10 * 60);
ngx.say(rescontent)
end
red:close()
else
ngx.say(contentCache)
end
nginx已经在上面进行了配置,所以这里不用在去配置了,这里需要注意下。