Nginx(二十二)nginx配置memcached

一     ngx_http_memcached_module

nginx memcached是一个'使用内存'来为'访问页面加速'的模块

nginx memcached模块与memcached服务器'之间的交互'是通过nginx的'upstream机制'来进行的

注意: 官方的memcached模块'只有访问读取'memcached服务器的能力,而'没有将内容写入'到memcached服务器的能力,某些'第三方模块'则有此功能

二    作用机理

++++++++'注意的要点'++++++++

1)nginx 只负责'从memcached'读取'指定'的'缓存数据'  --> nginx'只负责从memcached读'

2)后台'应用程序'通过'相关逻辑'将要'缓存的页面'推送到memcached,方便nginx'去调用' -->'后台程序负责写'
​
++++++++'结构图'如下++++++++

memcached

 1)当'客户端请求'到达'nginx服务器'时,nginx会'先通过键值(比如说uri)'去访问memcached服务器

 2)当能从memcached服务器获取到数据时,会直接将数据封装,返回给客户端,'否则则继续'访问相关服务如php,从相关应用获取到内容发送给客户端,同时'由相关应用主动'将内容'写入到memcached服务器',以便下次访问时能起到加速的效果
1) memcached的'key'可以通过'memcached_key变量'来设置,如'$uri'

+++++++++++'命中与否'+++++++++++

1)如果'命中',那么直接输出内容

2)'没有命中'就意味着nginx需要'从应用程序请求'页面,同时'还希望'该'应用程序'将键值对'写入'到'memcached',以便'下一个请求'可以直接'从memcached获取'

+++++++++++'键值不存在'+++++++++++

备注: 如果'键值不存在',nginx将'报告not found'错误

最佳实践: 使用'error_page'指定和'location'请求处理,同时包含"Bad Gateway"错误和"Gateway Timeout"错误

如:error_page 404 502 504 = @app;

注意:需要设置default_type,否则可能会显示不正常

三   nginx配置memcached

(1)  模块指令

①  memcached_bind

说明: none表示'任意一个'就行

②  memcached_pass

③  memcached_buffer_size

④  timeout

备注: 单位为'毫秒' --> 60s -->'60000'

⑤  memcached_gzip_flag

⑥  memcached_next_upstream

⑦  memcached key

常见的'形式'

set $memcached_key $request_uri;

⑧  第三方模块ngx_http_enhanced_memcached_module

git clone git://github.com/bpaquet/ngx_http_enhanced_memcached_module.git

'as static or dynamic module' --> '静态'或者'动态'方式

--add-module=/my/path/to/my/clone/ngx_http_enhanced_memcached_module

--add-dynamic-module=/my/path/to/my/clone/ngx_http_enhanced_memcached_module

备注: 最新版本适合'1.11.x',再高的版本'尚未测试',目前'了解即可'
​
nginx memcached的'增强版ngx_http_enhanced_memcached_module'

(2)nginx中的配置

upstream memcacheds {
        server 127.0.0.1:11211;
}

location /cache/ {
    set $memcached_key $request_uri; 用'request_uri'作为key'去memcached中'去'读取'内容
    add_header X-mem-key  $memcached_key;
    memcached_pass  memcacheds;
    default_type text/html;
    // 访问该uri时,先在'该服务器'去取资源,取不到时跳转到'@app的分支'去处理
    error_page 404 502 504 = @app; 当缓存'没有命中'或者'出错'时,则'访问实际的应用'并'重新写入'缓存
    // '类似':error_page 404 = /callback.php --> 指定'没有加载到缓存的时候'-->'回调页面'-->请求后端的应用,然后'后端的应用'在返回内容的同时'也缓存到memcached中'
}

location @app {
    rewrite ^/.* /nginx.wzj.com?key=$request_uri;
}
​
++++++++++++++++++++++++++'解读: '++++++++++++++++++++++++++

 1)这个配置把'所有请求URI前缀为/cache/'的访问'用memcached模块进行内容的读取',同时使用'请求URI'作为Memcached的key

 2)效果-->当'缓存没有命中'或者'出错时',我们'使用@fallback进行处理'

 例如:访问实际的应用并'重新写入'缓存

ngx_http_upstream_consistent_hash

ngx_http_upstream_consistent_hash这个'第三方模块'实现一致性hash -->'多个memcached,做负载均衡时候'

原因: upstream采用的是'round-robin的轮询'方式,而PHP的'php_memcache扩展'使用的是'一致性哈希算法'进行Memcached服务节点的选择

结果: 我们在前端'用PHP缓存的页面',通过nginx'不一定能访问到',所以我们必须让Nginx也能通过'一致性哈希'算法去'选择节点'

选择: ngx_http_upstream_consistent_hash这个'第三方模块'实现了跟php_memcache这个'PHP扩展'一样的'一致性哈希算法'

三  测试

(1)准备工作

(1)callback.php

<?php
$uri = $_SERVER['REQUEST_URI'];
// new一个memcache对象出来
$memcache = new Memcache;
$memcache->addServer('127.0.0.1', 11211);
// 命中-->对应key为"uri"
$num = rand(1,999).$uri.'not use databases,hitting';
// 信息添加到'memcache缓存中'
$memcache->add($uri,$num);
// 核心看$uri的内容                                                             
echo 'This is a',$uri,' sb memcache';

(2)cache.conf配置

(3)缓存测试

/etc/hosts 做好'本地解析'

172.25.2.100  cache.wzj.com

+++++++++'服务重启,保证环境的干净'+++++++++

systemctl restart nginx.service 

systemctl restart memcached.service

①  第一次访问  --> header

第一次'访问' --> 'memcached'中没有缓存到 --> 需要'经过php处理' --> 返回给客户端的'同时'把内容缓存到memcached

第一次'请求': http://cache.wzj.com/cache/index.html

说明: index.html本身'并不存在'

查看memcached里面是否存储

②  第二次访问

再次访问  --> 直接'从memcached读取'

第二次'请求': ctrl + F5 --> '强制刷新' -->http://cache.wzj.com/cache/index.html 

③  建议方式

@和break来处理  --> '/cache/里面的请求都缓存'

location ^~ /cache/ {
        set            $memcached_key $request_uri;
        memcached_pass memcached;
        error_page     404 502 504 = @fallback;
}

核心: 此时到'@fallback'对应的'请求url是什么?'

location @fallback {
        rewrite ^/cache/(.*) /$1 break;
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header X-Cache-Key $request_uri;
}

四    memcached缓存页面的好处

五   参考博客

使用memcache加速nginx

参考博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值