设为首页 收藏本站
查看: 906|回复: 0

[经验分享] PHP集群session共享

[复制链接]

尚未签到

发表于 2018-12-14 09:38:33 | 显示全部楼层 |阅读模式
  摘要:集群的概念没有多复杂,其实就是多台电脑为了同一个目标在一起工作。在Web应用中,就是多个服务器提供一个站点的服务。搭建PHP集群的第一步就是设置负载均衡。首先我们需要三台主机:Nginx负载:192.166.5.111PHP应 ...
  集群的概念没有多复杂,其实就是多台电脑为了同一个目标在一起工作。在Web应用中,就是多个服务器提供一个站点的服务。
  搭建PHP集群的第一步就是设置负载均衡。首先我们需要三台主机:
  Nginx负载:192.166.5.111
  PHP应用1:192.168.5.112
  PHP应用2:192.168.5.113
DSC0000.png

  先前,在PHP应用所在的主机,我们需要安装Nginx或者apache等这类web服务器,然后再在前面使用Nginx作为负载。Nginx负载和php应用之间的通信是在应用层的,Nginx         负载其实就相当于一个代理。但是,现在情况不同了。Fastcgi技术的应用允许在php应用层可以不用再安装web服务器。现在PHP5.5版本已经将fpm作为内部模块支持了。在这种情况下,Nginx负载和php应用之间的通信是在传输层的,二者之间使用socket进行通信。当然了,这需要fpm服务的支持。
DSC0001.png

  Nginx设置
  首先对Nginx(192.168.5.111)进行设置,编辑nginx.conf配置文件
  http{
  ……
  upstream onmpw_phpApps{
  server 192.168.18.88:9000;
  server 192.168.18.191:9000;
  }
  ……
  Server{
  listen        80;
  server_name   load.onmpw.com   ##这里是域名
  root           /www/onmpw
  ……
  location ~ \.php$ {
  root         /www/onmpw   ##这里是PHP应用所在目录
  fastcgi_pass   onmpw_phpApps;
  ……
  }
  }
  }
  以上是对Nginx进行的设置。其中只是包含了关键的部分,其余的和平常我们使用Nginx+PHP作为web服务的时候进行的设置相同。
  PHP所在主机设置
  这里的设置就比较简单了。
  首先编辑php-fpm.conf文件,修改监听的ip和端口,然后启动fpm服务
  主机192.168.5.112
  Listen = 192.168.5.112:9000   //这里的端口可以自行设置。保存退出
  # /usr/local/php/sbin/php-fpm   //开启服务
  主机192.168.5.113
  Listen = 192.168.5.113:9000
  # /usr/local/php/sbin/php-fpm
  到这里就对PHP的主机设置完成了。当然了,代码需要在两台主机上各上传一份儿。
  好了,经过上面的设置,一个基本的PHP集群就已经搭建完成了。但是有一个问题,这种情况如果只是访问静态资源或者不进行交互的话是没有问题的。如果需要交互,那就涉及到一个session共享的问题。默认情况下PHP是将session存在本地磁盘上的。那这两台主机之间如何共享session呢,接下来我们就来解决这个问题。
  PHP主机之间Session共享
  之前在网上看到过一种解决方式。由于PHP是将session存储在文件中,那我们可以在Nginx负载主机上面搭建一个分布式文件系统(NFS),让两台PHP主机的session都存放在此文件系统中。以此来达到共享session的目的。
DSC0002.jpg

  我个人比较倾向于将session存储到数据库中。因此这里我介绍的是将session存储到redis中。所以我们需要增加一台Redis服务器
  Redis服务器:192.168.5.114
DSC0003.png

  PHP默认情况下是不支持对Redis的操作的。所以这里我们需要自己手动安装第三方的扩展,使其支持对Redis的操作。关于如何使PHP支持Redis,我们可以参考《PHP操作Redis的两种方式》。
  在这里我就认为我们的PHP已经支持Redis了。接下来是将session存储到Redis中,有两种方式:一种是直接修改PHP的配置文件php.ini;另一种是重写session机制。
  修改PHP配置文件php.ini将session存储到Redis
  使用vim打开php.ini,需要修改的有这两项:session.save_handler和session.save_path。
  session.save_handler = Redis
  session.save_path = “tcp://192.168.5.114:6379”
  //Redis不需要密码验证
  session.save_path = “tcp://192.168.5.114:6379?auth=password”
  //Redis 需要密码验证
  修改完成,保存退出。然后重启php-fpm服务
  # kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
  # /usr/local/php/sbin/php-fpm
  两台PHP主机都做按照以上步骤操作。经过以上步骤,对于session的所有信息都保存到了Redis中。从而实现了session的共享。
  通过重写session机制将session存储到Redis
  通常,在很多情况下我们是没有权限修改php.ini文件的。这时候我们可以通过重写session机制来修改session信息的存储。
  对于重写session,php已经为我们提供了SessionHandlerInterface 接口。我们只要实现这个接口就可以了。关于如何重写session机制,大家可以参考《PHP重写session机制》这篇文章。并且我自己也重写了session的机制,该类的完整代码在github上,大家有兴趣的和可以点此查看。
  总结
  PHP集群的架构方式有很多种,但是其原理都大同小异。关键是找出*适合自己项目的*佳方案。例如:对于session存储方式的选择,你也可以选择使用memcache或者mysql数据库等。总之*适合自己的就是*优的。希望本文对大家有所帮助。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-651188-1-1.html 上篇帖子: yum安装php扩展模块—memcache 下篇帖子: php 5.5中php-fpm 的重启、终止操作命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表