上一篇 kafka + ehcache + redis 整合 实现二级缓存数据服务, 主要讲解实现了 三层缓存架构中的本地堆缓存 + redis 分布式缓存,那么本篇我们就来聊了聊第三层 ( nginx 缓存) ,那为什么要讲nginx 呢,不就是部署多套nginx 不就完了么,对,这个没错,但是如果只是部署多套nginx ,那么由于 负载均衡 作用,导致缓存的命中率是比较低的,所以我们就来讲讲 如何提升缓存命中率 ?
图解 nginx 缓存命中率低下原因?
nginx 缓存命中率低下原因上图已经很清楚的描述了nginx 缓存命中率低下问题,那么怎么解决呢,如何提高,其实也很简单,就是相同的id 路由到相同的nginx 服务器中就可以了,如下图所示:
分发层 + 应用层 架构 解决缓存命中率低下后端的nginx服务器,就称之为应用服务器; 最前端的nginx服务器,被称之为分发服务器
-
nginx分发层,负责流量分发的逻辑和策略,可以自定义分发的规则,比如根据 productId 进行 hash,然后对后端的nginx数量取模
-
nginx应用层,负责数据缓存
将某一个商品的访问的请求,就固定路由到一个nginx后端服务器上去,保证了只会从redis中获取一次缓存数据,后面全都是走nginx本地缓存了
“分发层 + 应用层 ” 双层nginx 架构,在实际的生产环境中,可以大幅度提升你的nginx本地缓存这一层的命中率,大幅度减少redis后端的压力,提升性能
如何搭建 分发层 + 应用层 双层nginx 架构呢?
这里的双层nginx 架构 是结合 lua 开发,通过 openresty web 平台 运行,OpenResty®
是一个基于 Nginx 与 Lua 的高性能 Web 平台。
注:这里不介绍openresty 是什么东西了,您可以 点击这里 openresty 查看,后续的热点数据的自动降级机制 其实也是用到lua,这里可以先预热下
下面先把环境搭建起来
首先 这里部署应用层nginx,采用openResty 的方式去部署nginx (部署节点:192.168.0.16),同时开发一个 nginx + lua 的 hello wold
openresty 安装部署
- 创建目录
mkdir -p /usr/local/servers && cd /usr/local/servers
- 安装依赖
yum install -y readline-devel pcre-devel openssl-devel gcc
- 安装openResty (也称为 ngx_openresty ,是一个全功能的 Web 应用服务器,它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项)之 luajit 编译及安装
wget http://openresty.org/download/ngx_openresty-1.7.7.2.tar.gz
tar -xzvf ngx_openresty-1.7.7.2.tar.gz && cd ngx_openresty-1.7.7.2/bundle/LuaJIT-2.1-20150120
make clean && make && make install
ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit
- 安装nginx 缓存清理模块ngx_cache_purge
cd /usr/local/servers/ngx_openresty-1.7.7.2/bundle
wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
tar -xvf 2.3.tar.gz
- 安装 nginx 后端服务器健康检查模块 nginx_upstream_check_module
cd /usr/local/servers/ngx_openresty-1.7.7.2/bundle
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz
tar -xvf v0.3.0.tar.gz
- openResty 编译安装
cd /usr/local/servers/ngx_openresty-1.7.7.2
./configure --prefix=/usr/local/servers --with-http_realip_module --with-pcre --with-luajit --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/ -j2
make && make install
- 查看 servers 目录、查看nginx 版本 并 启动 nginx
-
查看目录
cd /usr/local/servers/ && ll
-
查看nginx 版本
/usr/local/servers/nginx/sbin/nginx -V
-
启动 nginx
/usr/local/servers/nginx/sbin/nginx
-
到这里使用openResty 部署 nginx + lua 完毕。
nginx + lua 的 hello wold
- 创建 lua.conf
cd /usr/local/servers/nginx/conf && vim lua.conf
添加以下内容:
server {
listen 80;
server_name _;
}
- 引入依赖
vi /usr/local/servers/nginx/conf/nginx.conf
在 http 中加入以下内容:
lua_package_path "/usr/local/servers/lualib/?.lua;;";
lua_package_cpath "/usr/local/servers/lualib/?.so;;";
include lua.conf;
- 验证 配置是否正确
配置验证通过/usr/local/servers/nginx/sbin/nginx -t
- 输出 hello world
vim /usr/local/servers/nginx/conf/lua.conf
在 server 中 加入以下内容:
location /lua {
default_type 'text/html';
content_by_lua 'ngx.say("hello world")';
}
输出 hello world
为了代码清晰,可以将 lua 逻辑脚本从lua.conf 分离,故:
将上面的 ngx.say("hello world");
代码分离到test.lua 文件中
test.luamkdir /usr/local/servers/nginx/conf/lua && vi /usr/local/servers/nginx/conf/lua/test.lua
修改lua.conf
vim /usr/local/servers/nginx/conf/lua.conf
location /lua {
default_type 'text/html';
content_by_lua_file conf/lua/test.lua;
}
- 验证 配置是否正确
/usr/local/servers/nginx/sbin/nginx -t
- nginx 配置重载
/usr/local/servers/nginx/sbin/nginx -s reload
- 验证hello world
浏览器中访问 》http://192.168.0.16/lua
- 查看异常日志
tail -f /usr/local/servers/nginx/logs/error.log
以上方式都是直接在nginx 中编写lua 脚本
下面以工程化 nginx + lua 项目结构的方式讲解下
nginx + lua 项目结构如下:
----- test
--------- test.conf
--------- lua
------------- test.lua
--------- lualib
------------- *.lua
------------- *.so
- 创建 test 项目
mkdir /usr/local/test
- 配置 test.conf 文件
vim /usr/local/test/test.conf
server {
listen 80;
server_name _;
location /test {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file /usr/local/test/lua/test.lua;
}
}
- 编写 test.lua 脚本文件
vim /usr/local/test/lua/test.lua
ngx.say("hello world, this is my test nginx + lua project");
- 拷贝依赖库
cp -r /usr/local/servers/lualib/* /usr/local/test/lualib/
- test 项目 配置到 nginx.conf
vim /usr/local/servers/nginx/conf/nginx.conf
在http 中配置:
lua_package_path "/usr/local/test/lualib/?.lua;;";
lua_package_cpath "/usr/local/test/lualib/?.so;;";
include /usr/local/test/test.conf;
- 验证 配置是否正确
/usr/local/servers/nginx/sbin/nginx -t
- nginx 配置重载
/usr/local/servers/nginx/sbin/nginx -s reload
- 验证 test 项目
浏览器中访问 》http://192.168.0.16/test
好了,openResty 部署 nginx + lua 应用层完毕,同理在192.168.0.17 再部署一个相同的应用层,后续用到。
以上就是本章内容,如有不对的地方,请多多指教,谢谢!
为了方便有需要的人,本系列全部软件都在 https://pan.baidu.com/s/1qYsJZfY
下章预告:主要讲解 “分发层 + 应用层” 双层nginx 架构 之 分发层
作者:逐暗者 (转载请注明出处)
网友评论