企业级运维——使用OpenResty实现LNMP架构的缓存前移

本文介绍如何使用OpenResty实现缓存前移,通过整合memcache模块提升Web应用性能。文章详细讲解了从关闭旧服务到配置OpenResty的全过程,包括压力测试结果,展示缓存前移带来的显著效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenResty简介

OpenResty(又称:ngx_openresty) 是一个基于 NGINX 的可伸缩的 Web 平台,由中国人章亦春发起,提供了很多高质量的第三方模块。

OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统

模拟缓存前移

  • 1.关闭之前lnmp架构下开启的nginx服务
nginx -s stop
  • 2.官网下载OpenResty的原码包解压并编译
    注意:OpenResty的编译安装使用的是gmake
 tar zxf openresty-1.13.6.1.tar.gz
 cd openresty-1.13.6.1
 ./configure
 gmake && gmake install
  • 3.将memcache用于测试的俩个php文件复制到OpenResty的Nginx的默认发布目录下
cp /usr/local/lnmp/nginx/html/example.php /usr/local/openresty/nginx/html
cp /usr/local/lnmp/nginx/html/memcache.php /usr/local/openresty/nginx/html
  • 4.编辑openresty的nginx配置文件
vim /usr/local/openresty/nginx/conf/nginx.conf

写入:

http {
        upstream memcache {   ##所有的请求,通过转发给memcache缓存服务
           server localhost:11211;   ##memcache服务在本机的11211端口
           keepalive 512;
       }
 location /memc { ##设置memcache的访问及其存储 
         internal; ##只允许内部 
         memc_connect_timeout 100ms; #定义连接发送及其超时时间 
         memc_send_timeout 100ms;
         memc_read_timeout 100ms;
         set $memc_key $query_string; #memcache以键值对的形式存储 
         set $memc_exptime 300;
         memc_pass memcache;
         }
     location ~ \.php$ {
           set $key $uri$args;
           srcache_fetch GET /memc $key;
           srcache_store PUT /memc $key;
           root           html;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
           include        fastcgi.conf;         ##定义nginx与php连接的时识别的文件
       }

配置文件相关参数详解如下:

  • upstream模块接口

从本质上说,upstream属于handler,只是他不产生自己的内容,而是通过请求后端服务器得到内容,所以才称为upstream(上游)。请求并取得响应内容的整个过程已经被封装到nginx内部,所以upstream模块只需要开发若干回调函数,完成构造请求和解析响应等具体的工作。

所有请求都是通过location来操作memcache,memc-nginx-module存取memcache是基于http method语义的

使用http的GET方法表示get,PUT方法表示set,设置memcache的缓存方式为internal只接受内部访问

memc_key表示以什么作为key,文件中使用的是query_string来作为key,$memc_exptime表示缓存失效时间,单位为秒

  • 5.检查配置文件是否有错误并且开启服务
[root@LNMPserver1 html]# /usr/local/openresty/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test is successful
  • 6.开启服务,查看端口
[root@LNMPserver1 html]# /usr/local/openresty/nginx/sbin/nginx 
[root@LNMPserver1 html]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      6843/memcached      
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      15320/nginx         
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      5089/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      962/master          
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      6748/php-fpm        
tcp        0      0 :::11211                    :::*                        LISTEN      6843/memcached      
tcp        0      0 :::22                       :::*                        LISTEN      5089/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      962/master          
tcp        0      0 :::3306                     :::*                        LISTEN      31925/mysqld        
  • 7.浏览器查看
    在这里插入图片描述
    至此,结合OpenResty的缓存前移已经做好了,我们来总结分析一下。

分析

我们这里主要干了一件事,就是在OpenResty的nginx配置文件中,指定了upstream memcache,这也是我们使用OpenResty的原因,因为它集成了memcache等模块,我们可以清晰的从其配置文件中理解,所有的请求,会经由本地memcache的11211端口,而且

location ~ \.php$ {
           set $key $uri$args;
           srcache_fetch GET /memc $key;
           srcache_store PUT /memc $key;

这里指定了所有访问.php结尾的页面,会从 /memc 中取,没有的话就存进去。所以,我们相当于让memcache前移到Nginx接受请求的位置。

压力测试

我们再次在真实主机上测试:

ab -c 10 -n 2000 http://172.25.66.1/index.php
ab -c 10 -n 2000 http://172.25.66.1/example.php

可以发现,两个页面的响应时间和正确率都有质的提高。而有两级的memcache的example.php页面速度更快了。

在这里插入图片描述
在这里插入图片描述

### 使用OpenResty实现多级缓存 #### 方法概述 为了提高系统的响应速度并减轻后端服务器的压力,在请求到达最终的服务提供者之前,可以设置多个层次的缓存机制。当请求进入OpenResty之后,会先尝试访问位于内存中的快速缓存层——例如Redis[^3]。 如果在这一层未能找到所需的数据,则继续向更深层级去获取数据直至原始数据源(如Tomcat应用服务器),并将新获得的结果逐层回填至各级缓存中以便后续相同请求可以直接命中最近的一级缓存而无需再次穿透到下一层甚至直达数据库等底层存储单元。 #### 实现方案 以下是基于Lua脚本的一个简单示例来展示如何利用OpenResty配合Redis构建一个多级缓存体系: ```lua -- 加载必要的库 local redis = require "resty.redis" -- 创建一个新的 Redis 连接实例 local red = redis:new() -- 设置超时时间 (可选) red:set_timeout(1000) -- 1秒 -- 尝试连接到 Redis 服务器 local ok, err = red:connect("127.0.0.1", 6379) if not ok then ngx.say("failed to connect: ", err) return end -- 获取 URL 参数作为 key local args = ngx.req.get_uri_args() local cache_key = args["key"] -- 查询 Redis 缓存 local res, err = red:get(cache_key) if type(res) ~= 'nil' and res ~= ngx.null then -- 如果存在则直接返回缓存内容 ngx.say("hit redis cache:", res) else -- 若不存在于 Redis 中,则查询 Tomcat 并更新缓存 -- 假设这里调用了某个接口从 tomcat 获取数据... local data_from_tomcat = get_data_from_tomcat() -- 向 Redis 添加新的条目 local ttl = 60 * 5 -- 设置过期时间为五分钟 local ok, err = red:setex(cache_key, ttl, data_from_tomcat) if not ok then ngx.log(ngx.ERR, "Failed setting value into redis: ", err) end -- 返回给客户端 ngx.say(data_from_tomcat) end -- 断开与 Redis 的连接 local ok, err = red:close() if not ok then ngx.say("failed to close: ", err) return end ``` 此段代码展示了如何在一个HTTP请求到来时,首先检查是否存在对应的缓存记录;如果有,则立即返回该记录的内容而不必进一步处理;如果没有匹配项,则转而去询问实际的应用程序(Tomcat),取得最新版本的信息后再将其写回到Redis里供将来使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值