补:nginx负载均衡之后设置缓存

原本这篇早该奉上了,但是一直忙于找工作,就没有时间,不过好歹现在不用考虑这个问题了,正好看到一篇写得不错,暂时补上:

1. 为什么需要缓存

  缓存的最根本的目的是为了提高网站性能,减轻频繁访问数据,而给数据库带来的压力。合理的缓存,还会减轻程序运算时,对CPU带来的压力。在计算机现代结构中,操作内存中的数据比操作存放在硬盘上的数据是要快N个数量级的,操作简单的文本结构的数据,比操作数据库中的数据快N个数量级 。
  例如:每次用户访问网站,都必须从数据库读取网站的标题,每读一次需要15毫秒的时间,如果有100个用户(先不考虑同一时间访问),每小时访问10次,那么就需要读取数据库1000次,需要时间15000毫秒。如果把页面直接变成页面缓存,则每次访问就不需要去数据库读取,大大提升了网站性能。
 

2.缓存服务的工作原理

        缓存的工作原理可以很清楚的从上图中看出来。通过缓存,我们就可以减少大量的重复读取过程,从而节省我们的资源,提升网站的性能。
  缓存数据分为两部分(索引,数据):
  1、存储数据的索引,存放在内存中;
  2、存储缓存数据,存放在磁盘空间中;



3. nginx缓存模块

  Nginx实现缓存是通过代理缓存pxory_cache, 这也是ngx_http_proxy_module模块提供的功能, 这里配置选项较多, 常用的选项有: proxy_cache_pathproxy_cacheproxy_cache_valid

3.1 proxy_cache_path

  proxy_cache_path定义一个完整的缓存空间,指定缓存数据的磁盘路径、索引存放的内存空间以及一些其他参数,如缓存删除策略。
  注意:该选项只能定义在http块上下文中。
  如:

    proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10;   //缓存数据存储在/data/cache目录中

  下面我们来看看具体的选项:

levels:配置在该目录下再分两层目录,一层1个随机字符作为名称,二层2个随机字符作为名称,levels最多三层,每层最多两个字符,这是为了加快访问文件的速度;最后使用代理url的哈希值作为关键字与文件名,一个缓存数据如下: /data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c;
keys_zone:用来为这个缓存区起名,并设置大小。上面的例子就是指定名称为web,这个名称后面proxy_cache需要引用;而10m就是内存空间的大小;
max_size:指定最大缓存数据磁盘空间的大小;
inactive:在inactive指定的时间内,未被访问的缓存数据将从缓存中删除

3.2 proxy_cache

  proxy_cache用来引用上面proxy_cache_path定义的缓存空间, 现时打开缓存功能, 如下:

  proxy_cache web;             //引用上面定义上的缓存空间, 同一缓存空间可以在几个地方使用

3.3 proxy_cache_valid

  proxy_cache_valid设置不同响应代码的缓存时间, 如:

    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;

4. 配置nginx缓存实例

  先配置proxy_cache_path,再配置proxy_cache引用、打开缓存空间,接着配置两个proxy_cache_valid;为方便调试测试,我们可以通过add_header给请求响应增加一个头部信息,表示从服务器上返回的cache状态怎么样(有没有命中),主要配置如下:
  定义一个完整的缓存空间;缓存数据存储在/data/cache目录中;配置在该目录下再分两层目录;名称为web(proxy_cache引用);10m内存空间大小;最大缓存数据磁盘空间的大小;10分钟未被访问的缓存数据将从缓存中删除

http {

    proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10m;

    server {
        listen 80;
        server_name localhost;
        #charset koi8-r;
        #access_log logs/host.access.log main;
        add_header linuxidc-Cache "$upstream_cache_status form $server_addr";    //给请求响应增加一个头部信息,表示从服务器上返回的cache状态怎么样(有没有命中)
        location / {
            proxy_pass http://webserver;    //引用上面定义的upstream负载均衡组
            proxy_cache web;    //引用上面定义上的缓存空间,同一缓存空间可以在几个地方使用
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;    //对代码200和302的响应设置10分钟的缓存,对代码404的响应设置为1分钟;
        }
    }
}

五、memcached

5.1 memcached是什么

  Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。它是一种基于内存key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
  Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。本质上,它是一个简洁的key-value存储系统。
  一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

5.2 安装配置memcached

5.2.1 安装

  直接使用yum安装即可。

    yum install memcached -y

5.2.2 配置文件

  memcached的配置文件与我们常见服务的配置文件不同,他的配置文件非常简单,配置文件为/etc/sysconfig/memcached。我们来看一下里面的东西:

PORT="11211" #端口
USER="memcached" #启动用户
MAXCONN="1024" #最大连接
CACHESIZE="64" #缓存空间大小

  配置文件里只有常用的一些设置,我们可以直接通过修改文件来更改配置,也可以等到我们启动服务的时候添加下面的选项来更改配置:

-d 指定memcached进程作为一个守护进程启动
-m <num> 指定分配给memcached使用的内存,单位是MB,默认为64;
-u <username> 运行memcached的用户
-l <ip_addr> 监听的服务器IP地址,如果有多个地址的话,使用逗号分隔,格式可以为“IP地址:端口号”,例如:-l 指定192.168.0.184:19830,192.168.0.195:13542;端口号也可以通过-p选项指定
-p <num> Listen on TCP port , the default is port 11211.
-c <num>设置最大运行的并发连接数,默认是1024
-R <num> 为避免客户端饿死(starvation),对连续达到的客户端请求数设置一个限额,如果超过该设置,会选择另一个连接来处理请求,默认为20
-k 设置锁定所有分页的内存,对于大缓存应用场景,谨慎使用该选项
-P 保存memcached进程的pid文件
-s <file> 指定Memcached用于监听的UNIX socket文件
-a <perms> 设置-s选项指定的UNIX socket文件的权限
-U <num> Listen on UDP port , the default is port 11211, 0 is off.

  我们来开启服务:

    systemctl start memcached.service

  如果我们想要连接memcached,需要用到telnet工具,如果没有安装的话,直接yum安装即可。我们来连接一下:

[root@rs01 ~]# telnet 172.17.77.77 11211
Trying 172.17.77.77...
Connected to 172.17.77.77.
Escape character is '^]'.
stats        //查看状态
STAT pid 15480
STAT uptime 304
STAT time 1510475514
STAT version 1.4.15
STAT libevent 2.0.21-stable  
STAT pointer_size 64      
STAT rusage_user 0.027883
STAT rusage_system 0.074357
STAT curr_connections 10
STAT total_connections 11
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0                     //总命中次数
STAT get_misses 0                   //总未命中次数
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 7
STAT bytes_written 0
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END

  一般我们衡量一个缓存的性能好坏,一方面是看速度,还有就是看它的命中率。如果一个缓存的命中率很低,就没有太多存在的必要。所以,我们的缓存策略也是很重要的。
  接着,我们就来看看在memcached中去插入数据的命令:
  命令为set,语法如下:

set key flags exptime bytes [noreply]
value

  我们来看看各个选项的意思:

key 是通过被存储在Memcached的数据并从memcached获取键(key)的名称。
flags 是32位无符号整数,该项目被检索时用的数据(由用户提供),并沿数据返回服务器存储。
exptime 以秒为单位的过期时间,0表示没有延迟,如果exptime大于30天,Memcached将使用它作为UNIX时间戳过期。
bytes 是在数据块中,需要被存储的字节数。基本上,这是一个需要存储在memcached的数据的长度。
noreply (可选) 参数告知服务器不发送回复
value 是一个需要存储的数据。数据需要与上述选项执行命令后,将通过新的一行。

  我们来依照上述语法添加一条进去:

set name 1 1800 4 
keer
STORED          //表明存上了

  现在我们可以来查看一下:

get name
VALUE name 1 4
keer
END

  可以看出,我们刚刚添加的内容已经添加上了,我们再来查看一下状态:

stats  
……
STAT get_hits 1                     //总命中次数
STAT get_misses 0                   //总未命中次数
……

  发现我们的总命中次数多了一次,就是因为我们刚刚执行了get命令,并且是成功的,我们现在来尝试一下get一个不存在的内容:

get age
END

  然后再来看一下状态:

stats  
……
STAT get_hits 1                     //总命中次数
STAT get_misses 1                   //总未命中次数
……

  因为我们去获取了一个不存在的内容,所以miss数+1。
  当然,这只是我们做的演示,真正的生产环境是不允许我们这么玩的0.0会被玩坏=。=
  我们还需要记住的一点是,只要我们的机器断电了,或或者系统重启了,memcached里面的数据就全部没有了。因为我们的memcached是存放在内存中的非关系型数据库,是完全工作在内存中的,所以只要一断电就彻底玩完了╮(╯﹏╰)╭
  但是我们的nginx数据是存在磁盘中的,只有索引放在内存中,所以即使掉电了,因为磁盘中的数据还在,索引也可以根据数据重新生成。
  所以,这样就要涉及到一个选择问题了,看你是追求性能,还是追求安全。我们可以根据不同的需求来选择不同的方式存储数据。
  

5.2.3 memcached测试脚本

  在我们的生产环境,我们是可以使用程序来调用的。比如我们可以使用php客户端连过来来调用memcached
  为了使我们的php连接上memcache的客户端,我们需要安装一个包——php-memcache。我们直接使用yum安装即可:

    yum install php-memcache

  安装完成后,我们需要重启一下php-fpm服务:

  systemctl restart php-fpm
  我们之前在 /data/web/下创建过一个 phpinfo.php文件,我们可以来通过浏览器查看一下:


        可以看出我们的 memcache已经和 php建立了连接。
  接下来,给大家提供一个简单的 php测试 memcache的小脚本:
vim /data/web/memcached.php
<?php
$mem = new Memcache;
$mem->connect("172.17.77.77", 11211); #连接Memcached,ip是你做实验机器的ip

$version = $mem->getVersion();
echo "Server's version: ".$version."<br/>\n"; #输出Memcached版本信息

$mem->set('linuxidc', 'Hello World', 0, 600); #向Memcached存储数据'Hello World',时间为600s
echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";

$get_result = $mem->get('linuxidc'); #获取testkey的值
echo "$get_result is from memcached server.";
?>
  然后我们就可以去访问了:





结束语》》推荐一首从小听到大一直感觉不过时的歌: 黄昏

猜你喜欢

转载自blog.csdn.net/qq_39131177/article/details/79738795