Nginx实现负载均衡&Nginx缓存功能

1、Nginx是什么

  Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
  其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
  Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特色是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
  目前淘宝在nginx作了二次开发:tengine(见下文)。
  php

2、Nginx实现反向代理

2.1 正向代理和反向代理

  正向代理:是一个位于客户端和目标服务器之间的服务器,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标(目标服务器),而后代理向目标服务器转交请求并将得到的内容返回给客户端。
  简单来讲:
  我是一个用户,我访问不了某网站,可是我能访问一个代理服务器;
  这个代理服务器呢,他能访问那个我不能访问的网站;
  因而我先连上代理服务器,告诉他我须要那个没法访问网站的内容;
  代理服务器去取回来,而后返回给我;
  从网站的角度,只在代理服务器来取内容的时候有一次记录;
  有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
  反向代理:对于客户端而言它就像是目标服务器,而且客户端不须要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(目标服务器)转交请求,并将得到的内容返回给客户端,就像这些内容本来就是它本身的同样。
  简单来讲,
  用户访问 http://ooxx.me/readme;
  但ooxx.me上并不存在readme页面;
  他是偷偷从另一台服务器上取回来,而后做为本身的内容吐给用户;
  但用户并不知情┐(゚~゚)┌
  这里所提到的 ooxx.me 这个域名对应的服务器就设置了反向代理功能;
  正向代理和反向代理的区别:
  (1)从用途上来说:
  正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可使用缓冲特性减小网络使用率。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还能够为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。
  另外,反向代理还能够启用高级URL策略和管理技术,从而使处于不一样web服务器系统的web页面同时存在于同一个URL空间下。
  (2)从安全性来说:
  正向代理容许客户端经过它访问任意网站而且隐藏客户端自身,所以你必须采起安全措施以确保仅为通过受权的客户端提供服务。
  反向代理对外都是透明的,访问者并不知道本身访问的是一个代理。css

2.2 nginx实现反向代理

  nigix代理是基于ngx_http_proxy模块实现的。该模块有不少配置选项,如:html

proxy_passnginx

  指定将请求代理至server的URL路径。web

proxy_set_header数据库

  将发送至server的报文的某首部进行重写。vim

proxy_send_timeout后端

  在链接断开以前两次发送到server的最大间隔时长;过了这么长时间后端仍是没有收到数据,链接会被关闭。centos

proxy_read_timeout浏览器

  是从后端读取数据的超时时间,两次读取操做的时间间隔若是大于这个值,和后端的链接会被关闭。

proxy_connect_timeout

  是和后端创建链接的超时时间。
  接下来,咱们就来仔细说说重点的配置选项:

2.2.1 proxy_pass配置

1)替换uri
  经常使用于页面很固定的时候。好比双十一的大促主页面。
  语法以下:

location /uri {
    proxy_pass http://ip:port/newuri/;        //location的/uri将被替换为/newuri
}

  举例以下:

location /mobi {
    proxy_pass http://172.17.251.66/mobile/;        //将/mobi 的请求跳转到新服务器上/mobile目录下
}

  在这里,咱们须要注意的是,http://ip:port/newuri;,这个地方最后面加不加/意义是不一样的。
  如上文,咱们就加上了/,则意味着所有替换。
  若是咱们不加/,则是将新路径当作其上级目录,访问的是新路径下的原路径。举例以下:

location /mobi {
    proxy_pass http://172.17.251.66/mobile;        //将/mobi 的请求跳转到新服务器上/mobile/mobi目录下
}

2)转换url
  至关于分流,基于url来分流,把一类的请求发送到一个机器(一个集群)中,具体操做看机器的设置。
  若是location的URI是经过模式匹配定义的,其URI将直接被传递,而不能为其指定转换的另外一个URI。
  举例以下:

location ~ ^/mobile {
    proxy_pass http://172.17.251.66;
}

  这段代码的意思是,只要有/mobile的网址,会直接转到http://172.17.251.66/mobile下。
  
3)URL重定向
  也就是整个url的重定向。好比两个网站合并或者更换域名时,原先的域名已经不用了,可是有些页面还在访问,就能够经过这种方法来整个重定向,重定向到新的域名中。
  若是在location中使用的URL重定向,那么nginx将使用重定向后的URI处理请求,而再也不考虑以前定义的URI。

location /youxi{
    rewrite ^(.*)$ /mobile/$1 break;
    proxy_pass http://172.17.251.66;
}

  这段代码的意思就是,只要你访问的是带/youxi的页面,就会自动重定向到http://172.16.100.1/mobile/$1上。$1指的是^(.*)$中括号内的部分。这样就实现了整个url的重定向。
  在这里,咱们也来详细说说ngx_http_rewrite_module模块,这是一个很是好用的模块。

2.2.1.1ngx_http_rewrite_module模块

1)rewrite 用法
  将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI。
  其语法是:

  rewrite regex replacement [flag]

  注意:若是在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会从新一轮的替换检查。
  隐含有循环机制,但不超过10次;若是超过,提示500响应码, [flag]所表示的标志位用于控制此循环机制。
  若是replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端。
  下面咱们来讲一说flag的具体选项:
[flag]

last:重写完成后中止对当前URI在当前location中后续的其它重写操做,然后对新的URI启动新一轮(从第一个开始)重写检查;提早重启新一轮循环。
break:重写完成后中止对当前URI在当前location中后续的其它重写操做,然后直接跳转至重写规则配置块以后的其它配置;结束循环,建议在location中使用。
redirect临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端从新发起请求; 不能以http://或https://开头 ,使用相对路径,状态码: 302。
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端从新发起请求,状态码:301。

  由下图咱们能够更清楚的看出跳转到的位置:

2)return用法
  return的用法语法以下:

  return code [text];
  return code URL;
  return URL;

  中止处理,并返回给客户端指定的响应码。
  

2.2.2 proxy_set_header配置

  proxy_set_header用于将发送至server的报文的某首部进行重写。经常使用于nginx作负载均衡时, 获取客户端IP时, 添加forward头部。
  语法以下:

proxy_set_header Host $host;            //目的主机地址
proxy_set_header X-REMOTE-IP $remote_addr;      //上一跳地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    //客户端主机地址

  原有请求报文中若是存在X-Forwared-For首部, 则将client_addr以逗号分隔补原有值后, 不然则直接添加此首部;

2.3 nginx实现负载均衡

  nginx负载均衡是ngx_http_upstream_module模块的功能, 须要在配置文件http块上下文中定义upstream块, 指定一组负载均衡的后端服务器, 而后在上面讲到的proxy_pass中引用, 就能够反向代理时实现负载均衡了。
  须要注意的是:ngx_http_upstream段要在server段前面,要定义在http段中。
  语法以下:

server address [parameters];

  接着,咱们来看一看选项:
paramerters

weight: 负载均衡策略权重, 默认为1;
max_fails: 在必定时间内(这个时间在fail_timeout参数中设置) 检查这个服务器是否可用时产生的最多失败请求数
fail_timeout: 在经历了max_fails次失败后, 暂停服务的时间。 max_fails能够和fail_timeout一块儿使用, 进行对后端服务器的健康状态检查;
backup: 当全部后端服务器都宕机时, 能够指定代理服务器自身做为备份, 对外提供维护提示页面;
down: 永久不可用。

  须要注意一下的是:max_failsfail_timeout是配对使用的,前者是定义在必定时间内检查这个服务器是否链接可用时产生的最多失败请求的次数,后者是规定这个时间,而且这个时间也是在通过前者的失败次数后,暂停服务的时间。
示例:

max_fails=3
    fail_timeout=10s

  意思就是 10秒内失败3次,则暂停服务10秒。
  举例:

upstream dynamic {
    server backend1.example.com weight=5;
    server backend2.example.com:8080 max_fails=3; fail_timeout=5s ;
    server 192.0.2.1 max_fails=3;
    server backup1.example.com:8080 backup;
    server backup2.example.com:8080 backup;
}

  固然,咱们还有一个专业的健康检测模块 nginx_upstream_check_module-master,能够根据须要使用。
  upstream块里能够用多个server选项配置多个后端服务器,同时还可配置对后端服务器的健康状态检查,能够在server后面加上max_fails
proxy_next_upstream指定检查策略,默认为返回超时为失败)和fail_timeout参数实现;也能够用health_check选项来实现,health_check能够指定的参数较多, 不过须要定义在location上下文中。
  另外, 能够指定代理服务器自身做为备份server, 当全部后端服务器都宕机时, 对外提供维护提示页面。
  还能够指定负载均衡策略: 主要有round_robin(加权轮询, 默认) 、haship_hashleast_conn(最少链接)和least_time(最少响应时间,商业版本),策略定义在upstream上下文便可。
  具体实例参照tengine实现动静分离(见下文)。

3、tengine

  Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了不少高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等获得了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
  从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝、搜狗等互联网企业。Tengine是社区合做的成果,咱们欢迎你们参与其中,贡献本身的力量。

tengine实现动静分离

一、下载并解压安装包
  进入官网下载安装包,

  这里附上官网网址:tengine.taobao.org
  小编下载的是2.2.1版本。你们能够根据本身的须要来下载。接着,咱们使用rz命令上传至虚拟机。
  上传完成后,咱们来解压:

tar xvf tengine-2.1.1.tar.gz

二、编译安装tengine
  首先,咱们要安装依赖的包和包组:

yum install pcre-devel  openssl-devel -y
    yum groupinstall "development tools" -y

  安装完成后,咱们进入这个目录:

cd tengine-2.1.1

  而后,咱们就能够进行编译安装了:

./configure --prefix=/usr/local/tengine
    make && make install

三、修改配置文件
  咱们的需求是让这台机器充当调度器,坐到动静分离,因此咱们须要在配置文件中添加下面这些:
  配置文件为/usr/local/tengine/conf/nginx.conf
http段,添加以下内容:

upstream server-cluster{
        server 172.17.77.77:80;
        server 172.17.252.111:80;

        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "HEAD / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
}

upstream staticsrvs{
        server 172.17.22.22:80;
        server 172.17.1.7:80;

        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "HEAD / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
}

server段,添加以下内容:

location /stats {
        check_status;      //定义一个web监听页面
}
//如下部分用来实现动静分离
location ~* .jpg|.png|.gif|.jpeg$ {
        proxy_pass http://staticsrvs;
}
location ~* .css|.js|.html|.xml$ {
        proxy_pass http://staticsrvs;
}
location / {
        proxy_pass http://server-cluster;
}

  若是有下面这一段,咱们须要把它注释掉:

location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

  这样,咱们的配置文件就修改完成了。
  在咱们启动服务前,若是咱们的机器开启了nginx服务或者http服务,要记得把服务关闭,由于tengine服务使用的也是80端口
  咱们来启动服务:

cd /usr/local/tengine/sbin
./nginx -t              //检查配置文件语法错误
./nginx                 //启动服务
./nginx -s reload       //从新加载服务

  固然,咱们也能够直接把这个服务写到咱们的启动脚本里,这样,之后咱们经过service或者systemctl就能够控制了。
  centos7里的启动脚本在/usr/lib/systemd/system/nginx.service
  在centos6中,咱们若是以前使用yum安装过nginx,咱们就能够复制一个nginx的服务脚本,更名为tengine,并设置开机自启,具体操做以下:

cp /etc/init.d/nginx /etc/init.d/tengine
    vim /etc/init.d/tengine

四、测试
  因为咱们在配置文件中定义了一个web的监听页面,因此咱们能够去访问一下:

  上图中就是咱们的监听页面,若是某一服务器出现故障,则会标红提示。
  咱们的网站也是能够正常访问的:

  接着,咱们来测试一下咱们的动静分离实现状况,咱们把两台静态的服务器的nginx服务down掉:

systemctl stop nginx

  而后咱们来看看咱们的监听页面,须要刷新几回:

  咱们能够看到,挂掉的两台服务器已经标红了。接着咱们来访问一下咱们的网站:

  能够看到,全部的静态文件,包括图片cssjs等文件都没有显示了,咱们的动静分离实验圆满完成。

4、nginx实现缓存

4.1 为何须要缓存

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

4.2 缓存服务的工做原理


  缓存的工做原理能够很清楚的从上图中看出来。经过缓存,咱们就能够减小大量的重复读取过程,从而节省咱们的资源,提高网站的性能。
  缓存数据分为两部分(索引,数据):
  一、存储数据的索引,存放在内存中;
  二、存储缓存数据,存放在磁盘空间中;
  

4.3 nginx缓存模块

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

4.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指定的时间内,未被访问的缓存数据将从缓存中删除

4.3.2 proxy_cache

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

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

4.3.3 proxy_cache_valid

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

proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;

4.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 Magedu-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分钟;
        }
    }
}

5、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('magedu', '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('magedu'); #获取testkey的值
echo "$get_result is from memcached server.";
?>

  而后咱们就能够去访问了:

  bing~咱们的测试已经成功啦~


  以上~若是有不足之处还请你们多多指教喏٩(๑>◡<๑)۶

相关文章
相关标签/搜索