Redis实现负载均衡后会话保持

会话保持方法

1.session保存在本地  --->  nfs共享目录
2.通过程序将session写入数据库  --->  保存在磁盘
3.通过程序将session存储在redis  --->  保存在内存数据库
#session是什么?
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。

环境准备

lb03

10.0.0.5

172.16.1.5

nginx 7层负载均衡

web01

10.0.0.31

172.16.1.31

nginx+php

web02

10.0.0.32

172.16.1.32

nginx+php

db01

10.0.0.51

172.16.1.51

mariadb

redis01

10.0.0.61

172.16.1.61

redis

梳理步骤

1、lb03			部署	7层负载均衡代理 web01 web02
2、db01			部署	Mariadb 授权远程访问用户
3、web01 		部署	phpmyadmin 网站,解析本机 IP 后,访问测试
4、web02			部署	phpmyadmin 网站,从web01拷贝站点资源,解析本机 IP 后,访问测试
5、解析 10.0.0.5 php.myadmin.com 访问测试会话保持失败状态
6、redis01		部署	redis 实现 session 共享
7、访问 php.myadmin.com 测试会话保持成功状态

1、配置负载均衡

1、# 设置官方源Nginx的repo仓库再进行安装Nginx
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

yum -y install nginx

2、# 编辑Nginx配置文件
[root@lb01 ~]# vim /etc/nginx/conf.d/default.conf
upstream web {
    server 172.16.1.31:80;
    server 172.16.1.32:80;
}

server {
    listen 80;
    server_name _;
    
    location / {
        proxy_pass http://web;
        include proxy_params;
    }
}

3、# 编辑代理配置文件
[root@lb01 ~]# vim /etc/nginx/proxy_params
proxy_set_header HOST $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;

[root@lb01 ~]# systemctl restart nginx

2、db01 授权远程访问用户

1、安装mariadb
yum -y install mariadb-server

2、启动并设置开机启动
systemctl start mariadb
systemctl enable mariadb

3、设置mariadb用户root密码123456,必须启动数据库
mysqladmin -uroot password '123456'

# 为了登陆并查看到所有数据库
mysql -u root -p123456
Enter password:

MariaDB [(none)]> grant all on *.* to root@'172.16.1.%' identified by '123456';

3、web01 部署 phpmyadmin

部署 Nginx+PHP

# Nginx
yum -y install nginx
systemctl enable nginx
systemctl start nginx

# PHP
1、# 配置第三方源
cat > /etc/yum.repos.d/php.repo << EOF
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
EOF

2、# 卸载已安装低版本的php
yum remove php-mysql-5.4 php php-fpm php-common

3、# 安装PHP 7.1版本【安装会出一些问题,记住没有安装的包,重新单独安装,保存好所有安装包利于下次使用】
yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
	#上传准备好的安装包后用yum统一安装
yum -y localinstall *.rpm

4、# 配置php主配置文件
vim /etc/php.ini
upload_max_filesize = 200M		# 799行 修改上传文件大小
post_max_size = 200M			# 656行 修改请求限制大小,2个配一样

5、# 配置修改用户
vim /etc/php-fpm.d/www.conf
user = www
group = www

6、# 启动php-fpm并设置开机启动
systemctl enable php-fpm
systemctl start php-fpm

部署 phpmyadmin

# 1)下载站点安装包
mkdir -p /code
wget https://files.phpmyadmin.net/phpMyAdmin/4.9.2/phpMyAdmin-4.9.2-all-languages.zip

# 2)解压安装包
unzip -q phpMyAdmin-4.9.2-all-languages.zip
mv phpMyAdmin-4.9.2-all-languages /code/php

# 3)设置phpmyadmin连接数据库配置
cp /code/php/config.sample.inc.php /code/php/config.inc.php
vim +32 /code/php/config.inc.php
$cfg['Servers'][$i]['host'] = '172.16.1.51';

# 4)授权目录
chown -R www.www /code

# 5)配置phpmyadmin站点的nginx配置文件
vim /etc/nginx/conf.d/php.myadmin.com.conf
server {
    listen 80;
    server_name php.myadmin.com;

    location / {
        root /code/php;
        index index.php;
    }

    location ~ \.php$ {
        root /code/php;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

#给 phpmyadmin 页面增加一个填写数据库IP地址的接口
[root@web01 ~]# vim +828 /code/php/libraries/config.default.php
$cfg['AllowArbitraryServer'] = true;

# 6)修改host访问测试报错信息
	# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 php.myadmin.com
	# 访问web页面查看
php.myadmin.com

	# 访问测试-报错
phpMyAdmin - Error
Error during session start; please check your PHP and/or webserver log file and configure your PHP installation properly. Also ensure that cookies are enabled in your browser.

session_start(): open(SESSION_FILE, O_RDWR) failed: Permission denied (13)

session_start(): Failed to read session data: files (path: /var/lib/php/session)

	#页面如上报错,需要修改存储seesion目录权限
chown -R www.www /var/lib/php/session/

# 登陆正常后一定要退出

4、web02 部署 phpmyadmin

部署 Nginx+PHP

# Nginx
yum -y install nginx
systemctl enable nginx
systemctl start nginx

# PHP
1、# 配置第三方源
cat > /etc/yum.repos.d/php.repo << EOF
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
EOF

2、# 卸载已安装低版本的php
yum remove php-mysql-5.4 php php-fpm php-common

3、# 安装PHP 7.1版本【安装会出一些问题,记住没有安装的包,重新单独安装,保存好所有安装包利于下次使用】
yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
	#上传准备好的安装包后用yum统一安装
yum -y localinstall *.rpm

4、# 配置php主配置文件
vim /etc/php.ini
upload_max_filesize = 200M		# 799行 修改上传文件大小
post_max_size = 200M			# 656行 修改请求限制大小,2个配一样

5、# 配置修改用户
vim /etc/php-fpm.d/www.conf
user = www
group = www

6、# 启动php-fpm并设置开机启动
systemctl enable php-fpm
systemctl start php-fpm

部署 phpmyadmin

# web01 配置同步至 web02
[root@web01 ~]# rsync -az /code/php 172.16.1.32:/code/
[root@web01 ~]# rsync -az /etc/nginx/conf.d/php.myadmin.com.conf 172.16.1.32:/etc/nginx/conf.d/

# web02重启nginx并授权session目录
[root@web02 ~]# systemctl restart nginx
[root@web02 ~]# chown -R www.www /var/lib/php/session/


# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.32 php.myadmin.com
# 访问web页面查看
php.myadmin.com

# 登陆正常后一定要退出

5、测试会话保持

# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.5 php.myadmin.com
# 访问web页面查看
php.myadmin.com

# 登陆如果正常,请多次退出重新登陆【正常是因为之前登陆保留下的缓存】
# 再次会出现报错,这就是因为web端无法保存 session
  !Failed to set session cookie. Maybe you are using 
 HTTP instead of HTTPS to access phpMyAdmin.

6、redis01 部署 redis 实现session共享

部署 Redis

1)安装redis
yum install -y redis

2)修改redis配置文件
vim /etc/redis.conf
bind 127.0.0.1 172.16.1.61

3)启动redis
systemctl enable redis
systemctl start redis

4)配置php将session存储到redis

[root@web01 ~]# vim /etc/php-fpm.d/www.conf
# 395 行 注释掉默认将session保存到files
;php_value[session.save_handler] = files
# 396 行 注释掉默认将session保存到files的目录
;php_value[session.save_path]    = /var/lib/php/session

[root@web01 ~]# vim /etc/php.ini
# 1231行 将session保存到Redis里面
session.save_handler = redis
# 1264行 配置Redis安装的主机地址,也就是session保存的路径
session.save_path = "tcp://172.16.1.61:6379"
# 1294行 默认=0,建议不修改,或者注释掉这一条,如果等于1,有些站点会报错,如知乎、WordPress
session.auto_start = 0
#session.auto_start = on 的优点在于,任何时候都不会因忘记执行 session_start() 或 session_start() 在程序里的位置不对,而导致错误;缺点在于,如果你使用的是第三方代码,则必须删去其中的全部 session_start() 。否则将不能得到正确的结果

5)同步php配置至web02
rsync -az /etc/php-fpm.d/www.conf 172.16.1.32:/etc/php-fpm.d/
rsync -az /etc/php.ini 172.16.1.32:/etc/

6)配置完php,重启
systemctl restart php-fpm

7、测试会话保持

# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.5 php.myadmin.com
# 访问web页面查看
php.myadmin.com

# 检测session值
[root@redis01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:2e0c5f989eb5abfb378f9085cc169caf"

网页访问php.linux.com,按F12,依次点开Application>Cookies>https://php.linux.com
在右边name下面找到HTTPS对应的Value
phpMyAdmin 2e0c5f989eb5abfb378f9085cc169caf

# 通过对比可以发现 redis 中存的 session 值与 网页中存的 cookies 值相同
# 因为值相同,就可以保持会话,也就是正常访问网页了