标签归档 memcache

通过清心醉

实战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类

通过清心醉

什么环境我们才应该使用memcache

一直都有看到有提到memcache可以提高网站速度,事实真是如此?

就作者的博客来说,使用memcache把数据缓存,的确是可以减少了数据库的使用率,可是,就加载到内存的缓存数据,测试了下,打开响应时间起码慢了2秒以上,作者用的还是PHP7+Opcache,使用了memcache之后性能下降的可怕,于是不使用了memcache。

就包括现在很多的网络公司都说要熟悉memcache缓存技术,事实上真的用的上吗?

memcache最大的好处是单一网站的分布式的存储,如果日访问量过百万级别的网站,一般都会有做负载均衡来减少服务器的压力,做了负载均衡,memcache就能很好的发挥本该有的效果。数据写入内存,虽然响应一样会慢点,但起码不会导致服务器宏机。

其次,memcache配合负载均衡用来保持会话的SESSION,我们就可以用一台服务器来保存SESSION会话信息,其他的用于动静态文件的均衡处理,可以保证用户的每一次访问,SESSION会话都是在保持连接状态。

这里就还会有一个疑问,虽然作者未曾测试过:

比如自行开发的后台,使用的是SESSION的判断,假设用户登录成功之后存在$_SESSION[‘admin_user’];

如果把该信息写入memcache的话,如果一个服务器内有多个站点,都是需要该值的。

这时候访问A站生成的SESSION会话,访问B网站如果也从memcache来读取会话信息,如此一来,B站提取了合法的SESSION,就能跨站访问了;

当然,该疑问可以当作是PHP开发时的一个安全顾虑

如果只是一个服务器跑多个类型的网站,用户群体不一样,memcache不能发挥它的最大性能,更可能让你的服务器针对SESSION会话及缓存效果减少。

如果是服务器集群,一个用户登录之后可以访问服务器内的所有站点数据,那么,memcache是很理想的!

 

通过清心醉

php7添加memcached扩展

即使网站的访问量不大,memcached也能就SESSION的存储问题上做很好的处理

因为SESSION是以文件的方式存储在服务器上的,这样一样磁盘I/O负荷就是个很大的问题,哪怕文件在小,数量多了就麻烦

本文先不说SESSION的配置环境,只先说PHP7整合memcached的方法

memcached-1.4.25.tar

pecl-memcache-php7.tar

首先把pecl-memcache-php7.tar.gz和 memcached-1.4.25.tar.gz文件上传到自定义的目录内
然后解压

进入目录

[root@IPanYing home]# cd pecl-memcache-php7

执行下phpize,如果无法执行请执行完整的PHP目录,因为你的PHP没有添加到环境目录
如: /usr/local/php7/bin/phpize

[root@IPanYing pecl-memcache-php7]# phpize
Configuring for:
PHP Api Version:         20151012
Zend Module Api No:      20151012
Zend Extension Api No:   320151012

[root@IPanYing pecl-memcache-php7]# ./configure –with-php-config=/usr/local/php7/bin/php-config

[root@IPanYing pecl-memcache-php7]# make && make install

如果安装顺利会提示:
Installing shared extensions:     /usr/local/php/lib/php7/extensions/no-debug-non-zts-20151012/

修改php.ini,让PHP添加memcache扩展
[root@IPanYing pecl-memcache-php7]# echo “[memcache]” >> /etc/php.ini
[root@IPanYing pecl-memcache-php7]# echo “extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/memcache.so” >> /etc/php.ini

接下来安装个事件触发管理:
[root@IPanYing pecl-memcache-php7]# yum install -y libevent-devel

然后重启httpd和nginx

接下来安装memcached
cd memcached-1.4.25

[root@IPanYing memcached-1.4.25]# ./configure

[root@IPanYing memcached-1.4.25]# make && make install

启用memcached
[root@IPanYing memcached-1.4.25]# /usr/local/bin/memcached -d -m 256 -l 127.0.0.1 -p 7788 -u root
#256为memcached占用的内存大小,127.0.0.1为服务器的地址 7788为启用的端口,root为用户组,当然这可以使用其他的主机,负载均衡的时候再讲解

查看下是否生效:
[root@IPanYing memcached-1.4.25]# ps aux|grep memcached
root      7654  0.0  0.0 331112  1032 ?        Ssl  14:32   0:00 /usr/local/bin/memcached -d -m 256 -l 127.0.0.1 -p 7788 -u root
root      7671  0.0  0.0 103260   852 pts/0    S+   14:34   0:00 grep memcached

然后站点根目录打印phpinfo()看看

memcache

memcache support enabled
Active persistent connections 0
Version 2.2.7
Revision $Revision$

如果显示以上信息表示PHP7已经完整支持memcache了哦!
到此完成php7+memcached