实战LANMP负载均衡部署2-NGINX结合MEMCACHE提供SESSION会话保留

接上文,上文作者写了实战LANMP负载均衡部署1-实现NGINX反向APACHE服务器集群,居然NGINX反向给了APACHE服务器的集群之后,我们就要考虑SESSION丢失的问题了

实战LANMP负载均衡部署2-NGINX结合MEMCACHE提供SESSION会话保留

首先我们需要给210的NGINX服务器添加MEMCACHE服务,用于存储缓存信息,
而220/230的服务器只需要添加PHP的MEMCACHE扩展,调用210服务器上的MEMCACHE

由于yum源要找过PHP5.3.3的memcache
所以作者编译过环境为PHP7
可以参考
php7添加memcache扩展

在这要特别说下:

memcache是一个服务

memcached是PHP的扩展支持

pecl-memcache-php7 安装在APACHE集群的220/230的服务器的PHP上

重启HTTPD,打印phpinfo查看是否已经启用了memcachee
然后切换会210的NGINX服务器

安装memcached-1.4.25 (记得yum install -y libevent-devel)

安装完成后启用:
/usr/local/bin/memcached -d -m 256 -l 192.168.0.210 -p 7788 -u root

IP必须为内网IP 127.0.0.1的话就只允许本机了
修改220/230的php.ini
session.save_handler = memcache;
session.save_path = “tcp://192.168.0.210:7788”;

不过建议在执行的PHP上动态修改:
ini_set(‘session.save_handler’, ‘memcache’);
ini_set(‘session.save_path’, ‘ tcp://192.168.0.210:7788’);

先来做个测试,看看SESSION是否可以共享:
修改220/230服务器的index.php内容为:

<?php
header(“Content-Type: text/html; charset=UTF-8”);
echo “当前反向请求的服务器IP为:”.$_SERVER[“SERVER_ADDR”].”<br>”;
ini_set(‘session.save_handler’, ‘memcache’); #修改SESSION的保存方式
ini_set(‘session.save_path’, ‘ tcp://192.168.0.210:7788’); #SESSION保存路径
session_start();

#unset($_SESSION[‘time’]); die();
#如果设置错误先把数据删除
$time=time(); #获取当前时间
if(!isset($_SESSION[‘time’])){ #如果不存在SESSION的时间
$_SESSION[‘time’]=$time; #赋值
}
echo “共享的SESSION[‘time’]的值=”.$_SESSION[‘time’].”<br>”;
#输出共享的SESSION[‘time’]
echo “现在的时间=”.time();
#输出当前的时间
?>

可以看到结果:

1

2

到现在为止,负载均衡的SESSION共享就算完成了,当然也包括数据缓存共享;

为了您的服务器敏感信息不泄漏,建议MEMCACHE只开启内网IP段

即/usr/local/bin/memcached -d -m 256 -l 192.168.0.210 -p 7788 -u root

如果是实际服务器,切记别使用:

/usr/local/bin/memcached -d -m 256 -l 外网IP -p 7788 -u root

 

因为缓存的数据很容易就被黑客抓取,所以如果不是使用服务器集群的话,建议别开启MEMCACHE

 

作者在说说,MEMCACHE是如何减轻数据库的瓶颈的,代码就不写了,思路写了自己琢磨下就懂了:

对SQL的操作,莫过“增删改查”

首先,每次SELECT的时候,先判断MEMCACHE里是否存在对应的KEY,存在提取值,这些值是怎么来的呢?

假设MEMCACHE内没有所需的值

数据库中提取,可以为数组也可以为字符串,然后Memcached::set(‘key’,’value’)写入KEY名称和对应的值,值可以为数组

那么下次再访问的时候,就先不直接读取数据库了

而是if(Memcached::get(‘key’,’value’))就可以判断是否存在,存在直接return即可。

 

比如说有留言什么的,就进行更新,更新之后同样更新下key的value即可

更多可以参考Memcached类

发表评论