一、LNMP+本地Session
想更好的理解这个实验,必须掌握Session与Cookie的知识
[点这里https://blog.csdn.net/ck784101777/article/details/99645675]
1.目标
通过Nginx调度器负载后端两台Web服务器
- 部署Nginx为前台调度服务器
- 调度算法设置为轮询
- 后端为两台LNMP服务器
- 部署测试页面,查看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
- [root@web2 ~]# yum -y install gcc openssl-devel pcre-devel //依赖包
- [root@web2 ~]# tar -xf nginx-1.12.2.tar.gz //解压nginx
- [root@web2 ~]# cd nginx-1.12.2
- [root@web2 nginx-1.12.2]# ./configure \
- > --with-http_ssl_module
- [root@web2 nginx-1.12.2]# make && make install
2)安装MariaDB数据库
- [root@web2 ~]# yum -y install mariadb mariadb-server mariadb-devel
3)安装php
- [root@web2 ~]# yum -y install php php-mysql
- [root@web2 ~]# yum -y install php-fpm
4)配置nginx
修改默认首页与动静分离
- [root@web2 ~]# vim /usr/local/nginx/conf/nginx.conf
- location / {
- root html;
- index index.php index.html index.htm;
- }
- 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.conf;
- }
5)启动服务
启动Nginx Php Mariadb服务
- [root@web2 ~]# systemctl stop httpd //如果安装了Apache,则关闭该服务
- [root@web2 ~]# /usr/local/nginx/sbin/nginx //启动nginx
- [root@web2 ~]# systemctl start mariadb //启动mariadb
- [root@web2 ~]# systemctl status mariadb
- [root@web2 ~]# systemctl start php-fpm //启动php-fpm
- [root@web2 ~]# systemctl status php-fpm
6)配置web1服务器
重复前5步即可
2.搭建Nginx代理服务器
1)安装Nginx
- [root@proxy ~]# yum -y install gcc pcre-devel openssl-devel
- [root@proxy ~]# tar -xf nginx-1.12.2.tar.gz
- [root@proxy ~]# cd nginx-1.12.2
- [root@proxy nginx-1.12.2]# ./configure
- [root@proxy nginx-1.12.2]# make && make install
2)修改Nginx配置文件,实现代理服务器
- [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
- .. ..
- upstream webs { //配置集群地址池
- server 192.168.2.100:80;
- server 192.168.2.200:80;
- }
- server {
- listen 80;
- server_name localhost;
- location / {
- proxy_pass http://webs; //选择调用webs地址池
- root html;
- index index.php index.html index.htm;
- }
- }
- [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload //重启服务
3.部署用于测试的php网页
1)web1虚拟机的页面部署
实验测试页面下载链接:https://pan.baidu.com/s/1zzojKaPscI6B-QlugRx8uA dd82
测试网页链接:
- [root@web1 php_scripts]# tar -xf php-memcached-demo.tar.gz //这里面有我们要的php网页
- [root@web1 php_scripts]# cd php-memcached-demo
- [root@web1 php-memcached-demo]# cp -r * /usr/local/nginx/html/ //放到这个目录下面
- [root@web1 php-memcached-demo]# ls /usr/local/nginx/html/
- home.php images index.php login.php README.md style.css //一共是这些文件
- [root@web1 ~]# firefox http://192.168.2.100/index.php //填写账户信息
- [root@web1 ~]# cd /var/lib/php/session/ //查看服务器本地的Session信息
- [root@web1 ~]# ls
- sess_ahilcq9bguot0vqsjtd84k7244 //注意这里的ID是随机的
- [root@web1 ~]# cat sess_ahilcq9bguot0vqsjtd84k7244
打开游览器,随便输入一个账号密码,然后在本地验证是否有session信息
2)web2的页面部署
web2的页面部署与web1一样,但是有个地方需要修改一下 ,修改index.php和home.php两个文件的内容,添加页面颜色属性,以区别后端两台不同的服务器:<body bgcolor=blue>。
- [root@web1 php_scripts]#vim /usr/local/nginx/html/index.php //这里面有我们要的php网页
- <body bgcolor="green"> //背景颜色修改成绿色
- [root@web2 php_scripts]#vim /usr/local/nginx/html/index.php //修改web2
- <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
- [root@proxy ~]# yum -y install memcached
- [root@proxy ~]# rpm -qa memcached
- memcached-1.4.15-10.el7_3.1.x86_64
- [root@proxy ~]# vim /etc/sysconfig/memcached //Memcached 配置文件
- PORT="11211" //端口号
- USER="memcached" //使用者用户
- MAXCONN="1024" //最大连接数1021
- CACHESIZE="64" //单条缓存大小最大为64kb
- OPTIONS=""
3.Memcached增删该查命令
要连接Memcached要装一个telnet服务
命令: add/set(添加) get(获取) replace(替换) delete(删除) append(追加)
命令格式: add 变量名 是否压缩 缓存时间(天) 字节量
add name 0 180 3
-->zhangsan # 创建一个名为张三的用户 不压缩 缓存天数180 字节量3k
- [root@proxy ~]# yum -y install telnet
- [root@proxy ~]# telnet 192.168.4.5 11211
- Trying 192.168.4.5...
- ……
- ##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
- set name 0 180 3 //定义变量,变量名称为name
- plj //输入变量的值,值为plj
- STORED
- get name //获取变量的值
- VALUE name 0 3 //输出结果
- plj
- END
- ##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
- add myname 0 180 10 //新建,myname不存在则添加,存在则报错
- set myname 0 180 10 //添加或替换变量
- replace myname 0 180 10 //替换,如果myname不存在则报错
- get myname //读取变量
- append myname 0 180 10 //向变量中追加数据
- delete myname //删除变量
- flush_all //清空所有
- quit //退出登录
4.构思Memcached在LNMP架构中的作用
从做到右以此实现:
登录验证(客户机)---->Nginx服务器(Nginx代理,Memcached缓存)---->提供php页面(web1|web2)
在上面的实验中,我们已经完成了LNMP+本地Session的实验,现在看看加入Memcached后会有什么不同
5.修改web服务器的缓存存储地址
修改web服务器的缓存存储地址修改为Nginx代理服务器的地址
1)为PHP添加memcache扩展
- [root@web1 ~]# yum -y install php-pecl-memcache
- [root@web1 ~]# systemctl restart php-fpm
2)修改PHP-FPM配置文件,并重启服务
- [root@web1 ~]# vim /etc/php-fpm.d/www.conf //修改该配置文件的两个参数
- //文件的最后2行
- 修改前效果如下:
- php_value[session.save_handler] = files
- php_value[session.save_path] = /var/lib/php/session
- //原始文件,默认定义Sessoin会话信息本地计算机(默认在/var/lib/php/session)
- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 修改后效果如下:
- php_value[session.save_handler] = memcache
- php_value[session.save_path] = "tcp://192.168.2.5:11211"
- //定义Session信息存储在公共的memcached服务器上,主机参数中为memcache(没有d)
- //通过path参数定义公共的memcached服务器在哪(服务器的IP和端口)
- [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信息