当前位置: 代码迷 >> 综合 >> LAMP服务架构之高速存储机制(Openresty(Nginx)+Memcache)
  详细解决方案

LAMP服务架构之高速存储机制(Openresty(Nginx)+Memcache)

热度:38   发布时间:2024-02-12 16:34:08.0

使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

传统缓存机制 ,如下图:
传统缓存机制传统缓存机制效率低的原因:
传统上是通过PHP操作memcache的,要执行PHP代码,Nginx 就必然要和 FastCGI 通信,同时也要进入PHP的生命周期,因此SAPI、PHP Core 和 Zend Engine 的一系列逻辑会被执行。更糟糕的是,fpm 和 PHP 可能会阻塞,因此破坏了Nginx的非阻塞性。

优化高效缓存机制,如下图:
高效缓存机制目前很多互联网应用都使用 RESTful 规范进行设计,在 RESTful 应用下,普遍使用 uri 和 查询参数作为缓存的 key。
以此更高效的缓存策略是 Nginx 直接访问 memcache,并用 $uri 和 $arg s等 Nginx 内置变量设定缓存 key 规则,这样,当缓存命中时,Nginx可以跳过通过fastcgi和PHP通信的过程,直接从memcache中获取数据并返回。memc-nginx 和 srcache-nginx 正是利用这种策略提高了缓存的效率。

附:

  • memc-nginx 和 srcache-nginx 模块均为前淘宝工程师 agentzh(章亦春)开发。
  • memc 模块扩展了 Nginx 标准的 memcache模块,增加了set、add、delete等memcache命令。
  • srcache 则是为 location 增加了透明的基于 subrequest 的缓存层。两者配合使用,可以实现上一节提到的高效缓存机制。

Openresty

OpenResty 官网:http://openresty.org/ OpenResty? - 中文官方站 http://openresty.org/cn/
一,简介

  • OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。
  • OpenResty通过汇聚各种设计精良的Nginx模块(主要由OpenResty团队自主开发),从而将Nginx有效地变成一个强大的通用Web应用平台。这样,Web开发人员和系统工程师可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,快速构造出足以胜任10K乃至1000K以上单机并发连接的高性能Web应用系统。
  • OpenResty的目标是让你的Web服务直接跑在Nginx服务内部,充分利用Nginx的非阻塞I/O模型,不仅仅对HTTP客户端请求,甚至于对远程后端诸如MySQL、PostgreSQL、Memcached以及Redis等都进行一致的高性能响应。
  • 很多公司目前有这种通过lua合并接口的需求,来达到减少请求数量的目标,在nginx作为反向代理接收到请求时根据请求路径将原来多个接口的请求合并到一个json返回,减少http请求数,提高请求效率增加并发量。

二,安装OpenResty

  • 解压: tar zxf openresty-1.17.8.2.tar.gz
  • 建立一个软连接:ln -s openresty-1.17.8.2 openresty
  • 进入目录:cd openresty-1.17.8.2
  • 编译:
  • ./configure
  • 安装:
  • make
  • make install

应用 OpenResty 实现基于 memc-nginx 和 srcache-nginx 模块构建的 高效缓存机制

openresty主要的使用场景主要是:

  • 在 Lua 中揉和和处理各种不同的 nginx 上游输出(Memcached,Proxy,Postgres,Redis 等)
  • 从外部存储服务(比如 Memcached,Redis,MySQL,Postgres)中获取后端信息,并用这些信息来实时选择哪一个后端来完成业务访问。
  • 在内容 handler 中随意编写复杂的 Web 应用,使用 同步但依然非阻塞 的方式,访问后端数据库和其他存储。
  • 用 Lua 可以为 nginx 子请求和任意 location,实现高级缓存机制。

1. 配置
配置 openresty 内置的 nginx 应用配置文件 nginx.conf

# cd /usr/local/openresty/nginx/conf
# vim nginx.conf
http {
...
upstream memcache {                          # memc-nginx是一个标准的 upstream模块,因此首先需要定义 memcache 的 upstreamserver 127.0.0.1:11211;              # 本机上启动了一个memcache服务,端口为默认的11211keepalive 512 ;                      # keepalive指令是 http-upsteram-keepalive-module 提供的功能,这里我们最大保持512个不立即关闭的连接用于提升性能}server {
...
location /memc {                            # 为 memc-nginx-module 配置 location,所有请求都通过请求这个location来操作 memcacheinternal;                           # 将/memc设为internal表示只接受内部访问,不接收外部http请求,这是为了安全考虑
# 如果需要通过http协议开放外部访问,可以去掉internal然后使用deny和allow指令控制权限 
# memc-nginx-module存取memcache是基于http method语义的,使用http的GET方法表示get、PUT方法表示set、DELETE方法表示delete memc_connect_timeout 100ms;memc_send_timeout 100ms;memc_read_timeout 100ms;set $memc_key $query_string;       # $memc_key这个变量,它表示以什么作为key,这里直接使用Nginx内置的 $query_string 来作为 keyset $memc_exptime 300;             # $memc_exptime表示缓存失效时间,以秒记memc_pass memcache;}
location ~ \.php$ {                        # “~ \.php$”这个location配置了缓存set $key $uri$args;            # 以$uri$args作为缓存的keysrcache_fetch GET /memc $key;  # srcache_fetch表示注册一个输入拦截处理器到location,这个配置将在location进入时被执行;srcache_store PUT /memc $key;  # srcache_store表示注册一个输出拦截器到location,当location执行完成并输出时会被执行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增加了如下逻辑:当所请求的uri以“.php”结尾时,首先到memcache中查询有没有以$uri$args为key的数据,如果有则直接返回;否则,执行location的逻辑,如果返回的http状态码为200,则在输出前以$uri$args为key,将输入结果存入memcache。 

配置浏览器访问的动态PHP文件(.php)

# cd /usr/local/openresty/nginx/html# vim index.php
cat index.php
<?php
phpinfo()
?>

2. 启动 openresty 服务

 /usr/local/openresty/nginx/sbin/nginx			     # 启动服务
cp /usr/local/nginx/html/memcache.php  /usr/local/openresty/nginx/htmlcd /usr/local/openresty/nginx/html
vim memcache.php

3.测试
访问 172.25.1.3/memcache.php

压测:
1)使用高速缓存机制
ab -c 10 -n 10000 http://172.25.1.3/index.php

2)使用传统缓存机制

#vim /usr/local/openresty/nginx/conf/nginx.conf
...
location ~ \.php$ {                         
# set $key $uri$args; # 注释掉 对于 location 的高速缓存机制配置
# srcache_fetch GET /memc $key; # 注释掉 对于 location 的高速缓存机制配置
# srcache_store PUT /memc $key; # 注释掉 对于 location 的高速缓存机制配置root           html;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;include        fastcgi.conf;}
...

ab -c 10 -n 10000 http://172.25.1.3/index.php

对比后,高速缓存机制访问效率及命中率更高