LNMP架构PHP本地Session与使用memcached缓存的两种实现

一、LNMP+本地Session

想更好的理解这个实验,必须掌握Session与Cookie的知识

[点这里https://blog.csdn.net/ck784101777/article/details/99645675

1.目标

通过Nginx调度器负载后端两台Web服务器

  1. 部署Nginx为前台调度服务器
  2. 调度算法设置为轮询
  3. 后端为两台LNMP服务器
  4. 部署测试页面,查看PHP本地的Session信息

2.概念

Session:存储在服务器端,保存用户名、登陆状态等信息。

Cookies:由服务器下发给客户端,保存在客户端的一个文件里。

保存的内容主要包括:SessionID。

3.实验拓扑环境

使用4台RHEL7虚拟机,其中一台作为Nginx前端调度器服务器(eth0:192.168.4.5,eth1:192.168.2.5)、两台虚拟机部署为LNMP服务器,分别为Web1服务器(192.168.2.100)和Web2服务器(192.168.2.200),另外一台作为测试用的Linux客户机(192.168.4.10),拓扑如图-2所示

4.流程

本实验的过程是这样的,我们在客户机访问web页面并且登录,要求web服务器能在本地存储session,在下次登录时客户无需输入账号密码即可登录.

从左到右的主机以此实现一下功能: 登录操作(客户机)--------> 反向代理(Nginx代理服务器)-------> php解释器并存储session信息(web1 | web2)

 

二、平台搭建

配置之前请先设置好ip地址,并且在客户端配置好dns为Nginx代理服务器

1.Web服务器搭建

要求部署后端LNMP服务器相关软件

 1)安装Nginx

  1. [root@web2 ~]# yum -y install gcc openssl-devel pcre-devel   //依赖包
  2. [root@web2 ~]# tar -xf nginx-1.12.2.tar.gz   //解压nginx
  3. [root@web2 ~]# cd nginx-1.12.2
  4. [root@web2 nginx-1.12.2]# ./configure \
  5. > --with-http_ssl_module
  6. [root@web2 nginx-1.12.2]# make && make install

 2)安装MariaDB数据库

  1. [root@web2 ~]# yum -y install mariadb mariadb-server mariadb-devel

 3)安装php

  1. [root@web2 ~]# yum -y install php php-mysql
  2. [root@web2 ~]# yum -y install php-fpm

     4)配置nginx

     修改默认首页与动静分离

  1. [root@web2 ~]# vim /usr/local/nginx/conf/nginx.conf
  2. location / {
  3. root html;
  4. index index.php index.html index.htm;
  5. }
  6. location ~ \.php$ {
  7. root html;
  8. fastcgi_pass 127.0.0.1:9000;
  9. fastcgi_index index.php;
  10. # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  11. include fastcgi.conf;
  12. }

   5)启动服务

  启动Nginx Php Mariadb服务

  1. [root@web2 ~]# systemctl stop httpd                //如果安装了Apache,则关闭该服务
  2. [root@web2 ~]# /usr/local/nginx/sbin/nginx  //启动nginx
  3. [root@web2 ~]# systemctl start mariadb   //启动mariadb
  4. [root@web2 ~]# systemctl status mariadb
  5. [root@web2 ~]# systemctl start php-fpm         //启动php-fpm
  6. [root@web2 ~]# systemctl status php-fpm

 6)配置web1服务器

 重复前5步即可

2.搭建Nginx代理服务器

 1)安装Nginx

  1. [root@proxy ~]# yum -y install gcc pcre-devel openssl-devel
  2. [root@proxy ~]# tar -xf nginx-1.12.2.tar.gz
  3. [root@proxy ~]# cd nginx-1.12.2
  4. [root@proxy nginx-1.12.2]# ./configure
  5. [root@proxy nginx-1.12.2]# make && make install

    2)修改Nginx配置文件,实现代理服务器

  1. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  2. .. ..
  3. upstream webs {               //配置集群地址池
  4. server 192.168.2.100:80;
  5. server 192.168.2.200:80;
  6. }
  7. server {
  8. listen 80;
  9. server_name localhost;
  10. location / {
  11. proxy_pass http://webs;   //选择调用webs地址池
  12. root html;
  13. index index.php index.html index.htm;
  14. }
  15. }
  16. [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload  //重启服务

3.部署用于测试的php网页

    1)web1虚拟机的页面部署

 实验测试页面下载链接:https://pan.baidu.com/s/1zzojKaPscI6B-QlugRx8uA dd82

 测试网页链接:

  1. [root@web1 php_scripts]# tar -xf php-memcached-demo.tar.gz  //这里面有我们要的php网页
  2. [root@web1 php_scripts]# cd php-memcached-demo
  3. [root@web1 php-memcached-demo]# cp -r * /usr/local/nginx/html/  //放到这个目录下面
  4. [root@web1 php-memcached-demo]# ls  /usr/local/nginx/html/
  5. home.php  images  index.php  login.php  README.md  style.css   //一共是这些文件
     
  6. [root@web1 ~]# firefox http://192.168.2.100/index.php            //填写账户信息
  7. [root@web1 ~]# cd /var/lib/php/session/            //查看服务器本地的Session信息
  8. [root@web1 ~]# ls
  9. sess_ahilcq9bguot0vqsjtd84k7244                        //注意这里的ID是随机的
  10. [root@web1 ~]# cat sess_ahilcq9bguot0vqsjtd84k7244

打开游览器,随便输入一个账号密码,然后在本地验证是否有session信息

 

2)web2的页面部署

 web2的页面部署与web1一样,但是有个地方需要修改一下 ,修改index.php和home.php两个文件的内容,添加页面颜色属性,以区别后端两台不同的服务器:<body bgcolor=blue>。

  1. [root@web1 php_scripts]#vim /usr/local/nginx/html/index.php  //这里面有我们要的php网页
  2. <body bgcolor="green">    //背景颜色修改成绿色
  3. [root@web2 php_scripts]#vim /usr/local/nginx/html/index.php  //修改web2
  4. <body bgcolor="blue">    //背景颜色修改成蓝色

看一下访问效果,这里弄成两张颜色就是为了区分web1和web2

3)实验测试

 首先我们要弄清楚做这个实验的目的,目前我们登录这个页面会在服务器本地存储session信息,在客户端存储cookie,当我们下次登录就只需要通过cookie就可以直接登录,而不需要再次输入账号密码.但是我们这有两个服务器提供相同的页面,那么我们到底使用那个服务器呢?客户端肯定不知道,在我们的Nginx代理上,我们采用轮询的方式选择web服务器,那么问题就来了,我们第一次如果选择的是web1服务器,那我们会在web1下存储一个session,但是我们第二次去登录的时候,代理给我们提供了web2的页面,但是web2服务器上并没有存储session,那么我们又需要登录一次,如果这样的服务器有很多台,那么我们每次登录大概率都需要手动输入密码.

我们来看看实际效果,以上面为例,web1是绿色页面,web2是蓝色页面

在client客户端上测试

[root@client php_scripts]#firefox http://192.168.4.5/index.php

Nginx代理为我们提供的是蓝色页面web2,输入账号密码tom 123,输入之后点击记住cookie值

奇怪的是我们并没有登录进去,而是跳转的了web1绿色页面,我们再次输入tom 123

这次我们跳转到了显示页面,可以看到Session ID ,我们在存session的目录下看一看

[root@web1 html]# ls /var/lib/php/session/
sess_adepki3hmje5jc24nn2kvi9b43
[root@web1 html]# ls /var/lib/php/session/
sess_adepki3hmje5jc24nn2kvi9b43

  是不是看到两个两个服务器下面都有相同的sessionid值,这样就对了.但是为什么我们需要登录两次呢?因为第二台主机并不知道你再第一台主机已经登录,第一台主机的登录信息也没有传递给第二台主机,这样子就会导致信息不一致性,Nginx代理不允许这样的事情发生,所有当你试图在第一台服务器登录的时候的时候,它会在本地建立Session信息,然后将处理之后的页面先转发给Nginx代理服务器,Nginx会判断第二台主机是否也存在这个Sesion信息,若不存在,就会要求你再次登录,然后你在第二太服务器上再次输入tom 123登录,这样两台机子上的信息就一致了.这样Nginx就将处理后的页面返回给客户端.

补充:有一个点大家需要注意,思考一下,如果我第一次以tom 123登录,然后第二次以jack 123登录,也就是说两次登录的用户不一样,结果会怎么样呢?按照常理来说,我们会在第一台服务器上存储tom的session信息,在第二太服务器上存储jack的session信息,那么真的是这样吗?

答案肯定是否定的,假设服务器真的这样做了,那么问题就是我们的信息只会存储在一个服务器上,也就是说每次尝试登录的时候我们都需要碰一下运气,运气好我们可能就不需要输入账号密码了(因为们访问到了存在账户session的服务器).真实的情况是两台服务器都存储了第一次尝试登录的session信息

我们重新回到这个服务架构上来,以服务器的角度来说,我们肯定希望服务器保证数据一致性,不可能存在说服务器1上存在某条信息而服务器2不存在,因为这样对用户是极其不友好的,公司也肯定不希望这样做.那怎么办呢?我们思考两种可能性.

  1)使用Nginx自带的同步性,同步两台服务器,缺点:有多少台机器用户就需要登录几次,并且浪费服务器资源,造成冗余

  2)使用一台服务器专门存储信息,也就是说服务器上的数据存在一台服务器上

 我们试试使用第二种方式来重新做一下这个实验.

 

三、LNMP+Memcached

1.关于Memcached

     memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。

     这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

     Memcached由Danga Interactive开发,其最新版本发布于2010年,作者为Anatoly Vorobey和Brad Fitzpatrick。用于提升LiveJournal . com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。

    我们通常将Memcached用于服务器缓存数据,因为Memcached重启将清空数据,所以通常将他用作临时缓存,Memecached的使用非常简单,它使用键值对(key-value)的存储方式,没有数据结构,表结构,一个键对应一条值.

2.Memcached安装与查看配置信息

 在代理服务器上安装Memcached

  1. [root@proxy ~]# yum -y install memcached
  2. [root@proxy ~]# rpm -qa memcached
  3. memcached-1.4.15-10.el7_3.1.x86_64
  4. [root@proxy ~]# vim /etc/sysconfig/memcached       //Memcached 配置文件
  5. PORT="11211"               //端口号
  6. USER="memcached"            //使用者用户
  7. MAXCONN="1024"             //最大连接数1021
  8. CACHESIZE="64"                                             //单条缓存大小最大为64kb
  9. OPTIONS=""

3.Memcached增删该查命令

 要连接Memcached要装一个telnet服务

    命令: add/set(添加)  get(获取)  replace(替换) delete(删除) append(追加)

 命令格式:  add   变量名 是否压缩 缓存时间(天) 字节量

      add name 0 180 3

                      -->zhangsan       # 创建一个名为张三的用户 不压缩 缓存天数180 字节量3k 

  1. [root@proxy ~]# yum -y install telnet
  2. [root@proxy ~]# telnet 192.168.4.5 11211
  3. Trying 192.168.4.5...
  4. ……
  5. ##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
  6. set name 0 180 3                //定义变量,变量名称为name
  7. plj                            //输入变量的值,值为plj
  8. STORED
  9. get name                        //获取变量的值
  10. VALUE name 0 3             //输出结果
  11. plj
  12. END
  13. ##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
  14. add myname 0 180 10            //新建,myname不存在则添加,存在则报错
  15. set myname 0 180 10            //添加或替换变量
  16. replace myname 0 180 10        //替换,如果myname不存在则报错
  17. get myname                    //读取变量
  18. append myname 0 180 10        //向变量中追加数据
  19. delete myname                    //删除变量
  20. flush_all                        //清空所有
  21. quit                            //退出登录    

4.构思Memcached在LNMP架构中的作用                      

从做到右以此实现:

 登录验证(客户机)---->Nginx服务器(Nginx代理,Memcached缓存)---->提供php页面(web1|web2)

 在上面的实验中,我们已经完成了LNMP+本地Session的实验,现在看看加入Memcached后会有什么不同

5.修改web服务器的缓存存储地址

修改web服务器的缓存存储地址修改为Nginx代理服务器的地址

 1)为PHP添加memcache扩展

  1. [root@web1 ~]# yum -y install php-pecl-memcache
  2. [root@web1 ~]# systemctl restart php-fpm

    2)修改PHP-FPM配置文件,并重启服务

  1. [root@web1 ~]# vim /etc/php-fpm.d/www.conf            //修改该配置文件的两个参数
  2. //文件的最后2行
  3. 修改前效果如下:
  4. php_value[session.save_handler] = files
  5. php_value[session.save_path] = /var/lib/php/session
  6. //原始文件,默认定义Sessoin会话信息本地计算机(默认在/var/lib/php/session)
  7. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  8. 修改后效果如下:
  9. php_value[session.save_handler] = memcache
  10. php_value[session.save_path] = "tcp://192.168.2.5:11211"
  11. //定义Session信息存储在公共的memcached服务器上,主机参数中为memcache(没有d)
  12. //通过path参数定义公共的memcached服务器在哪(服务器的IP和端口)
  13. [root@web1 ~]# systemctl restart php-fpm

  3)测试

  在客户端上进行测试

   [root@web1 ~]#rm /var/lib/php/session/*  //先清空服务器缓存

           [root@web2 ~]#rm /var/lib/php/session/*

           [root@client ~]# firefox 192.168.4.5/index.php 

  输入tom 123

  

  这一次输入完密码后直接跳转到结果页面,没有向上一个实验中那样需要输入两次账号密码,说明缓存信息没有存储到web服务器上而是存储到了Nginx服务器的Memcached缓存里

如果想要验证缓存结果可以使用telnet命令get tom 查看tom的session信息

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值